COM_INTERFACE_ENTRY宏
這些宏會在物件的 COM 對應中輸入物件的介面,以便由 QueryInterface
存取它們。 COM 對應中專案的順序是順序介面會在 期間 QueryInterface
檢查是否有相符的 IID。
需求
標頭: atlcom.h
COM_INTERFACE_ENTRY
在 COM 介面對應中輸入介面。
語法
COM_INTERFACE_ENTRY( x )
參數
x
[in]類別物件衍生自的介面名稱。
備註
一般而言,這是您最常使用的專案類型。
範例
BEGIN_COM_MAP(CThisExample)
COM_INTERFACE_ENTRY(IThisExample)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
需求
標頭: atlcom.h
COM_INTERFACE_ENTRY2
使用此宏來厘清繼承的兩個分支。
COM_INTERFACE_ENTRY2(x, x2)
參數
x
[in]您想要從物件公開的介面名稱。
x2
[in]公開 x 之 繼承分支的名稱。
備註
例如,如果您從兩個雙重介面衍生類別物件,您可以使用 COM_INTERFACE_ENTRY2 公開 IDispatch
,因為 IDispatch
可以從其中一個介面取得。
範例
class ATL_NO_VTABLE CEntry2Example :
public CEntry2ExampleBase, // CEntry2ExampleBase derives from IDispatch
public IDispatchImpl<IEntry2Example, &IID_IEntry2Example, &LIBID_NVC_ATL_WindowingLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public CComCoClass<CEntry2Example, &CLSID_Entry2Example>
{
public:
CEntry2Example()
{
}
BEGIN_COM_MAP(CEntry2Example)
COM_INTERFACE_ENTRY(IEntry2Example)
COM_INTERFACE_ENTRY2(IDispatch, IEntry2Example)
END_COM_MAP()
};
COM_INTERFACE_ENTRY_IID
使用此宏將介面輸入 COM 對應,並指定其 IID。
COM_INTERFACE_ENTRY_IID(iid, x)
參數
Iid
[in]公開之介面的 GUID。
x
[in]類別的名稱,其 vtable 將會公開為 iid 所 識別的介面。
範例
BEGIN_COM_MAP(CExample)
COM_INTERFACE_ENTRY(IExample)
COM_INTERFACE_ENTRY_IID(IID_IDispatch, CExampleDispatch)
COM_INTERFACE_ENTRY(IExampleBase)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
COM_INTERFACE_ENTRY2_IID
與 COM_INTERFACE_ENTRY2 相同,不同之處在于您可以指定不同的 IID。
COM_INTERFACE_ENTRY2_IID(iid, x, x2)
參數
Iid
[in]您為 介面指定的 GUID。
x
[in]類別物件直接衍生自的介面名稱。
x2
[in]類別物件直接衍生自的第二個介面名稱。
COM_INTERFACE_ENTRY_AGGREGATE
當查詢 iid 所 識別的介面時,COM_INTERFACE_ENTRY_AGGREGATE會轉送至 punk 。
COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)
參數
Iid
[in]查詢介面的 GUID。
朋 克
[in]指標的名稱 IUnknown
。
備註
punk 參數假設指向匯總的內部未知或 Null,在此情況下會忽略專案。 一般而言,您會 CoCreate
在 中 FinalConstruct
匯總 。
範例
BEGIN_COM_MAP(COuter1)
COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IAgg), m_punkAgg)
END_COM_MAP()
COM_INTERFACE_ENTRY_AGGREGATE_BLIND
與 COM_INTERFACE_ENTRY_AGGREGATE 相同,不同之處在于查詢任何 IID 會導致將查詢轉送至 punk 。
COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)
參數
朋 克
[in]指標的名稱 IUnknown
。
備註
如果介面查詢失敗,COM 對應處理會繼續。
範例
BEGIN_COM_MAP(COuter2)
COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()
COM_INTERFACE_ENTRY_AUTOAGGREGATE
與 COM_INTERFACE_ENTRY_AGGREGATE 相同,除非 punk 為 Null,否則會自動建立 clsid 所描述的 匯總。
COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)
參數
Iid
[in]查詢介面的 GUID。
朋 克
[in]指標的名稱 IUnknown
。 必須是包含 COM 對應之類別的成員。
Clsid
[in]如果 punk 為 Null,將會建立之匯總的識別碼。
備註
範例
BEGIN_COM_MAP(COuter3)
COM_INTERFACE_ENTRY_AUTOAGGREGATE(__uuidof(IAutoAgg), m_punkAutoAgg, CLSID_CAutoAgg)
END_COM_MAP()
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND
與 COM_INTERFACE_ENTRY_AUTOAGGREGATE 相同,不同之處在于查詢任何 IID 會導致將查詢轉送至 punk ,如果 punk 為 Null,則會自動建立 clsid 所描述的 匯總。
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)
參數
朋 克
[in]指標的名稱 IUnknown
。 必須是包含 COM 對應之類別的成員。
Clsid
[in]如果 punk 為 Null,將會建立之匯總的識別碼。
備註
如果介面查詢失敗,COM 對應處理會繼續。
範例
BEGIN_COM_MAP(COuter4)
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(m_punkAutoAggB, CLSID_CAutoAggB)
END_COM_MAP()
COM_INTERFACE_ENTRY_BREAK
讓程式在查詢指定的介面時呼叫 DebugBreak 。
COM_INTERFACE_ENTRY_BREAK(x)
參數
x
[in]用來建構介面識別碼的文字。
備註
介面 IID 會藉由將 x 附加 至 IID_
來建構。 例如,如果 x 是 IPersistStorage
,則 IID 會是 IID_IPersistStorage
。
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF
儲存每個實例的介面特定資料。
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)
參數
Iid
[in]卸載介面的 GUID。
x
[in]實作 介面的類別名稱。
朋 克
[in]指標的名稱 IUnknown
。 必須是包含 COM 對應之類別的成員。 應該在類別物件的建構函式中初始化為 Null。
備註
如果未使用 介面,這會降低物件的整體實例大小。
範例
BEGIN_COM_MAP(COuter)
COM_INTERFACE_ENTRY(IOuter)
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_ITearOff, CTearOff, punkTearOff)
END_COM_MAP()
COM_INTERFACE_ENTRY_TEAR_OFF
公開您的卸載介面。
COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)
參數
Iid
[in]卸載介面的 GUID。
x
[in]實作 介面的類別名稱。
備註
卸載介面會實作為個別物件,每次查詢它所代表的介面時,就會具現化該物件。 一般而言,如果介面很少使用,您就會將介面建置為卸載,因為這會將 vtable 指標儲存在主要物件的每個實例中。 當參考計數變成零時,就會刪除卸載。 實作卸載的類別應該衍生自 CComTearOffObjectBase
並有自己的 COM 對應。
範例
BEGIN_COM_MAP(CBeeper)
COM_INTERFACE_ENTRY(IBeeper)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()
COM_INTERFACE_ENTRY_CHAIN
當處理到達 COM 對應中的這個專案時,處理基類的 COM 對應。
COM_INTERFACE_ENTRY_CHAIN(classname)
參數
classname
[in]目前 物件的基類。
備註
例如,在下列程式碼中:
BEGIN_COM_MAP(COuterObject)
COM_INTERFACE_ENTRY2(IDispatch, IOuterObject)
COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()
請注意,COM 對應中的第一個專案必須是包含 COM 對應之物件的介面。 因此,您無法使用 COM_INTERFACE_ENTRY_CHAIN 來啟動 COM 對應專案,這會導致在物件 COM 對應中出現COM_INTERFACE_ENTRY_CHAIN( COtherObject
) 的點 搜尋不同物件的 COM 對應。 如果您想要先搜尋另一個物件的 COM 對應,請將 的 IUnknown
介面專案新增至 COM 對應,然後鏈結另一個物件的 COM 對應。 例如:
BEGIN_COM_MAP(CThisObject)
COM_INTERFACE_ENTRY(IUnknown)
COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()
COM_INTERFACE_ENTRY_FUNC
連結至 ATL 邏輯的 QueryInterface
一般機制。
COM_INTERFACE_ENTRY_FUNC(iid, dw, func)
參數
Iid
[in]公開之介面的 GUID。
dw
[in]傳遞至 func 的參數 。
func
[in]將傳回 iid 的函式指標。
備註
如果 iid 符合查詢介面的 IID,則會呼叫 func 指定的 函式。 函式的宣告應該是:
HRESULT WINAPI func(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw);
呼叫函式時, pv
會指向您的類別物件。 riid 參數是指要查詢的介面, ppv
是函式應儲存介面指標至介面的位置指標, 而 dw 是您在專案中指定的參數。 如果函式選擇不傳回介面,函式應將 * ppv
設定為 Null,並傳回E_NOINTERFACE或S_FALSE。 E_NOINTERFACE時,COM 對應處理會終止。 使用S_FALSE時,即使未傳回介面指標,COM 地圖處理仍會繼續。 如果函式傳回介面指標,它應該會傳回S_OK。
COM_INTERFACE_ENTRY_FUNC_BLIND
與 COM_INTERFACE_ENTRY_FUNC 相同,不同之處在于查詢任何 IID 會導致呼叫 func 。
COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)
參數
dw
[in]傳遞至 func 的參數 。
func
[in]在 COM 對應中處理這個專案時呼叫的函式。
備註
任何失敗都會導致 COM 對應繼續處理。 如果函式傳回介面指標,它應該會傳回S_OK。
COM_INTERFACE_ENTRY_NOINTERFACE
傳回E_NOINTERFACE,並在查詢指定的介面時終止 COM 對應處理。
COM_INTERFACE_ENTRY_NOINTERFACE(x)
參數
x
[in]用來建構介面識別碼的文字。
備註
您可以使用這個宏來防止在特定案例中使用介面。 例如,您可以將這個宏插入 COM 對應中,再COM_INTERFACE_ENTRY_AGGREGATE_BLIND,以防止將介面的查詢轉送至匯總的內部未知。
介面 IID 會藉由將 x 附加 至 IID_
來建構。 例如,如果 x 是 IPersistStorage
,則 IID 會是 IID_IPersistStorage
。
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: