共用方式為


支援 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_MAPEND_SINK_MAPSINK_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 物件的獨特本質,此程式在實作之間會因細節和執行而有所不同。 這些詳細數據超出本主題的範圍,因此不會加以解決。

另請參閱

ATL COM 物件的基本概念