Como forçar uma interface numa aplicação MFC utilizando 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

141277
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Nota Visual C++ NET da Microsoft (2002) suportados ambos os o modelo de código gerido que é fornecido pelo .NET Framework e do Windows nativo não gerido modelo de código. As informações contidas neste artigo aplicam-se para o Visual C++ não gerido apenas de código.

Nota Microsoft Visual C++ 2005 suportados ambos os o modelo de código gerido que é fornecido pelo .NET Framework e do Windows nativo não gerido modelo de código.
Sumário
Numa aplicação MFC, pode substituir as interfaces existentes numa classe, bem como fornecer interfaces adicionais. Substituir uma interface neste caso é sinónimo de substituir uma interface. O exemplo neste artigo mostra como substituir uma interface numa classe preservando a implementação de interface original, de modo que pode ser delegada pela implementação de interface de novo.

Este artigo não lidar com substituir a implementação de IDispatch como este é um caso especial. Para obter mais informações sobre como substituir IDispatch no MFC da, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
140616Implementação de IDispatch MFC substituir
Mais Informação
Os seguintes passos irão substituir o IOleObject implementação para um controlo OLE gerado pelo Assistente de controlo predefinido.

  1. Para adicionar a declaração da implementação IOleObject ao controlo, adicionar o seguinte código ao ficheiro de cabeçalho para a classe 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();						
    Isto adiciona uma classe aninhada XMyOleObject para a classe de controlo. Tenha em atenção que estas macros declarar métodos de interface, incluindo métodos de interface IUnknown, por isso tem de implementar os métodos de IUnknown.
  2. Adicione a interface IOleObject ao mapa de interface para o controlo, adicionando uma macro INTERFACE_PART o ficheiro de implementação para o controlo:
          BEGIN_INTERFACE_MAP(CIOleOverCtrl, COleControl)         INTERFACE_PART(CIOleOverCtrl, IID_IOleObject, MyOleObject)      END_INTERFACE_MAP()						
    CIOleOverCtrl substituir com o nome do controlo e MyOleObject com o nome que escolheu para a classe aninhada que suporta IOleObject.
  3. Implemente os métodos de interface que declarou. Adicione o seguinte código ao ficheiro de implementação para o controlo:
          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 );      }      ...
Os restantes métodos siga o mesmo padrão onde CIOleOverCtrl é o nome do controlo, XMyOleObject é o nome da classe aninhada que suporta IOleObject e m_xMyOleObject é calculado por remover a que a interface a ser suportadas e adicionar m_x.

Tenha em atenção que estes métodos passam simplesmente a chamada em IOleObject original implementação. No entanto, não é um requisito; pode adicionar funcionalidades e delegar a implementação original ou delegado não de todo.
Referências
Notas técnicas 38 # e # 39.

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 141277 - Última Revisão: 03/01/2014 07:17:08 - Revisão: 3.1

  • Microsoft Foundation Class Library 4.2
  • kbnosurvey kbarchive kbmt kbarchitecture kbctrl kbhowto KB141277 KbMtpt
Esta informação foi útil?