Comment substituer une interface dans une application MFC à l'aide de Visual C++

Traductions disponibles Traductions disponibles
Numéro d'article: 141277 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Remarque Microsoft Visual C++ NET (2002) pris en charge le modèle de code managé qui est fourni par le .NET Framework et le Windows natif non managé modèle de code. Les informations contenues dans cet article s'appliquent à Visual C++ non managé code uniquement.

Remarque Microsoft Visual C++ 2005 pris en charge le modèle de code managé qui est fourni par le .NET Framework et le Windows natif non managé modèle de code.
Agrandir tout | Réduire tout

Résumé

Dans une application MFC, vous pouvez substituer les interfaces existantes dans une classe ainsi que fournir des interfaces supplémentaires. Substitution d'une interface dans ce cas est synonyme de remplacement d'une interface. L'exemple dans cet article illustre comment substituer une interface dans une classe tout en préservant l'implémentation d'interface d'origine afin qu'elle peut être déléguée à par la nouvelle implémentation d'interface.

Cet article ne traite pas substituer l'implémentation de IDispatch, car il s'agit d'un cas spécial. Pour plus d'informations sur la façon de substituer IDispatch dans MFC, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
140616Remplacer l'implémentation de IDispatch de MFC

Plus d'informations

Les étapes suivantes remplacera le IOleObject implémentation pour un contrôle OLE généré par l'Assistant contrôle par défaut.

  1. Pour ajouter la déclaration de l'implémentation IOleObject au contrôle, ajoutez le code suivant au fichier d'en-tête pour la classe dérivée COleControl :
          // Interface Maps
          protected:
               // IOleObject
               BEGIN_INTERFACE_PART(MyOleObject, IOleObject)
                   INIT_INTERFACE_PART(CIOleOverCtrl, MyOleObject)
                   STDMETHOD(SetClientSite)(LPOLECLIENTSITE);
                   STDMETHOD(GetClientSite)(LPOLECLIENTSITE*);
                   STDMETHOD(SetHostNames)(LPCOLESTR, LPCOLESTR);
                   STDMETHOD(Close)(DWORD);
                   STDMETHOD(SetMoniker)(DWORD, LPMONIKER);
                   STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
                   STDMETHOD(InitFromData)(LPDATAOBJECT, BOOL, DWORD);
                   STDMETHOD(GetClipboardData)(DWORD, LPDATAOBJECT*);
                   STDMETHOD(DoVerb)(LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND,
                           LPCRECT);
                   STDMETHOD(EnumVerbs)(IEnumOLEVERB**);
                   STDMETHOD(Update)();
                   STDMETHOD(IsUpToDate)();
                   STDMETHOD(GetUserClassID)(CLSID*);
                   STDMETHOD(GetUserType)(DWORD, LPOLESTR*);
                   STDMETHOD(SetExtent)(DWORD, LPSIZEL);
                   STDMETHOD(GetExtent)(DWORD, LPSIZEL);
                   STDMETHOD(Advise)(LPADVISESINK, LPDWORD);
                   STDMETHOD(Unadvise)(DWORD);
                   STDMETHOD(EnumAdvise)(LPENUMSTATDATA*);
                   STDMETHOD(GetMiscStatus)(DWORD, LPDWORD);
                   STDMETHOD(SetColorScheme)(LPLOGPALETTE);
               END_INTERFACE_PART(MyOleObject)
    
          DECLARE_INTERFACE_MAP();
    						
    Ceci ajoute une classe imbriquée XMyOleObject à votre classe de contrôle. Notez que ces macros déclarer des méthodes d'interface, y compris les méthodes d'interface IUnknown, afin que vous devez implémenter les méthodes IUnknown ainsi.
  2. Ajouter l'interface IOleObject à la table d'interface pour le contrôle en ajoutant une macro INTERFACE_PART pour le fichier d'implémentation pour le contrôle :
          BEGIN_INTERFACE_MAP(CIOleOverCtrl, COleControl)
             INTERFACE_PART(CIOleOverCtrl, IID_IOleObject, MyOleObject)
          END_INTERFACE_MAP()
    						
    CIOleOverCtrl remplacer avec le nom de votre contrôle et MyOleObject avec le nom que vous avez choisi pour la classe imbriquée qui prend en charge IOleObject.
  3. Implémentez les méthodes d'interface que vous avez déclaré. Ajoutez le code suivant pour le fichier d'implémentation pour le contrôle :
          STDMETHODIMP_(ULONG) CIOleOverCtrl::XMyOleObject::AddRef()
          {
              METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
              ASSERT_VALID(pThis);
    
              return pThis->m_xOleObject.AddRef();
          }
    
          STDMETHODIMP_(ULONG) CIOleOverCtrl::XMyOleObject::Release()
          {
              METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
              ASSERT_VALID(pThis);
    
              return pThis->m_xOleObject.Release ();
          }
    
          STDMETHODIMP CIOleOverCtrl::XMyOleObject::QueryInterface(
              REFIID iid, LPVOID far* ppvObj)
          {
              METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
              ASSERT_VALID(pThis);
    
              return pThis->m_xOleObject.QueryInterface ( iid,  ppvObj);
          }
    
          STDMETHODIMP
          CIOleOverCtrl::XMyOleObject::SetClientSite(LPOLECLIENTSITE
          pClientSite)
          {
              METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
                 ASSERT_VALID(pThis);
    
              return pThis->m_xOleObject.SetClientSite ( pClientSite );
          }
          ...
Le reste des méthodes suivent le même modèle où CIOleOverCtrl est le nom du contrôle, XMyOleObject est le nom de la classe imbriquée qui prend en charge IOleObject et m_xMyOleObject est calculée en la supprimant de l'interface en cours m_x prises en charge et ajout.

Notez que ces méthodes passent simplement l'appel à l'origine IOleObject implémentation. Toutefois, il s'agit pas d'une exigence ; vous pouvez ajouter des fonctionnalités et la déléguer à la mise en ?uvre originale ou du délégué, pas du tout.

Références

Notes techniques 38 # et # 39.

Propriétés

Numéro d'article: 141277 - Dernière mise à jour: jeudi 27 février 2014 - Version: 3.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Foundation Class Library 4.2 sur le système suivant
    • Microsoft Visual C++ 2.0 Édition Professionnelle
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Édition Standard
    • Microsoft Visual C++ 5.0 Édition Entreprise
    • Microsoft Visual C++ 6.0 Édition Entreprise
    • Microsoft Visual C++ 5.0 Édition Professionnelle
    • Microsoft Visual C++ 6.0 Édition Professionnelle
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Initiation
    • Microsoft Visual C++ .NET 2003 Initiation
    • Microsoft Visual C++ 2005 Express Edition
Mots-clés : 
kbnosurvey kbarchive kbmt kbarchitecture kbctrl kbhowto KB141277 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 141277
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com