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:
A classe CComCoClass fornece o modelo de agregação e fábrica de classe padrão do objeto.
A classe CComObjectRootEx tem um modelo baseado na classe de modelo de threading especificada pelo atributo threading. Se o atributo
threading
não for especificado, o modelo de threading padrão será apartment.IProvideClassInfo2Impl será adicionado se o atributo não criável não for especificado para o 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 queGetProgID
, 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:
Um mapa COM é adicionado com entradas para todas as interfaces das quais a classe de destino deriva e todas as entradas especificadas pelo atributo pontos de entrada da interface COM ou aquelas exigidas pelo atributo aggregates.
Uma macro OBJECT_ENTRY_AUTO é inserida no mapa COM.
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