Points de connexion
Cet article explique comment implémenter des points de connexion (anciennement appelé OLE de points de connexion) à l'aide de les classes MFC CCmdTarget et CConnectionPoint.
Dans le passé, le modèle (COM) COM a défini un mécanisme général (IUnknown::QueryInterface) qui autorise des objets pour implémenter et exposer les fonctionnalités dans les interfaces.Toutefois, un mécanisme correspondant qui autorise des objets pour exposer les fonctions d'appeler les interfaces spécifiques n'a pas été défini.Autrement dit, COM définir comment les pointeurs entrants aux objets (pointeurs vers des interfaces de cet objet) ont été gérés, mais elle n'a pas eu un modèle explicite pour les interfaces sortantes (les pointeurs l'objet contient à d'autres objets des interfaces).COM possède maintenant un modèle, points de connexion appelés, qui prend en charge cette fonctionnalité.
Une connexion a deux parties : l'objet appelant l'interface, l'appel de la source, et l'objet qui implémente l'interface, ont appelé récepteur.Un point de connexion est l'interface exposée par la source.En exposant un point de connexion, une source permet aux récepteurs pour établir des connexions à elle-même (source).Via le mécanisme de point de connexion (l'interface d' IConnectionPoint ), un pointeur vers l'interface du récepteur est passé à l'objet source.Ce pointeur fournit à la source de l'accès à l'implémentation du récepteur d'un ensemble de fonctions membres.Par exemple, pour déclencher un événement implémenté par le récepteur, la source peut appeler la méthode appropriée de l'implémentation du récepteur.L'illustration suivante montre le point de connexion simplement décrit.
Un point de connexion implémenté
MFC implémente ce modèle dans les classes de CConnectionPoint et de CCmdTarget .Les classes dérivées de CConnectionPoint implémentent l'interface d' IConnectionPoint , utilisée pour exposer des points de connexion à d'autres objets.Les classes dérivées d' CCmdTarget implémentent l'interface d' IConnectionPointContainer , qui peut énumérer tous les points de connexion disponibles d'un objet ou rencontre un point de connexion spécifique.
Pour chaque point de connexion implémenté dans votre classe, vous devez déclarer une partie de connexion qui implémente le point de connexion.Si vous implémentez un ou plusieurs points de connexion, vous devez également déclarer une carte de connexions unique dans votre classe.Une carte de connexions est un tableau de points de connexion pris en charge par le contrôle ActiveX.
Les exemples suivants montrent une carte de connexions simple et un point de connexion.Le premier exemple déclare le mappage de plug-ins et le point ; le deuxième exemple implémente le mappage et pointez sur.Notez qu' CMyClassdoit être CCmdTargetclasse dérivée de.Dans le premier exemple, le code est inséré dans la déclaration de classe, sous la section de protected :
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 et les macros d' END_CONNECTION_PART déclarez une classe incorporée, XSampleConnPt (dérivé d' CConnectionPoint), qui implémente ce point de connexion particulier.Si vous souhaitez remplacer les fonctions membres d' CConnectionPoint ou ajouter des fonctions membres de votre choix, déclarez ceux-ci entre ces deux macros.Par exemple, la macro d' CONNECTION_IID substitue la fonction membre d' CConnectionPoint::GetIID une fois placée entre ces deux macros.
Dans le deuxième exemple, le code est inséré dans le fichier d'implémentation du contrôle (fichier .cpp).Ce code implémente le mappage de connexions, qui inclut le point de connexion, SampleConnPt:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
Si votre classe dispose de plusieurs points de connexion, insérez les macros supplémentaires d' CONNECTION_PART entre BEGIN_CONNECTION_MAP et les macros d' END_CONNECTION_MAP .
Enfin, ajoutez un appel à EnableConnections dans le constructeur de la classe.Par exemple :
CMyClass::CMyClass()
{
EnableConnections();
}
Une fois que ce code a été inséré, votre CCmdTarget- la classe dérivée expose un point de connexion pour l'interface d' ISampleSink .l'illustration suivante montre cet exemple.
Un point de connexion implémenté avec MFC
Généralement, les points de connexion prennent en charge la « multicasting " » — la capacité de diffuser à plusieurs récepteurs connectés au même interface.Le fragment de code suivant montre comment parcourir les multicast en itérant au sein de chaque récepteur sur un point de connexion :
void CMyClass::CallSinkFunc()
{
POSITION pos = m_xSampleConnPt.GetStartPosition();
ISampleSink* pSampleSink;
while( pos != NULL )
{
pSampleSink = (ISampleSink*)(m_xSampleConnPt.GetNextConnection(pos));
if(pSampleSink != NULL)
pSampleSink->SinkFunc();
}
}
Cet exemple récupère le jeu actuel de connexions sur le point de connexion d' SampleConnPt avec un appel à CConnectionPoint::GetConnections.Puis il itère les connexions et appelle ISampleSink::SinkFunc sur chaque connexion active.