COM 事件
這個主題將提供連接點的概觀,並且介紹常用於描述 COM 事件的事件相關術語。
連接點可以建立 COM 裡面用戶端與伺服器之間的雙向通訊。 使用這種機制,COM 伺服器可以在發生某些事件時回呼用戶端。 例如,伺服器 (例如 Microsoft Internet Explorer) 可以引發事件,來向它的用戶端程式報告某種變更 (例如標題變更)。 用戶端會建立一個內部的 COM 物件,稱為事件接收 (Event Sink),準備接收內送的告知。 當用戶端收到告知時,便可執行與事件關聯的動作。
事件接收會提供介面將事件相關的方法公開給伺服器。 伺服器則是透過呼叫這些與事件相關的方法來引發事件。 用戶端會將事件接收介面實做為一般的 COM 介面。 伺服器會將介面宣告為輸出介面;COM 伺服器的作者會將 source 屬性套用至 COM 伺服器型別程式庫中的介面。 伺服器會使用事件接收介面的定義來辨識 sink 和 invoke 方法。
實作事件接收介面的 COM 用戶端常被稱為事件接收,或簡稱接收。 在下圖中,接收實作了 ISinkEvents 介面。 引發事件的伺服器被稱為來源。
連接點事件模型
事件接收介面建立之後,接收必須連接 (Wire) 到來源。 連接點機制是使用下列通訊協定將接收和來源連接在一起:
接收會向伺服器物件查詢 IConnectionPointContainer 介面。 如果這個物件支援連接點,它就會傳回一個指標。
接收會使用容器 (Container) 物件上的方法,來尋找代表特定連接點的 IConnectionPoint 介面。 由於伺服器可以支援多個輸出介面,用戶端必須用它的接收與特定連接點的介面介面識別項 (Interface Identifier,IID) 進行比對。
取得正確的連接點物件之後,接收會呼叫 IConnectionPoint::Advise,註冊它的接收介面指標。 伺服器 (來源) 會保持連接 (並對它引發事件),直到用戶端用呼叫 IConnectionPoint::Unadvise 的方式來中斷連接為止。
Visual Basic 隱藏了連接點 (Connection Point) 的大部分詳細資料;不過,您必須在用戶端的伺服器宣告中包括 WithEvents 指示詞。 在 C++ 中,用戶端程式碼必須查詢和呼叫 IConnectionPointContainer 和 IConnectionPoint 上的所有方法。 伺服器會實作這兩個介面。