本文首先論述可連接對象和連接點機制的原理,然後通過一個示例說明怎樣用MFC編程實現可連接對象和內嵌於客戶的事件接收器.
1、可連接對象和連接點機制的基本原理
為了在組件對象和客戶之間提供更大的交互能力,組件對象也需要主動與客戶進行通信。組件對象通過出接口(Outgoing Interface)與客戶進行通信。如果一個組件對象定義了一個或者多個出接口則此組件對象叫做可連接點對象。
所謂出接口也是COM接口。每個出接口包含一組成員函數,每個成員函數代表了一個事件、一個通知或者一個請求。但是這些接口是在客戶的事件接收器(sink)中實現的,所以叫出接口。事件接收器也是COM對象。
可連接對象必須實現一個IConnectionPointContainer接口用於管理所有的出接口。每個出接口對應一個連接點對象,連接點對象實現了IConnectionPoint接口。客戶正是通過IConnectionPoint接口與可連接對象建立連接。每一個連接用CONNECTDATA結構描述。
CONNECTDATA包含兩個成員:IUnknown* pUnk和DWord dwCookie。pUnk對應於客戶中事件接收器的IUnknown接口指針;dwCookIE是由連接點對象生成的用於唯一標識此連接的32位整數。
通過一個由可連接對象實現的枚舉器接口IEnumConnectionPoints,客戶可以訪問可連接對象的所有連接點。但是要獲得IEnumConnectionPoints接口指針,要通過IConnectionPointContainer::EnumConnectionPoints(IEnumConnectionPoints**)函數,此函數返回枚舉器接口指針。
通過另一個有可連接對象實現的枚舉器接口IEnumConnections,無論客戶還是可連接對象都可以訪問一個連接點上的所有連接。通過IConnectionPoint::EnumConnections(IEnumConnections**)函數可以獲得IEnumConnections接口指針。
綜上所述,一個可連接對象必須實現四個接口:IConnectionPointContainer、IConnectionPoint、IEnumConnectionPoints、IEnumConnections。這四個接口的定義請閱讀MSDN文檔。
現在結合後面的示例簡單描述一下可連接對象和客戶通信的過程。在後面的示例中,可連接對象ConnObject定義了出接口IEventSink,對應此出接口,實現了一個連接點對象SampleConnPoint(此對象實現了對應於出接口的連接點接口IConnectionPoint,接口ID為IID_IEventSink)。
1.客戶在獲取了可連接對象的IUnknown接口指針m_pIUnknown後,調用m_pIUnknown->QueryInterface(IID_IConnectionPointContainer,(void**)&pConnPtCont);如果調用成功,pConnPtCont中將存放可連接對象的IConnectionPointContainer接口指針。如果調用不成功,則表明對象不是可連接對象。
2.調用pConnPtCont->FindConnectionPoint(IID_IEventSink,&pConnPt)。如果調用成功,pConnPt將存放對應於出接口IEventSink的連接點對象SampleConnPoint所實現的連接點接口IConnectionPoint指針;如果調用不成功,說明可連接對象不支持出接口IEventSink。
3.調用pConnPt->Advise(pIEventSink,&m_dwCookie)以建立事件接收器(EventSink)與連接點的連接。其中pIEventSink是客戶事件接收器IUnknown接口的指針,此指針通過此函數傳遞給了可連接對象以便可連接對象發起對客戶的通信;m_dwCookIE是連接標識,此值由可連接對象設置由客戶保存,客戶還要使用此值以斷開連接。
4.可連接對象可以通過連接點調用客戶事件接收器中的方法。在客戶與連接點成功建立連接後,連接點中已經保存了客戶事件接收器接口的指針並可以調用pConnPt->GetConnections()來獲取。
5.客戶調用pConnPt->Unadvise(m_dwCookIE)來取消連接,同時調用pConnPt
[1] [2] [3] [4] [5] [6] [7] 下一頁