IConnectionPointContainer (管理輸出介面) 的 COM 物件。IConnectionPoint 的物件,客戶端透過它建立連接。IUnknown* pUnk (Sink 的 IUnknown) 與 DWORD dwCookie (連接識別碼)。IConnectionPointContainer:列舉/尋找連接點 (EnumConnectionPoints, FindConnectionPoint)。IConnectionPoint:建立/斷開連接 (Advise, Unadvise)、列舉現有連接 (EnumConnections)。IEnumConnectionPoints:列舉容器所有連接點。IEnumConnections:列舉單一連接點上的所有連接。pUnk->QueryInterface(IID_IConnectionPointContainer, &pCPC) 取得容器介面。pCPC->FindConnectionPoint(IID_IEventSink, &pCP) 取得特定輸出介面的連接點。pCP->Advise(pSinkUnk, &dwCookie) 註冊 Sink,取得連接 Cookie。pCP->GetConnections() 取得 Sink 指標,呼叫 Sink 方法觸發事件。pCP->Unadvise(dwCookie)。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)
};
BEGIN_INTERFACE_PART 自動宣告 IUnknown 三方法,需手動轉發至外層物件的 ExternalAddRef/Release/QueryInterface。CPtrList 儲存 CONNECTDATA 陣列,Advise 產生唯一 Cookie (遞增整數) 並存入列表。QueryInterface 取得輸出介面指標)。連接點機制讓 COM 物件能主動回呼客戶端,MFC 透過介面映射與巢狀類別大幅簡化實作複雜度,是事件驅動元件開發的標準路徑。