Cómo reemplazar una interfaz en una aplicación MFC mediante Visual C++

Seleccione idioma Seleccione idioma
Id. de artículo: 141277 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Nota Visual C++ (2002) NET admitía ambos el modelo de código administrado proporcionado por .NET Framework y el no administrado nativo de Windows modelo de código. La información de este artículo se aplica a Visual C++ no administrado sólo código.

Nota Microsoft Visual C++ 2005 admitía ambos el modelo de código administrado proporcionado por .NET Framework y el no administrado nativo de Windows modelo de código.
Expandir todo | Contraer todo

Resumen

En una aplicación MFC, puede reemplazar las interfaces existentes en una clase, así como proporcionar interfaces adicionales. Reemplazar una interfaz en este caso es sinónimo de reemplazar una interfaz. En el ejemplo de este artículo se muestra cómo reemplazar una interfaz en una clase conservando la implementación original de la interfaz, por lo que puede delegarse a la nueva implementación de interfaz.

En este artículo no tratar reemplazar la implementación de IDispatch, ya que es un caso especial. Para obtener más información acerca de cómo reemplazar IDispatch en MFC, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
140616Reemplazar la implementación de MFC IDispatch

Más información

Los pasos siguientes reemplazará la IOleObject implementación para una control OLE generadas por el Asistente para controles de manera predeterminada.

  1. Para agregar la declaración de la implementación de IOleObject al control, agregue el código siguiente al archivo de encabezado de la clase derivada de 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();
    						
    se agrega una clase anidada XMyOleObject a la clase control. Tener en cuenta que estas macros declaran métodos de interfaz incluidos los métodos de interfaz IUnknown, por lo que debe implementar también los métodos IUnknown.
  2. Agregar la interfaz IOleObject al mapa de interfaz para el control, agregando una macro INTERFACE_PART al archivo de implementación para el control:
          BEGIN_INTERFACE_MAP(CIOleOverCtrl, COleControl)
             INTERFACE_PART(CIOleOverCtrl, IID_IOleObject, MyOleObject)
          END_INTERFACE_MAP()
    						
    CIOleOverCtrl reemplazar con el nombre del control y MyOleObject el nombre elegido para la clase anidada que admita IOleObject.
  3. Implementar los métodos de interfaz que se ha declarado. Agregue el código siguiente al archivo de implementación para el control:
          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 );
          }
          ...
El resto de los métodos siguen el mismo patrón donde CIOleOverCtrl es el nombre del control, XMyOleObject es el nombre de la clase anidada que admita IOleObject y m_xMyOleObject se calcula mediante eliminación de la interfaz está m_x compatibles y agregar.

Observe que estos métodos simplemente pasan la llamada en el original IOleObject implementación. Sin embargo, no es un requisito; puede agregar funcionalidad y delegar la implementación original o no delegado en absoluto.

Referencias

Notas técnicas 38 # y # 39.

Propiedades

Id. de artículo: 141277 - Última revisión: sábado, 01 de marzo de 2014 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard
    • Microsoft Visual C++ .NET 2003 Standard
    • Microsoft Visual C++ 2005 Express Edition
Palabras clave: 
kbnosurvey kbarchive kbmt kbarchitecture kbctrl kbhowto KB141277 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 141277

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