GIZMO |
Отправлено: 14.06.2005, 09:42 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
Создаю СОМ объект мастером. По умолчанию он мне генерит конструктор типа
CODE |
public:
TBrowserHostImpl();
|
завожу свой деструктор, но такое ощющение, что он не вызывается? Где тогда освобождать ресурсы?
|
|
xim |
Отправлено: 14.06.2005, 15:41 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
Покажи объявление класса. |
|
GIZMO |
Отправлено: 15.06.2005, 08:32 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (xim @ 14/06/2005, 15:41) | Покажи объявление класса. |
CODE |
// BROWSERHOST.H : Declaration of the TBrowserHost
#ifndef BrowserHostH
#define BrowserHostH
#include <exdisp.h>
#include <exdispid.h>
#include <mshtmhst.h>
#include <mshtmdid.h>
#include <memory>
#include "WBCmdGroup.h"
#include "SCProc.h"
#include "BrowserX_TLB.H"
/////////////////////////////////////////////////////////////////////////////
// TBrowserXConImpl Implements IBrowserHost, default interface of BrowserHost
// and IBrowserHostEvents, the default source interface
// ThreadingModel : Apartment
// Dual Interface : TRUE
// Event Support : TRUE
// Default ProgID : BrowserX.BrowserHost
// Description : Host for WebBrowser Control
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE TBrowserHost :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<TBrowserHost, &CLSID_BrowserHost>,
public IConnectionPointContainerImpl<TBrowserHost>,
public TEvents_BrowserHost<TBrowserHost>,
public IDispatchImpl<IBrowserHost, &IID_IBrowserHost, &LIBID_BrowserX>,
public IOleClientSite,
public IOleInPlaceSite,
public IDocHostUIHandler,
public IDocHostShowUI,
public ISupportErrorInfo
{
public:
TBrowserHost();
// Data used when registering Object
//
DECLARE_THREADING_MODEL(otApartment);
DECLARE_PROGID("BrowserX.BrowserHost");
DECLARE_DESCRIPTION("Host for WebBrowser Control");
// Function invoked to (un)register object
//
static HRESULT WINAPI UpdateRegistry(BOOL bRegister)
{
TTypedComServerRegistrarT<TBrowserHost>
regObj(GetObjectCLSID(), GetProgID(), GetDescription());
return regObj.UpdateRegistry(bRegister);
}
BEGIN_COM_MAP(TBrowserHost)
COM_INTERFACE_ENTRY(IBrowserHost)
COM_INTERFACE_ENTRY2(IDispatch, IBrowserHost)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IOleClientSite)
COM_INTERFACE_ENTRY(IOleWindow)
COM_INTERFACE_ENTRY(IOleInPlaceSite)
COM_INTERFACE_ENTRY(IDocHostUIHandler)
COM_INTERFACE_ENTRY(IDocHostShowUI)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(TBrowserHost)
CONNECTION_POINT_ENTRY(DIID_IBrowserHostEvents)
END_CONNECTION_POINT_MAP()
protected:
BOOL m_bEnableCtxMenus;
DWORD m_dwDLControl;
DWORD m_dwCookie;
DWORD m_dwDocHostUIFlags;
BOOL m_bInPlaceActive;
BOOL m_bAtlBrowserHelp;
HWND m_hWnd;
std::auto_ptr<TSCProc> m_pSCProc;
CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser;
CComQIPtr<IOleInPlaceObject, &IID_IOleInPlaceObject> m_spInPlaceObject;
CComQIPtr<IOleCommandTarget, &IID_IOleCommandTarget> m_spOleCmdTarg;
// IDispatch
private:
…
// IBrowserHost
public:
…
// IWebBrowser2
…
// ISupportErrorInfo
…
protected:
// IDocHostUIHandler
…
// IDocHostShowUI
private:
…
private:
// IOleClientSite
…
private:
// IOleWindow
…
private:
// IOleInPlaceSite
…
};
#endif //BrowserHostH
|
|
|
GIZMO |
Отправлено: 15.06.2005, 08:39 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
... забыл деструктор вставить
CODE |
public:
TBrowserHost();
~TBrowserHost();
|
так было когда он не хотел вызываться, щас вставил вместо него:
CODE |
//in h
std::auto_ptr<TSCProc> m_pSCProc;
//in cpp
TBrowserHost::TBrowserHost() :
m_bEnableCtxMenus(TRUE),
m_dwDLControl(DLCTL_DLIMAGES|DLCTL_VIDEOS|DLCTL_BGSOUNDS),
m_dwCookie((DWORD)0),
m_dwDocHostUIFlags((DWORD)0),
m_bInPlaceActive(FALSE),
m_bAtlBrowserHelp(TRUE)
{
std::auto_ptr<TSCProc> pSCProc(new TSCProc(NULL, this));
m_pSCProc = pSCProc;
|
|
|
xim |
Отправлено: 15.06.2005, 18:36 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
У меня деструктор зовется нормально. COM-объект зову в js-файле и в строке вызывается ~MyComObj. Может ошибка при использовании объекта? Кстати в какой среде он используется? Нужно так или иначе выполнять Release. (присвоить null, undefined ...) |
|
GIZMO |
Отправлено: 15.06.2005, 21:19 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (xim @ 15/06/2005, 18:36) | У меня деструктор зовется нормально. COM-объект зову в js-файле и в строке вызывается ~MyComObj. Может ошибка при использовании объекта? Кстати в какой среде он используется? Нужно так или иначе выполнять Release. (присвоить null, undefined ...) |
Пока тестирую "по месту"(в ВСВ). Заведен как мембер в форме
CODE |
private: // User declarations
TCOMIBrowserHost pBrowserHost;
|
строю его так:
CODE |
void __fastcall TForm1::FormCreate(TObject *Sender)
{
try
{
pBrowserHost = CoBrowserHost::Create();
...
|
думал, что при разрушении формы все разрулится само-собой т.к. это смарт-поинтер. По крайней мере в примерах ВСВ так делается.
|
|