共用方式為


CComTearOffObject 類別

這個類別會實作卸除介面。

語法

template<class Base>
class CComTearOffObject : public Base

參數

Base
您的卸除類別,衍生自 CComTearOffObjectBase ,以及您希望卸除物件支援的介面。

ATL 會在兩個階段中實作其卸除介面: CComTearOffObjectBase 方法會處理參考計數和 QueryInterface,同時 CComTearOffObject 實作 IUnknown

成員

公用建構函式

名稱 描述
CComTearOffObject::CComTearOffObject 建構函式。
CComTearOffObject::~CComTearOffObject 解構函式。

公用方法

名稱 描述
CComTearOffObject::AddRef 遞增 對象的參考計數 CComTearOffObject
CComTearOffObject::QueryInterface 傳回您卸除類別或擁有者類別上所要求介面的指標。
CComTearOffObject::Release 遞減 對象的參考計數 CComTearOffObject ,並終結它。

CComTearOffObjectBase 方法

函式 描述
CComTearOffObjectBase 建構函式。

CComTearOffObjectBase 數據成員

數據成員 描述
m_pOwner 衍生自擁有者類別的指標 CComObject

備註

CComTearOffObject 實作卸除介面做為個別物件,只有在查詢該介面時才會具現化。 當參考計數變成零時,就會刪除卸除。 一般而言,您會為很少使用的介面建置卸除介面,因為使用卸除會在主物件的所有實例中儲存 vtable 指標。

您應該衍生類別,以實作卸除物件 CComTearOffObjectBase ,以及從您希望卸除物件支援的介面。 CComTearOffObjectBase 會在擁有者類別和線程模型上範本化。 擁有者類別是正在實作卸除的物件類別。 如果您未指定線程模型,則會使用預設線程模型。

您應該為卸除類別建立 COM 對應。 當 ATL 具現化卸除時,它會建立 CComTearOffObject<CYourTearOffClass>CComCachedTearOffObject<CYourTearOffClass>

例如,在 BEEPER 範例中,類別 CBeeper2 是卸除類別,而 類別 CBeeper 是擁有者類別:

class CBeeper2 :
   public ISupportErrorInfo,
   public CComTearOffObjectBase<CBeeper>
{
public:
   CBeeper2() {}
   STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
   {
      return (InlineIsEqualGUID(IID_IBeeper, riid)) ? S_OK : S_FALSE;
   }

BEGIN_COM_MAP(CBeeper2)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
};

class ATL_NO_VTABLE CBeeper :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CBeeper, &CLSID_Beeper>,
   public IDispatchImpl<IBeeper, &IID_IBeeper, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   CBeeper()
   {
   }

DECLARE_REGISTRY_RESOURCEID(IDR_BEEPER)

DECLARE_NOT_AGGREGATABLE(CBeeper)

BEGIN_COM_MAP(CBeeper)
   COM_INTERFACE_ENTRY(IBeeper)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()

// ISupportsErrorInfo
   STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);


   DECLARE_PROTECT_FINAL_CONSTRUCT()

   HRESULT FinalConstruct()
   {
      return S_OK;
   }

   void FinalRelease()
   {
   }

public:

};

繼承階層架構

Base

CComTearOffObject

需求

標頭: atlcom.h

CComTearOffObject::AddRef

將對象的參考計數 CComTearOffObject 遞增一個。

STDMETHOD_(ULONG, AddRef)();

傳回值

對於診斷和測試而言可能很有用的值。

CComTearOffObject::CComTearOffObject

建構函式。

CComTearOffObject(void* pv);

參數

光伏
[in]將轉換成 物件指標的 CComObject<Owner> 指標。

備註

將擁有者的參考計數遞增一個。

CComTearOffObject::~CComTearOffObject

解構函式。

~CComTearOffObject();

備註

釋放所有已配置的資源、呼叫 FinalRelease,並遞減模組鎖定計數。

CComTearOffObject::CComTearOffObjectBase

建構函式。

CComTearOffObjectBase();

備註

m_pOwner 成員初始化為 NULL。

CComTearOffObject::m_pOwner

衍生自 OwnerCComObject 物件的指標。

CComObject<Owner>* m_pOwner;

參數

負責人
[in]正在實作卸除的類別。

備註

在建構期間,指標會初始化為 NULL。

CComTearOffObject::QueryInterface

擷取所要求介面的指標。

STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);

參數

iid
[in]所要求介面的 IID。

ppvObject
[out]iid識別之介面指標的指標,如果找不到介面,則為 NULL。

傳回值

標準 HRESULT 值。

備註

先查詢卸除類別上的介面。 如果介面不存在,請在擁有者對象上查詢介面。 如果要求的介面是 IUnknown,則會傳 IUnknown 回擁有者的 。

CComTearOffObject::Release

將參考計數遞減一,如果參考計數為零,則會 CComTearOffObject刪除 。

STDMETHOD_ULONG Release();

傳回值

在非偵錯組建中,一律會傳回零。 在偵錯組建中,傳回可能對診斷或測試很有用的值。

另請參閱

CComCachedTearOffObject 類別
類別概觀