連接對應
OLE 控制件能夠向其他應用程式公開介面。 這些介面只允許從容器存取該控制件。 如果 OLE 控制項想要存取其他 OLE 物件的外部介面,則必須建立連接點。 此連接點允許控制外部分派地圖的傳出存取,例如事件對應或通知函式。
Microsoft基礎類別庫提供支援連接點的程序設計模型。 在此模型中,「連接對應」可用來指定 OLE 控制件的介面或連接點。 連接對應包含每個連接點的一個巨集。 如需連線對應的詳細資訊,請參閱 類別 CConnectionPoint
。
一般而言,控件只支援兩個連接點:一個用於事件,一個用於屬性通知。 這些是由 COleControl
基類實作,而且控件寫入器不需要額外的工作。 您必須手動新增您想要在類別中實作的任何其他連接點。 為了支援連線對應和點,MFC 提供下列宏:
連接對應宣告和分界
名稱 | 描述 |
---|---|
BEGIN_CONNECTION_PART |
宣告實作其他連接點的內嵌類別(必須在類別宣告中使用)。 |
END_CONNECTION_PART |
結束連接點的宣告(必須在類別宣告中使用)。 |
CONNECTION_IID |
指定控制項連接點的介面識別碼。 |
DECLARE_CONNECTION_MAP |
宣告連接對應將用於類別(必須在類別宣告中使用)。 |
BEGIN_CONNECTION_MAP |
開始連接對應的定義(必須在類別實作中使用)。 |
END_CONNECTION_MAP |
結束連接對應的定義(必須在類別實作中使用)。 |
CONNECTION_PART |
指定控制項連接對應中的連接點。 |
下列函式可協助接收使用連接點建立和中斷連線:
連接點的初始化/終止
名稱 | 描述 |
---|---|
AfxConnectionAdvise |
建立來源與接收之間的連線。 |
AfxConnectionUnadvise |
中斷來源與接收之間的連線。 |
BEGIN_CONNECTION_PART
BEGIN_CONNECTION_PART
使用巨集開始定義事件和屬性通知連接點以外的其他連接點。
BEGIN_CONNECTION_PART(theClass, localClass)
參數
theClass
指定連接點為的控制項類別名稱。
localClass
指定實作連接點的本機類別名稱。
備註
在定義類別成員函式的宣告 (.h
) 檔案中,使用 BEGIN_CONNECTION_PART
巨集 啟動連接點。 然後新增 CONNECTION_IID
巨集和您想要實作的任何其他成員函式。 最後,使用 END_CONNECTION_PART
巨集完成連接點對應。
需求
頁眉 afxdisp.h
END_CONNECTION_PART
結束連接點的宣告。
END_CONNECTION_PART(localClass)
參數
localClass
指定實作連接點之區域類別的名稱。
需求
頁眉 afxdisp.h
CONNECTION_IID
在和 END_CONNECTION_PART
宏之間BEGIN_CONNECTION_PART
,使用 來定義 OLE 控制項所支援連接點的介面識別碼。
CONNECTION_IID(iid)
參數
iid
連接點所呼叫介面的介面 ID。
備註
自 iid
變數是介面標識碼,用來識別連接點在其連接的接收上呼叫的介面。 例如:
CONNECTION_IID(IID_ISampleSink)
指定呼叫 介面的連接 ISinkInterface
點。
需求
頁眉 afxdisp.h
DECLARE_CONNECTION_MAP
程式中的每個 COleControl
衍生類別都可以提供一個連接對應,用於指定您的控制項所支援的其他連接點。
DECLARE_CONNECTION_MAP()
備註
如果您的控件支援其他點,請使用 DECLARE_CONNECTION_MAP
類別宣告結尾的 巨集。 然後,在定義 類別成員函式的 .cpp 檔案中,使用 BEGIN_CONNECTION_MAP
巨集、 CONNECTION_PART
控件每個連接點的宏,以及 END_CONNECTION_MAP
宣告連接對應結尾的巨集。
需求
頁眉 afxdisp.h
BEGIN_CONNECTION_MAP
程式中每個 COleControl
衍生類別可以提供連接對應,以指定控制項支援的連接點。
BEGIN_CONNECTION_MAP(theClass, theBase)
參數
theClass
指定連接對應之控制項類別的名稱。
theBase
指定的基類 theClass
名稱。
備註
在定義類別成員函式的實作 (.CPP
) 檔案中,使用 BEGIN_CONNECTION_MAP
巨集 啟動連接對應,然後使用 巨集 為每個連接點 CONNECTION_PART
新增巨集專案。 最後,使用 END_CONNECTION_MAP
巨集完成連線對應。
需求
頁眉 afxdisp.h
END_CONNECTION_MAP
結束連接對應的定義。
END_CONNECTION_MAP()
需求
頁眉 afxdisp.h
CONNECTION_PART
將 OLE 控制件的連接點對應至特定介面識別碼。
CONNECTION_PART(theClass, iid, localClass)
參數
theClass
指定連接點為的控制項類別名稱。
iid
連接點所呼叫介面的介面 ID。
localClass
指定實作連接點之區域類別的名稱。
備註
例如:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
使用呼叫 IID_ISinkInterface
介面的連接點,實作連接對應。
需求
頁眉 afxdisp.h
AfxConnectionAdvise
呼叫此函式,以在 所 pUnkSrc
指定的來源與 所 pUnkSink
指定的接收之間建立連接。
BOOL AFXAPI AfxConnectionAdvise(
LPUNKNOWN pUnkSrc,
REFIID iid,
LPUNKNOWN pUnkSink,
BOOL bRefCount,
DWORD FAR* pdwCookie);
參數
pUnkSrc
呼叫 介面之 物件的指標。
pUnkSink
實作 介面之 物件的指標。
iid
連接的介面識別碼。
bRefCount
對於跨進程連線,此參數必須是 TRUE
,並指出建立連接應該會導致的參考計數 pUnkSink
遞增。
針對進程內連線, TRUE
表示建立連線應該會導致的參考計數 pUnkSink
遞增。 FALSE
表示不應該遞增參考計數。
警告:一般而言,無法預測哪些連線正在處理,以及哪些連線不在進程,因此建議一律將此參數設定為 TRUE
。
pdwCookie
傳回連接標識碼之的指標 DWORD
。 當中斷連線時, dwCookie
這個值應該當做 參數傳遞至 AfxConnectionUnadvise
。
傳回值
如果已建立連接,則為非零;否則為 0。
範例
//CMySink is a CCmdTarget-derived class supporting automation.
//Instantiate the sink class.
CMySink mysink;
//Get a pointer to sink's IUnknown, no AddRef done.
IID iid = IID_IUnknown;
IUnknown* pUnkSink = mysink.GetInterface(&iid);
//Establish a connection between source and sink.
//pUnkSrc is IUnknown of server obtained by CoCreateInstance().
//dwCookie is a cookie identifying the connection, and is needed
//to terminate this connection.
AfxConnectionAdvise(pUnkSrc, IID_ISampleSink, pUnkSink, FALSE, &dwCookie);
需求
標頭: afxctl.h
AfxConnectionUnadvise
呼叫此函式,以中斷由 所pUnkSrc
指定之來源與 接收之間的連接。pUnkSink
BOOL AFXAPI AfxConnectionUnadvise(
LPUNKNOWN pUnkSrc,
REFIID iid,
LPUNKNOWN pUnkSink,
BOOL bRefCount,
DWORD dwCookie);
參數
pUnkSrc
呼叫 介面之 物件的指標。
pUnkSink
實作 介面之 物件的指標。
iid
連接點介面的介面標識碼。
bRefCount
對於跨進程連線,此參數必須是 TRUE
,並指出建立連接應該會導致的參考計數 pUnkSink
遞減。
針對進程內連線, TRUE
表示建立連線應該會導致的參考計數 pUnkSink
遞減。 FALSE
表示不應該遞減參考計數。
警告:一般而言,無法預測哪些連線正在處理,以及哪些連線不在進程,因此建議一律將此參數設定為 TRUE
。
dwCookie
所 AfxConnectionAdvise
傳回的連接標識碼。
傳回值
如果連線已中斷連線,則為非零;否則為 0。
範例
//mysink is a CCmdTarget-derived class supporting automation.
//Get a pointer to sink's IUnknown, no AddRef done.
IID iid = IID_IUnknown;
IUnknown* pUnkSink = mysink.GetInterface(&iid);
//Terminate a connection between source and sink.
//pUnkSrc is IUnknown of server obtained by CoCreateInstance().
//dwCookie is a value obtained through AfxConnectionAdvise().
AfxConnectionUnadvise(pUnkSrc, IID_ISampleSink, pUnkSink, FALSE, dwCookie);
需求
標頭: afxctl.h