Compartir a través de


coclass

crea un objeto COM, que puede implementar una interfaz COM.

[coclass]

Comentarios

El atributo de CoClass C++ coloca una construcción coclass en el archivo generado .idl.

Al definir una coclase, también puede especificar uuid, versión, subprocesamiento, vi_progid, y los atributos de ProgID . Si ninguno de ellos no se especifica, se generará.

Si dos archivos de encabezado contienen clases con el atributo de CoClass y no especifican GUID, el compilador utilizará mismo GUID para las dos clases, y se producirán un error MIDL. Por consiguiente, debe usar el atributo de uuid cuando se utiliza CoClass.

Proyectos de ATL

Cuando este atributo precede a una definición de clase o estructura en un proyecto ATL, él:

  • Inserta código o datos para admitir el registro automático para el objeto.

  • Inserta código o datos para admitir un generador de clases COM para el objeto.

  • Inserta código o datos para implementar IUnknown y crear el objeto un objeto de COM-creatable.

Específicamente, las clases base siguientes se agregan al objeto de destino:

Finalmente, cualquier interfaz dual que no está definido mediante IDL incrustado se reemplaza con la clase correspondiente de IDispatchImpl . Si la interfaz dual está definido en IDL incrustado, la interfaz determinada en la lista base no se modifica.

El atributo de CoClass también crea las siguientes funciones disponible mediante código insertado, o en el caso de GetObjectCLSID, como un método estático en la clase base CComCoClass:

  • UpdateRegistry registra los generadores de clases de la clase de destino.

  • GetObjectCLSID, relacionado con el registro, también se puede utilizar para obtener el CLSID de la clase de destino.

  • GetObjectFriendlyName de forma predeterminada devuelve una cadena de formato “name>Objectde la clasede <target”. Si esta función ya está presente, no se agrega. Agregue esta función a la clase de destino para devolver un nombre más descriptivo que el generado automáticamente.

  • GetProgID, relacionado con el registro, devuelve la cadena especificada con el atributo de ProgID .

  • GetVersionIndependentProgID tiene la misma funcionalidad que GetProgID, pero devuelve la cadena especificada con vi_progid.

Los cambios siguientes, que se relacionan con el mapa COM, se realizan en la clase de destino:

  • Un mapa COM se agrega con las entradas para todas las interfaces que la clase de destino se deriva de y todas las entradas especificado por el atributo de Puntos de entrada de interfaz COM o las necesarias en el atributo de agregados .

  • Una macro de OBJECT_ENTRY_AUTO se inserta en el mapa COM. Esta macro es similar a OBJECT_ENTRY en términos de funcionalidad pero no necesita ser parte del mapa COM de la clase de destino.

El nombre de la coclase generados en el archivo .idl para la clase tendrá el mismo nombre que la clase. Por ejemplo, y haciendo referencia al ejemplo siguiente, para tener acceso al identificador de la clase para coclase CMyClass, en un cliente en el archivo de encabezado generado por MIDL, utilice CLSID_CMyClass.

Ejemplo

el código siguiente muestra cómo utilizar el atributo de 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 {};

El ejemplo siguiente muestra cómo invalidar la implementación predeterminada de una función que aparece en el código insertado por el atributo de CoClass . Vea /Fx para obtener más información sobre código insertado de la vista. Las clases base o interfaz que se utilice para una clase se aparecen en el código insertado.   Además, si una clase está incluido de forma predeterminada en el código insertado y se especifica explícitamente esa clase como base para la coclase, el proveedor de atributo utilizará el formato 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

Se aplica a

clase, struct

repetible

No

Atributos necesarios

None

Atributos no válidos

None

Para obtener más información sobre los contextos de atributos, vea Contextos de atributo.

Vea también

Referencia

appobject

Otros recursos

Atributos IDL

Atributos COM

Atributos de clase

Typedef, Enum, Union y Struct (Atributos)