事件處理原則
所有事件處理共有三個步驟。 您將需要:
在您的對象上實作事件介面。
建議您的物件想要接收事件的事件來源。
當您的物件不再需要接收事件時,請取消加入事件來源。
您將實作事件介面的方式將取決於其類型。 事件介面可以是 vtable、dual 或 dispinterface。 由事件來源的設計工具決定,以定義 介面;實作該介面由您決定。
注意
雖然沒有事件介面不可為雙重的技術原因,但有許多良好的設計理由可避免使用雙重。 不過,這是事件 來源設計工具/實作者所做的決策。 由於您正從事件 sink
的觀點著手,因此您必須允許您可能沒有任何選擇,但要實作雙重事件介面的可能性。 如需雙重介面的詳細資訊,請參閱 雙重介面和 ATL。
建議事件來源可分成三個步驟:
查詢 IConnectionPointContainer 的來源物件。
呼叫 IConnectionPointContainer::FindConnectionPoint ,傳遞您感興趣的事件介面 IID。 如果成功,這會傳回 連接點物件上的 IConnectionPoint 介面。
呼叫 IConnectionPoint::建議 傳遞
IUnknown
事件接收的 。 如果成功,這會傳回DWORD
代表連線的Cookie。
成功註冊您接收事件的興趣之後,系統會根據來源物件所引發的事件呼叫物件事件介面上的方法。 當您不再需要接收事件時,可以透過 IConnectionPoint::Unadvise 將 Cookie 傳回連接點。 這會中斷來源和接收之間的連線。
請小心避免在處理事件時參考迴圈。