Como substituir uma interface em um aplicativo MFC usando o Visual C++

Traduções deste artigo Traduções deste artigo
ID do artigo: 141277 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Observação Microsoft Visual C++ NET (2002) com suporte tanto o modelo de código gerenciado que é fornecido pelo .NET Framework e do Windows nativo não gerenciado modelo de código. As informações contidas neste artigo se aplicam ao Visual C++ não gerenciado somente de código.

Observação Microsoft Visual C++ 2005 suporte tanto o modelo de código gerenciado que é fornecido pelo .NET Framework e do Windows nativo não gerenciado modelo de código.
Expandir tudo | Recolher tudo

Sumário

Em um aplicativo MFC, você pode substituir interfaces existentes em uma classe, bem como fornecer interfaces adicionais. Nesse caso substituir uma interface é sinônimo de substituição de uma interface. O exemplo neste artigo ilustra como substituir uma interface em uma classe preservando a implementação de interface original para que podem ser delegada para a implementação de interface do novo.

Este artigo não lidar com substituindo a implementação de IDispatch, como isso é um caso especial. Para obter mais informações sobre como substituir IDispatch no MFC, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
140616Substituindo a implementação de IDispatch do MFC

Mais Informações

As etapas a seguir substituirá o IOleObject implementação para um controle OLE gerado pelo Assistente de controle padrão.

  1. Para adicionar a declaração de implementação IOleObject para o controle, adicione o código a seguir ao arquivo de cabeçalho para a classe derivada 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();
    						
    isso adiciona uma classe aninhada XMyOleObject à sua classe de controle. Observe que essas macros declarar métodos de interface, incluindo métodos de interface IUnknown, portanto, você deve implementar os métodos de IUnknown.
  2. Adicionar interface IOleObject para o mapa de interface para o controle adicionando uma macro INTERFACE_PART o arquivo de implementação para o controle:
          BEGIN_INTERFACE_MAP(CIOleOverCtrl, COleControl)
             INTERFACE_PART(CIOleOverCtrl, IID_IOleObject, MyOleObject)
          END_INTERFACE_MAP()
    						
    CIOleOverCtrl substituir com o nome do controle e MyOleObject com o nome escolhido para a classe aninhada que oferece suporte a IOleObject.
  3. Implementar os métodos de interface que você declarado. Adicione o seguinte código ao arquivo de implementação para o controle:
          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 );
          }
          ...
O restante dos métodos seguem o mesmo onde CIOleOverCtrl é o nome do controle, XMyOleObject é o nome da classe aninhada que ofereça suporte a IOleObject e m_xMyOleObject é calculado pela removendo o I de interface que está sendo m_x adicionando e com suporte.

Observe que esses métodos simplesmente passam a chamada para IOleObject original implementação. No entanto, isso não é um requisito; você pode adicionar funcionalidade e delegar para a implementação original ou não representante em todos os.

Referências

Notas técnicas 38 # e # 39.

Propriedades

ID do artigo: 141277 - Última revisão: quinta-feira, 27 de fevereiro de 2014 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes 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 Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
    • Microsoft Visual C++ 2005 Express Edition
Palavras-chave: 
kbnosurvey kbarchive kbmt kbarchitecture kbctrl kbhowto KB141277 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 141277

Submeter comentários

 

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