Compartir a través de


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 que GetProgID, 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:

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 Ninguno
Atributos no válidos Ninguno

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