Como agregar a um objeto COM ATL

Traduções deste artigo Traduções deste artigo
ID do artigo: 173823 - Exibir os produtos aos quais esse artigo se aplica.
Observação Microsoft Visual C++ .NET (2002) oferece suporte o modelo de código gerenciado que é fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado. As informações neste artigo se aplicam somente ao código do Visual C++ não gerenciado.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

As etapas a seguintes demonstram como agregar um COM o objeto em um projeto ATL:
  1. Adicionar um ponteiro IUnknown ao objeto de classe e inicializá-lo como NULL no construtor.
  2. Adicione a macro DECLARE_PROTECT_FINAL_CONSTRUCT para proteger o objeto seja excluído se (durante FinalConstruct) o objeto agregado interno incrementa a contagem de referência e decrementa a contagem a 0.

    Observação : se você estiver usando o Visual C++ .NET o assistente adiciona isso para você.
  3. Use o ponteiro IUnknown definido como o segundo parâmetro para as macros COM_INTERFACE_ENTRY_AGGREGATE. O primeiro parâmetro é o IID da interface do objeto interno que você deseja expor.
  4. Substitua FinalConstruct() para criar a agregação.
  5. Substituir FinalRelease() para liberar o IUnknown ponteiro.

Mais Informações

Se você usa e liberar uma interface de agregação durante FinalConstruct, você deve adicionar a macro DECLARE_PROTECT_FINAL_CONSTRUCT a definição de seu objeto de classe.

Eis aqui um exemplo com todas as quatro etapas feitas na definição de classe. Este é um objeto simples, COutObj, que agrega a outro objeto simples, CInnObj.

Código de exemplo

   class ATL_NO_VTABLE COutObj :
         public CComObjectRootEx<CComSingleThreadModel>,
         public CComCoClass<COutObj, &CLSID_OutObj>,
         public IDispatchImpl<IOutObj, &IID_IOutObj, &LIBID_OUTEROBJLib>
   {
   public:
      COutObj() : m_pInnerUnk(NULL) // Step 1
      {
      }
      DECLARE_GET_CONTROLLING_UNKNOWN()
      DECLARE_REGISTRY_RESOURCEID(IDR_OUTOBJ)
      DECLARE_PROTECT_FINAL_CONSTRUCT() // Step 2

      BEGIN_COM_MAP(COutObj)
         COM_INTERFACE_ENTRY(IOutObj)
         COM_INTERFACE_ENTRY(IDispatch)
         COM_INTERFACE_ENTRY_AGGREGATE(IID_IInnObj, m_pInnerUnk) // Step 3
      END_COM_MAP()

      // Start of step 4
      HRESULT FinalConstruct()
      {
         HRESULT hr;
         CLSID   clsidInner;

         hr = CLSIDFromProgID(L"InnObj.InnObj.1", &clsidInner);
         if (hr == S_OK)
            hr = CoCreateInstance(clsidInner, GetControllingUnknown(),
                                  CLSCTX_INPROC_SERVER, IID_IUnknown,
                                  (void**)&m_pInnerUnk);
         return hr;
      } // End of step 4

      void FinalRelease(){m_pInnerUnk->Release();} // Step 5

      // IOutObj
   public:
      STDMETHOD(Test)();
   private:
      LPUNKNOWN m_pInnerUnk; // Step 1
   };
				
Se o objeto interno é no mesmo servidor ATL, então você pode usar o código a seguir para criar o objeto interno sem CoCreateInstance:
   HRESULT FinalConstruct()
      {
         return  CInnObj::_CreatorClass::CreateInstance(
             GetControllingUnknown(), IID_IUnknown,
             (void**)&m_pInnerUnk);

      }
				

Referências

Visual C++ manuais online: Visual C++ manuais; linguagem C/C ++ e biblioteca de C++; Active Template Library artigos Introdução ao COM e ATL; Introdução ao COM; agregação

Visual C++ manuais online: Visual C++ manuais; linguagem C/C ++ e biblioteca de C++; Active Template Library artigos conceitos básicos para o ATL COM objetos; criando uma agregação

Propriedades

ID do artigo: 173823 - Última revisão: terça-feira, 29 de junho de 2004 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft ActiveX Template Library 3.0 nas seguintes plataformas
    • 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 ActiveX Template Library 2.1 nas seguintes plataformas
    • 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
Palavras-chave: 
kbmt kbarchitecture kbhowto KB173823 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: 173823

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