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

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
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.
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.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 141277 - Última Revisão: 02/27/2014 10:23:19 - Revisão: 3.1

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbmt kbarchitecture kbctrl kbhowto KB141277 KbMtpt
Comentários