C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ATL object destructor
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-файле и в строке
CODE
obj=null;
вызывается ~MyComObj. Может ошибка при использовании объекта? Кстати в какой среде он используется? Нужно так или иначе выполнять Release. (присвоить null, undefined ...)
GIZMO
Отправлено: 15.06.2005, 21:19


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (xim @ 15/06/2005, 18:36)
У меня деструктор зовется нормально. COM-объект зову в js-файле и в строке
CODE
obj=null;
вызывается ~MyComObj. Может ошибка при использовании объекта? Кстати в какой среде он используется? Нужно так или иначе выполнять Release. (присвоить null, undefined ...)

Пока тестирую "по месту"(в ВСВ). Заведен как мембер в форме
CODE

private: // User declarations
   TCOMIBrowserHost pBrowserHost;

строю его так:
CODE

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 try
 {
      pBrowserHost = CoBrowserHost::Create();
             ...

думал, что при разрушении формы все разрулится само-собой т.к. это смарт-поинтер. По крайней мере в примерах ВСВ так делается.

Вернуться в Технологии COM/DCOM, ActiveX