coclase
Crea un objeto COM, que puede implementar una interfaz COM.
Sintaxis
[coclass]
Comentarios
El atributo de C++ coclass coloca una construcción de coclase en el archivo .idl generado.
Al definir una coclase, también puede especificar los atributos uuid, version, threading, vi_progid y progid. Si no se especifica alguno de ellos, se generará automáticamente.
Si dos archivos de encabezado contienen clases con el atributo coclass y no especifican un GUID, el compilador usará el mismo GUID para ambas clases y esto dará como resultado un error MIDL. Por lo tanto, debe usar el atributo uuid
al usar coclass.
Proyectos ATL
Si el atributo precede a una definición de clase o estructura de un proyecto ATL, este atributo:
Inserta código o datos para admitir el registro automático del objeto.
Inserta código o datos para admitir un generador de clases COM del objeto.
Inserta código o datos para implementar
IUnknown
y convertir el objeto en un objeto COM creable.
En concreto, se agregan las siguientes clases base al objeto de destino:
La clase CComCoClass proporciona el generador de clases predeterminado y el modelo de agregación del objeto.
La clase CComObjectRootEx tiene una plantilla basada en la clase de modelo de subprocesos especificada por el atributo threading. Si no se especifica el atributo
threading
, el modelo de subprocesos predeterminado es el de apartamento.Se agrega IProvideClassInfo2Impl si no se especifica el atributo noncreatable para el objeto de destino.
Por último, cualquier interfaz dual que no se defina mediante IDL insertado se reemplazará por la clase IDispatchImpl correspondiente. Si la interfaz dual se define en IDL insertado, la interfaz concreta de la lista base no se modifica.
El atributo coclass también hace que las siguientes funciones estén disponibles mediante código insertado, o en el caso de GetObjectCLSID
, como un método estático de la clase base CComCoClass
:
UpdateRegistry
registra los generadores de clases de la clase de destino.GetObjectCLSID
, que está relacionado con el registro, también se puede usar para obtener el CLSID de la clase de destino.GetObjectFriendlyName
devuelve, de forma predeterminada, una cadena con el formato "<nombre de clase de destino>Object
". Si esta función ya está presente, no se agrega. Agregue esta función a la clase de destino para que devuelva un nombre más descriptivo que el generado automáticamente.GetProgID
, que está relacionado con el registro, devuelve la cadena especificada con el atributo progid.GetVersionIndependentProgID
tiene la misma funcionalidad queGetProgID
, pero devuelve la cadena especificada con vi_progid.
Los siguientes cambios, que están relacionados con la asignación COM, se realizan en la clase de destino:
Se agrega una asignación COM con entradas para todas las interfaces de las que se deriva la clase de destino y todas las entradas especificadas por el atributo Puntos de entrada de la interfaz COM o las requeridas por el atributo de agregados.
Se inserta una macro OBJECT_ENTRY_AUTO en la asignación COM.
El nombre de la coclase generada en el archivo .idl de la clase tendrá el mismo nombre que la clase. Por ejemplo, y haciendo referencia al ejemplo siguiente, para acceder al identificador de clase de una coclase CMyClass
en un cliente a través del archivo de encabezado generado por MIDL, use CLSID_CMyClass
.
Ejemplo
En el código siguiente se muestra cómo usar el 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 {};
En el ejemplo siguiente se muestra cómo invalidar la implementación predeterminada de una función que aparece en el código insertado mediante el atributo coclass. Consulte /Fx para obtener más información sobre cómo ver código insertado. Las clases base o las interfaces que use para una clase aparecerán en el código insertado. Además, si una clase se incluye de forma predeterminada en el código insertado y especifica explícitamente esa clase como base para la coclase, el proveedor de atributos usará el formulario especificado en el 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 | Valor |
---|---|
Se aplica a | class , struct |
Reiterativo | No |
Atributos requeridos | None |
Atributos no válidos | None |
Para obtener más información acerca de los contextos de atributo, consulte Contextos de atributo.
Consulte también
Atributos IDL
Atributos COM
Atributos de clase
Typedef, Enum, Union y Struct (atributos)
appobject