Partager via


Points de connexion

Cet article explique comment implémenter des points de connexion (anciennement appelés points de connexion OLE) à l’aide des classes CCmdTarget MFC et CConnectionPoint.

Dans le passé, le modèle objet de composant (COM) a défini un mécanisme général (IUnknown::QueryInterface*) qui permettait aux objets d’implémenter et d’exposer des fonctionnalités dans les interfaces. Toutefois, un mécanisme correspondant qui permettait aux objets d’exposer leur capacité d’appeler des interfaces spécifiques n’a pas été défini. Autrement dit, COM a défini la façon dont les pointeurs entrants vers les objets (pointeurs vers les interfaces de cet objet) ont été gérés, mais il n’avait pas de modèle explicite pour les interfaces sortantes (pointeurs que l’objet contient vers les interfaces d’autres objets). COM dispose désormais d’un modèle, appelé points de connexion, qui prend en charge cette fonctionnalité.

Une connexion comporte deux parties : l’objet appelant l’interface, appelé source, et l’objet implémentant l’interface, 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 d’établir des connexions lui-même (la source). Par le biais du mécanisme de point de connexion (l’interface IConnectionPoint ), un pointeur vers l’interface récepteur est transmis à l’objet source. Ce pointeur fournit à la source 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. La figure suivante illustre le point de connexion décrit simplement.

Diagramme montrant un point de connexion implémenté.
Point de connexion implémenté

MFC implémente ce modèle dans les classes CConnectionPoint et CCmdTarget . Les classes dérivées de l’implémentation de CConnectionPoint l’interface IConnectionPoint , utilisées pour exposer des points de connexion à d’autres objets. Les classes dérivées de l’implémentation de CCmdTarget l’interface IConnectionPointContainer , qui peuvent énumérer tous les points de connexion disponibles d’un objet ou rechercher 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 un mappage de connexion unique dans votre classe. Une carte de connexion est une table des points de connexion pris en charge par le contrôle ActiveX.

Les exemples suivants illustrent une carte de connexion simple et un point de connexion. Le premier exemple déclare la carte de connexion et le point ; le deuxième exemple implémente la carte et le point. Notez qu’il doit s’agir CMyClass d’une CCmdTargetclasse dérivée. Dans le premier exemple, le code est inséré dans la déclaration de classe, sous la protected section :

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()

Les macros BEGIN_CONNECTION_PART et END_CONNECTION_PART déclarent une classe incorporée ( XSampleConnPt dérivée de CConnectionPoint), qui implémente ce point de connexion particulier. Si vous souhaitez remplacer toutes CConnectionPoint les fonctions membres ou ajouter des fonctions membres de votre choix, déclarez-les entre ces deux macros. Par exemple, la CONNECTION_IID macro remplace la CConnectionPoint::GetIID fonction membre lorsqu’elle est 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 la carte de connexion, qui inclut le point de connexion : SampleConnPt

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

Si votre classe a plusieurs points de connexion, insérez des macros CONNECTION_PART supplémentaires entre les macros BEGIN_CONNECTION_MAP et END_CONNECTION_MAP .

Enfin, ajoutez un appel au EnableConnections constructeur de la classe. Par exemple:

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

Une fois ce code inséré, votre CCmdTargetclasse dérivée expose un point de connexion pour l’interface ISampleSink . La figure suivante illustre cet exemple:

Diagramme montrant un point de connexion implémenté à l’aide de MFC.
Un point de connexion implémenté avec MFC

En règle générale, les points de connexion prennent en charge la « multidiffusion » : la possibilité de diffuser sur plusieurs récepteurs connectés à la même interface. L’exemple de fragment suivant montre comment multidiffusion en itérant à travers 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 l’ensemble actuel de connexions sur le SampleConnPt point de connexion avec un appel à CConnectionPoint::GetConnections. Il effectue ensuite une itération via les connexions et appelle ISampleSink::SinkFunc chaque connexion active.

Voir aussi

MFC COM