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
衍生自 Owner 之 CComObject 物件的指標。
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();
傳回值
在非偵錯組建中,一律會傳回零。 在偵錯組建中,傳回可能對診斷或測試很有用的值。