Compartilhar via


coclass

Cria um objeto COM, que pode implementar uma interface COM.

Sintaxe

[coclass]

Comentários

O atributo C++ coclass coloca um constructo de coclass no arquivo .idl gerado.

Ao definir um coclass, você também pode especificar os atributos uuid, version, threading, vi_progid e progid. Se algum deles não for especificado, ele será gerado.

Se dois arquivos de cabeçalho tiverem classes com o atributo coclass e não especificarem um GUID, o compilador usará o mesmo GUID para ambas as classes e isso resultará em um erro MIDL. Portanto, você deve usar o atributo uuid ao usar coclass.

Projetos ATL

Quando esse atributo precede uma definição de classe ou estrutura em um projeto ATL, ele:

  • Injeta código ou dados para dar suporte ao registro automático do objeto.

  • Injeta código ou dados para dar suporte a uma fábrica de classes COM do objeto.

  • Injeta código ou dados para implementar IUnknown e tornar o objeto um objeto criável de COM.

Especificamente, as seguintes classes base são adicionadas ao objeto de destino:

Por fim, qualquer interface dual que não seja definida usando IDL inserida é substituída pela classe IDispatchImpl correspondente. Se a interface dual for definida na IDL inserida, a interface específica na lista base não será modificada.

O atributo coclass também disponibiliza as seguintes funções por meio de código injetado ou, no caso de GetObjectCLSID, como um método estático na classe base CComCoClass:

  • UpdateRegistry registra as fábricas de classes da classe de destino.

  • GetObjectCLSID, que está relacionado ao registro, também pode ser usado para obter o CLSID da classe de destino.

  • GetObjectFriendlyName por padrão, retorna uma cadeia de caracteres do formato "<nome da classe de destino>Object". Se essa função já estiver presente, ela não será adicionada. Adicione essa função à classe de destino para retornar um nome mais amigável do que o que foi gerado automaticamente.

  • GetProgID, que está relacionada ao registro, retorna a cadeia de caracteres especificada com o atributo progid.

  • GetVersionIndependentProgID tem a mesma funcionalidade que GetProgID, mas retorna a cadeia de caracteres especificada com vi_progid.

As seguintes alterações, relacionadas ao mapa COM, são feitas na classe de destino:

O nome da coclass gerada no arquivo .idl para a classe terá o mesmo nome que a classe. Por exemplo, e em relação ao exemplo a seguir, para acessar a ID de classe de uma coclass CMyClass, em um cliente por meio do arquivo de cabeçalho gerado por MIDL, use CLSID_CMyClass.

Exemplo

O seguinte código mostra como usar o atributo coclass:

// cpp_attr_ref_coclass1.cpp
// compile with: /LD
#include "unknwn.h"
[module(name="MyLib")];

[ object, uuid("00000000-0000-0000-0000-000000000001") ]
__interface I {
   HRESULT func();
};

[coclass, progid("MyCoClass.coclass.1"), vi_progid("MyCoClass.coclass"),
appobject, uuid("9E66A294-4365-11D2-A997-00C04FA37DDB")]
class CMyClass : public I {};

A amostra a seguir mostra como substituir a implementação padrão de uma função que aparece no código injetado pelo atributo coclass. Confira /Fx para obter mais informações sobre como exibir o código injetado. Todas as classes base ou interfaces que você usar para uma classe aparecerão no código injetado. Além disso, se uma classe for incluída por padrão no código injetado e você especificar explicitamente essa classe como uma base para sua coclass, o provedor do atributo usará o formulário especificado no seu código.

// cpp_attr_ref_coclass2.cpp
// compile with: /LD
#include <atlbase.h>
#include <atlcom.h>
#include <atlwin.h>
#include <atltypes.h>
#include <atlctl.h>
#include <atlhost.h>
#include <atlplus.h>

[module(name="MyLib")];

[object, uuid("00000000-0000-0000-0000-000000000000")]
__interface bb {};

[coclass, uuid("00000000-0000-0000-0000-000000000001")]
class CMyClass : public bb {
public:
   // by adding the definition of UpdateRegistry to your code, // the function will not be included in the injected code
   static HRESULT WINAPI UpdateRegistry(BOOL bRegister) {
      // you can add to the default implementation
      CRegistryVirtualMachine rvm;
      HRESULT hr;
      if (FAILED(hr = rvm.AddStandardReplacements()))
         return hr;
      rvm.AddReplacement(_T("FriendlyName"), GetObjectFriendlyName());
      return rvm.VMUpdateRegistry(GetOpCodes(), GetOpcodeStringVals(),       GetOpcodeDWORDVals(), GetOpcodeBinaryVals(), bRegister);
   }
};

Requisitos

Contexto do atributo Valor
Aplicável ao class, struct
Repetível Não
Atributos obrigatórios Nenhum
Atributos inválidos Nenhum

Para obter mais informações sobre os contextos de atributo, confira Contextos de atributo.

Confira também

Atributos de IDL
Atributos de COM
Atributos de classe
Atributos Typedef, Enum, Union e Struct
appobject