分享方式:


COM_INTERFACE_ENTRY宏

這些宏會在物件的 COM 對應中輸入物件的介面,以便由 QueryInterface 存取它們。 COM 對應中專案的順序是順序介面會在 期間 QueryInterface 檢查是否有相符的 IID。

Macro 描述
COM_INTERFACE_ENTRY 在 COM 介面對應中輸入介面。
COM_INTERFACE_ENTRY2 使用此宏來厘清繼承的兩個分支。
COM_INTERFACE_ENTRY_IID 使用此宏將介面輸入 COM 對應,並指定其 IID。
COM_INTERFACE_ENTRY2_IID COM_INTERFACE_ENTRY2 相同,不同之處在于您可以指定不同的 IID。
COM_INTERFACE_ENTRY_AGGREGATE 當查詢 iid 所 識別的介面時, COM_INTERFACE_ENTRY_AGGREGATE 會轉送至 punk
COM_INTERFACE_ENTRY_AGGREGATE_BLIND COM_INTERFACE_ENTRY_AGGREGATE 相同,不同之處在于查詢任何 IID 會導致將查詢轉送至 punk
COM_INTERFACE_ENTRY_AUTOAGGREGATE COM_INTERFACE_ENTRY_AGGREGATE 相同,除非 punk 為 Null,否則會自動建立 clsid 所描述的 匯總。
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND COM_INTERFACE_ENTRY_AUTOAGGREGATE 相同,不同之處在于查詢任何 IID 會導致將查詢轉送至 punk ,如果 punk 為 Null,則會自動建立 clsid 所描述的 匯總。
COM_INTERFACE_ENTRY_BREAK 讓程式在查詢指定的介面時呼叫 DebugBreak
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF 儲存每個實例的介面特定資料。
COM_INTERFACE_ENTRY_TEAR_OFF 公開您的卸載介面。
COM_INTERFACE_ENTRY_CHAIN 當處理到達 COM 對應中的這個專案時,處理基類的 COM 對應。
COM_INTERFACE_ENTRY_FUNC 連結至 ATL 邏輯的 QueryInterface 一般機制。
COM_INTERFACE_ENTRY_FUNC_BLIND COM_INTERFACE_ENTRY_FUNC 相同,不同之處在于查詢任何 IID 會導致呼叫 func
COM_INTERFACE_ENTRY_NOINTERFACE 傳回E_NOINTERFACE,並在查詢指定的介面時終止 COM 對應處理。

需求

標頭: 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