共用方式為


連接點

這篇文章說明如何實作連接點 (先前稱為 OLE 的連接點) 使用 MFC 類別CCmdTargetCConnectionPoint

在過去,元件物件模型 (COM) 所定義的一般機制 (IUnknown::QueryInterface),使物件實作,並公開 (expose) 介面中的功能。 不過,沒有定義使物件公開其呼叫特定介面能力的對應機制。 也就是,COM 物件只定義如何連入指標 (該物件的介面指標) 處理,但其中並不包含輸出介面 (物件保存至其他物件介面指標) 的外顯模型。 現在 COM 已的模型,稱為連接點的支援這項功能。

連接包含兩個部分: 呼叫介面,稱為來源,以及實作的介面之物件的物件呼叫接收。 連接點是來源所公開的介面。 藉由公開連接點,來源會允許接收建立與其 (來源) 的連線。 透過連接點機制 ( IConnectionPoint 介面),將接收介面指標會傳遞給來源物件。 這個指標提供來源存取接收實作一組的成員函式。 例如,若要引發接收所實作的事件,來源可以呼叫接收實作的適當的方法。 下圖示範連接點只是所述。

實作的連接點

實作的連接點

MFC 實作這種模型在 CConnectionPointCCmdTarget 類別。 類別衍生自 CConnectionPoint 實作 IConnectionPoint 用來公開 (expose) 至其他物件的連接點的介面。 類別衍生自CCmdTarget實作 IConnectionPointContainer 介面可以列舉所有物件的可用的連接點,或尋找特定的連接點。

每個連接點類別所實作的您必須宣告實作連接點的連接部分。 如果您實作一個或多個連接點,您也必須在類別中宣告一個單一連接對應。 連接對應是 ActiveX 控制項支援的連接點的表格。

下列範例將示範簡單的連接對應及一個連接點。 第一個範例宣告了連接對應及點; 第二個範例會實作地圖,以及點。 請注意, CMyClass 必須是CCmdTarget-衍生的類別。 在第一個範例中,會插入程式碼在類別宣告中,在受保護的一節:

class CMyClass : public CCmdTarget
{
protected:
   // Connection point for ISample interface
    BEGIN_CONNECTION_PART(CMyClass, SampleConnPt)
        CONNECTION_IID(IID_ISampleSink)
    END_CONNECTION_PART(SampleConnPt)

    DECLARE_CONNECTION_MAP()

BEGIN_CONNECTION_PARTEND_CONNECTION_PART 巨集宣告內嵌的類別, XSampleConnPt (衍生自CConnectionPoint) 以外,實作這個特定的連接點。 如果您想要覆寫任何CConnectionPoint成員函式或加入自己的成員函式,宣告這些物件之間這些兩個巨集。 例如, CONNECTION_IID巨集就會覆寫CConnectionPoint::GetIID成員函式時位於下列兩個巨集。

在第二個範例中,控制項的實作檔 (.cpp 檔案) 會插入程式碼。 這段程式碼會實作連接對應,其中包含連接點, SampleConnPt:

BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
    CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()

如果您的類別有一個以上的連接點,插入其他CONNECTION_PART之間的巨集BEGIN_CONNECTION_MAPEND_CONNECTION_MAP巨集。

最後,加入呼叫EnableConnections類別的建構函式中。 例如:

CMyClass::CMyClass()
{
   EnableConnections();
}

在插入這段程式碼之後, 您CCmdTarget-在衍生的類別公開 (expose) 的連接點 ISampleSink 介面。 下圖說明這個範例。

以 MFC 實作連接點

連接點實作 MFC

通常,連接點支援 「 多點傳送 」 — 廣播給多個面盆,能夠連接到相同的介面。 下列範例中的部分將示範如何可藉由逐一查看每一個連接點上接收多點傳送:

void CMyClass::CallSinkFunc()
{
    POSITION pos = m_xSampleConnPt.GetStartPosition();
    ISampleSink* pSampleSink;
    while( pos != NULL )
    {
        pSampleSink = (ISampleSink*)(m_xSampleConnPt.GetNextConnection(pos));
        if(pSampleSink != NULL)
            pSampleSink->SinkFunc();
    }
}

本範例擷取目前連接集合上SampleConnPt有一個呼叫的連接點CConnectionPoint::GetConnections。 它然後逐一連接並呼叫 ISampleSink::SinkFunc 上每個使用中的連接。

請參閱

概念

MFC COM