coclass
Cria um objeto COM, que pode implementar uma interface COM.
[coclass]
Comentários
O coclass atributo C++ coloca uma construção coclass no arquivo. idl gerado.
Ao definir um coclass, você também pode especificar o uuid, versão, threading, vi_progid, e progid atributos. Se qualquer um deles não for especificado, ele será gerado.
Se dois arquivos de cabeçalho contém classes com o coclass de atributo e não especificar um GUID, o compilador usará o mesmo GUID para ambas as classes, e isso resultará em um erro MIDL. Portanto, você deve usar o uuid quando você usa o atributo coclass.
Projetos do ATL
Quando esse atributo precede uma definição de classe ou estrutura em um projeto ATL, ele:
Insere um código ou dados para dar suporte a registro automático para o objeto.
Insere um código ou dados para suportar uma fábrica de classes COM para o objeto.
Injeta o código ou dados para implementar IUnknown e tornar o objeto em um objeto COM pode ser criado.
Especificamente, as seguintes classes base são adicionadas ao objeto de destino:
Classe CComCoClass fornece o modelo de fábrica e agregação de classe padrão para o objeto.
Classe CComObjectRootEx tem um modelo com base na classe de modelo de threading especificada pelo threading atributo. Se o threading atributo não for especificado, o padrão de modelo de threading é apartamento.
IProvideClassInfo2Impl é adicionada se a noncreatable atributo não for especificado para o objeto de destino.
Finalmente, qualquer interface dupla que não está definido com IDL incorporada é substituído com o correspondente IDispatchImpl classe. Se a interface dupla é definida no IDL incorporado, a interface específica na lista base não é modificada.
O coclass atributo também disponibiliza as seguintes funções por meio do código injetado ou no caso de GetObjectCLSID, como um método estático na classe base CComCoClass:
UpdateRegistryregistra as fábricas de classe da classe destino.
GetObjectCLSID, que está relacionado ao registro, também pode ser usado para obter o CLSID da classe destino.
GetObjectFriendlyName por padrão retorna uma seqüência de caracteres do formato "<nome de classe de destino> Object". Se essa função já estiver presente, ele não será adicionado. Adicione esta função para a classe de destino para retornar um nome mais amigável daquele gerado automaticamente.
GetProgID, que está relacionado ao registro, retorna a seqüência de caracteres especificado com o progid atributo.
GetVersionIndependentProgID tem a mesma funcionalidade que GetProgID, mas ele retorna a seqüência de caracteres especificada com vi_progid.
São feitas as alterações a seguir, estão relacionadas ao mapa COM, a classe de destino:
Um mapa COM é adicionado com entradas para a classe de destino deriva de todas as interfaces e todas as entradas especificadas pela COM pontos de entrada de Interface atributo ou aquelas necessárias para o agregados atributo.
Um OBJECT_ENTRY_AUTO macro é inserida no mapa de COM. Esta macro é semelhante a OBJECT_ENTRY em termos de funcionalidade, mas não precisa fazer parte do mapa COM da classe destino.
O nome do coclass gerado no arquivo. idl para a classe terá o mesmo nome da classe. Por exemplo e se referindo ao exemplo a seguir, para acessar o ID de classe para um coclass CMyClass, em um cliente através do arquivo de cabeçalho gerado pelo MIDL, use CLSID_CMyClass.
Exemplo
O código a seguir mostra como usar o coclass atributo:
// 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 {};
O exemplo a seguir mostra como substituir a implementação do padrão de uma função que aparece no código injetado pelo coclass atributo. Consulte /Fx para obter mais informações sobre como exibir o código injetado. As classes base ou interfaces que você pode usar para uma classe ser aparecerão no código injetado. Além disso, se uma classe é incluída por padrão no código injetado e você especifica explicitamente essa classe como base para seu coclass, o provedor de atributo usará a forma especificada em 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 de atributo
Se aplica a |
classe,struct |
Reproduzíveis |
Não |
Atributos obrigatórios |
Nenhum |
Atributos inválidos |
Nenhum |
Para obter mais informações sobre os contextos de atributo, consulte Atributo contextos.