Body připojení
Tento článek vysvětluje, jak implementovat body připojení (dříve známá jako body připojení OLE) pomocí tříd knihovny MFC CCmdTarget a CConnectionPoint.
V minulosti modelu COM (Component Object) definována obecný mechanismus (IUnknown::QueryInterface), objekty pro provádění a funkcionalitu v rozhraní povoleny.Však nebyl definován odpovídající mechanismus, který mohou vystavit jejich schopnosti k volání rozhraní specifické objekty.COM, definice jak příchozí odkazy na objekty byly zpracovány (ukazatele na rozhraní objektu), ale nemá explicitní model pro odchozí rozhraní (ukazatele objekt obsahuje jiné objekty rozhraní).COM má nyní model, nazývané spojovací body, který tuto funkci podporuje.
Připojení má dvě části: objekt voláním rozhraní s názvem zdroje a objekt implementující rozhraní, nazývané jímka.Spojovací bod je rozhraní ve zdroji.Vystavením bod připojení umožňuje zdroj umyvadel při navazování připojení k samotné (zdroj).Prostřednictvím připojení bodu mechanismus ( IConnectionPoint rozhraní), ukazatel rozhraní jímky je předán zdrojového objektu.Tento ukazatel poskytuje zdroj s přístupem umyvadlo implementace členské funkce sady.Požární události implementované jímka, zdroj můžete volat, vhodný způsob provádění jímky.Následující obrázek znázorňuje připojení bod právě popsány.
Implementovaný bod připojení
Knihovna MFC implementuje tento model CConnectionPoint a třídy CCmdTarget třídy.Třídy odvozené z CConnectionPoint provedení IConnectionPoint rozhraní, umožňující zobrazit body připojení k jiným objektům.Třídy odvozené z CCmdTarget provedení IConnectionPointContainer rozhraní, které můžete vytvořit výčet všech bodů pro připojení k objektu nebo najít určitý spojovací bod.
Pro každý bod připojení implementována ve vaší třídě je třeba deklarovat připojení součást, která implementuje spojovací bod.Pokud se rozhodnete implementovat body připojení jednoho nebo více, musí také deklarovat mapování jednoho připojení ve vaší třídě.Mapa připojení je tabulka spojovací body, které jsou podporovány ovládacím prvkem ActiveX.
Následující příklady ukazují jednoduché připojení mapy a jeden spojovací bod.V prvním příkladu deklaruje připojení mapy a bod; Druhý příklad implementuje mapy a bod.Všimněte si, že CMyClass musí být CCmdTarget-odvozené třídy.V prvním příkladu kód je vložen v deklaraci třídy v oblasti chráněny oddílu:
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_PART a END_CONNECTION_PART makra deklarovat třídu vloženého XSampleConnPt (odvozené z CConnectionPoint), že implementuje tento konkrétní spojovací bod.Pokud chcete potlačit jakýkoli CConnectionPoint členských funkcí nebo přidání členské funkce vlastní, je deklarovat mezi tyto dvě makra.Například CONNECTION_IID přepíše makro CConnectionPoint::GetIID členské funkce při umístění mezi tyto dvě makra.
V druhém příkladu se kód vloží do implementačního souboru ovládacího prvku (soubor CPP).Tento kód implementuje připojení mapa, která obsahuje spojovací bod, SampleConnPt:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
Pokud vaše třída má více než jedno připojení bodu, vložit další CONNECTION_PART mezi BEGIN_CONNECTION_MAP a END_CONNECTION_MAP makra.
Nakonec přidejte volání EnableConnections v konstruktoru třídy.Příklad:
CMyClass::CMyClass()
{
EnableConnections();
}
Po vložení tohoto kódu do CCmdTarget-odvozená třída zpřístupňuje bod připojení pro ISampleSink rozhraní.Následující obrázek ukazuje tento příklad.
Bod připojení provedeny s knihovnou MFC
Obvykle podporují spojovací body "vysílání" – schopnost vysílat pro více umyvadel připojen ke stejné rozhraní.Následující příklad fragment ukazuje jak vícesměrového vysílání pomocí iterace Každá jímka na spojovací bod:
void CMyClass::CallSinkFunc()
{
POSITION pos = m_xSampleConnPt.GetStartPosition();
ISampleSink* pSampleSink;
while( pos != NULL )
{
pSampleSink = (ISampleSink*)(m_xSampleConnPt.GetNextConnection(pos));
if(pSampleSink != NULL)
pSampleSink->SinkFunc();
}
}
Tento příklad načte aktuální sadu připojení na SampleConnPt bod připojení pomocí volání CConnectionPoint::GetConnections.To pak prochází připojení a volání ISampleSink::SinkFunc na každý aktivní připojení.