首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

COM 可連接物件與連接點機制原理及 MFC 實作

     編輯:VC 教學

核心概念

  • 可連接物件:實作 IConnectionPointContainer (管理輸出介面) 的 COM 物件。
  • 輸出介面:定義事件/通知/請求方法的介面,實作於**客戶端**的事件接收器 (Sink) 中。
  • 連接點:每個輸出介面對應一個實作 IConnectionPoint 的物件,客戶端透過它建立連接。
  • CONNECTDATA:描述單一連接,含 IUnknown* pUnk (Sink 的 IUnknown) 與 DWORD dwCookie (連接識別碼)。

四大必要介面

  1. IConnectionPointContainer:列舉/尋找連接點 (EnumConnectionPoints, FindConnectionPoint)。
  2. IConnectionPoint:建立/斷開連接 (Advise, Unadvise)、列舉現有連接 (EnumConnections)。
  3. IEnumConnectionPoints:列舉容器所有連接點。
  4. IEnumConnections:列舉單一連接點上的所有連接。

客戶端連接流程

  1. pUnk->QueryInterface(IID_IConnectionPointContainer, &pCPC) 取得容器介面。
  2. pCPC->FindConnectionPoint(IID_IEventSink, &pCP) 取得特定輸出介面的連接點。
  3. pCP->Advise(pSinkUnk, &dwCookie) 註冊 Sink,取得連接 Cookie。
  4. 物件內部透過 pCP->GetConnections() 取得 Sink 指標,呼叫 Sink 方法觸發事件。
  5. 斷開:pCP->Unadvise(dwCookie)。

MFC 實作範例架構

可連接物件類別

class CConnObject : public CCmdTarget {
    DECLARE_INTERFACE_MAP()
    BEGIN_INTERFACE_PART(ConnPtContainer, IConnectionPointContainer)
        STDMETHOD(EnumConnectionPoints)(IEnumConnectionPoints**);
        STDMETHOD(FindConnectionPoint)(REFIID, IConnectionPoint**);
    END_INTERFACE_PART(ConnPtContainer)

    // 連接點類別 (巢狀)
    class CSampleConnPoint : public CCmdTarget {
        DECLARE_INTERFACE_MAP()
        BEGIN_INTERFACE_PART(ConnPt, IConnectionPoint)
            STDMETHOD(GetConnectionInterface)(IID*);
            STDMETHOD(GetConnectionPointContainer)(IConnectionPointContainer**);
            STDMETHOD(Advise)(IUnknown*, DWORD*);
            STDMETHOD(Unadvise)(DWORD);
            STDMETHOD(EnumConnections)(IEnumConnections**);
        END_INTERFACE_PART(ConnPt)
    };
    // ... 實作 EnumConnectionPoints 回傳 CSampleConnPoint 列舉器
};

客戶端事件接收器

class CEventSink : public CCmdTarget {
    DECLARE_INTERFACE_MAP()
    BEGIN_INTERFACE_PART(EventSink, IEventSink)
        STDMETHOD(OnEvent1)(LONG param);
        STDMETHOD(OnEvent2)(BSTR msg);
    END_INTERFACE_PART(EventSink)
};

關鍵實作細節

  • MFC 以巢狀類別實作介面,BEGIN_INTERFACE_PART 自動宣告 IUnknown 三方法,需手動轉發至外層物件的 ExternalAddRef/Release/QueryInterface。
  • 連接點內部維護 CPtrList 儲存 CONNECTDATA 陣列,Advise 產生唯一 Cookie (遞增整數) 並存入列表。
  • 觸發事件時遍歷列表,對每個 Sink 呼叫對應方法 (需 QueryInterface 取得輸出介面指標)。

結語

連接點機制讓 COM 物件能主動回呼客戶端,MFC 透過介面映射與巢狀類別大幅簡化實作複雜度,是事件驅動元件開發的標準路徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved