支援 IDispEventImpl
範本類別 IDispEventImpl 可用來支援 ATL 類別中的連接點接收。 連接點接收可讓您的類別處理從外部 COM 對象引發的事件。 這些連接點接收會對應至類別所提供的事件接收對應。
若要正確實作類別的連接點接收,必須完成下列步驟:
匯入每個外部物件的類型連結庫
IDispEventImpl
宣告介面宣告事件接收對應
建議並取消整合連接點
實作連接點接收所涉及的步驟全都是藉由修改 類別的頭檔 (.h) 來完成。
匯入類型連結庫
對於您想要處理其事件的每個外部物件,您必須匯入類型連結庫。 此步驟會定義可以處理的事件,並提供宣告事件接收對應時所使用的資訊。 #import 指示詞可用來完成這項作業。 為每個分派介面新增必要的 #import
指示詞行,您將支援至 類別的頭檔 (.h) 。
下列範例會匯入外部 COM 伺服器的類型庫 (MSCAL.Calendar.7
):
#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only
注意
針對您將支援的每個外部類型連結庫,您必須有個別 #import
的語句。
宣告 IDispEventImpl 介面
既然您已匯入每個分派介面的類型連結庫,您必須為每個外部分派介面宣告個別 IDispEventImpl
的介面。 新增 IDispEventImpl
每個外部物件的介面宣告,以修改 類別的宣告。 如需參數的詳細資訊,請參閱 IDispEventImpl。
下列程式代碼會針對 類別所CMyCompositCtrl2
實作的 COM 物件,針對 DCalendarEvents
介面宣告兩個連接點接收:
public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>
宣告事件接收對應
為了讓事件通知由適當的函式處理,您的類別必須將每個事件路由至其正確的處理程式。 這是藉由宣告事件接收對應來達成。
ATL 提供數個巨集、 BEGIN_SINK_MAP、 END_SINK_MAP和 SINK_ENTRY_EX,讓此對應更容易。 標準格式如下所示:
BEGIN_SINK_MAP(comClass)
SINK_ENTRY_EX(id, iid, dispid, func)
. . . //additional external event entries
END_SINK_MAP()
下列範例會宣告具有兩個事件處理程式的事件接收對應:
BEGIN_SINK_MAP(CMyCompositCtrl2)
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY_EX(IDC_CALENDAR1, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar1)
SINK_ENTRY_EX(IDC_CALENDAR2, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar2)
END_SINK_MAP()
實作幾乎已完成。 最後一個步驟涉及外部介面的建議與不受限制。
建議和取消 IDispEventImpl 介面
最後一個步驟是實作方法,以在適當的時間建議(或取消整合)所有連接點。 必須先進行這項建議,才能進行外部客戶端與對象之間的通訊。 在對象變成可見之前,系統會針對傳出介面查詢物件所支援的每個外部分派介面。 建立連接,並使用傳出介面的參考來處理來自物件的事件。 此程式稱為「建議」。
當您的物件完成外部介面之後,傳出介面應該會通知您類別不再使用它們。 此程式稱為「無法復原」。
由於 COM 物件的獨特本質,此程式在實作之間會因細節和執行而有所不同。 這些詳細數據超出本主題的範圍,因此不會加以解決。