Condividi tramite


coclass

Crea un oggetto COM, che può implementare un'interfaccia COM.

Sintassi

[coclass]

Osservazioni:

L'attributo C++ coclasse inserisce un costrutto coclasse nel file con estensione idl generato.

Quando si definisce una coclasse, è anche possibile specificare gli attributi uuid, version, threading, vi_progid e progid . Se uno di essi non viene specificato, verrà generato.

Se due file di intestazione contengono classi con l'attributo coclasse e non specificano un GUID, il compilatore userà lo stesso GUID per entrambe le classi e verrà generato un errore MIDL. Pertanto, è consigliabile usare l'attributo uuid quando si usa la coclasse.

Progetti ATL

Quando questo attributo precede una definizione di classe o struttura in un progetto ATL, è possibile:

  • Inserisce codice o dati per supportare la registrazione automatica per l'oggetto.

  • Inserisce codice o dati per supportare una class factory COM per l'oggetto.

  • Inserisce codice o dati da implementare IUnknown e rendere l'oggetto un oggetto creabile COM.

In particolare, le classi di base seguenti vengono aggiunte all'oggetto di destinazione:

  • La classe CComCoClass fornisce la class factory predefinita e il modello di aggregazione per l'oggetto.

  • La classe CComObjectRootEx ha un modello basato sulla classe del modello di threading specificata dall'attributo di threading . Se l'attributo threading non viene specificato, il modello di threading predefinito è apartment.

  • IProvideClassInfo2Impl viene aggiunto se l'attributo noncreatable non è specificato per l'oggetto di destinazione.

Infine, qualsiasi interfaccia duale non definita tramite IDL incorporato viene sostituita con la classe IDispatchImpl corrispondente. Se l'interfaccia doppia è definita in IDL incorporato, l'interfaccia specifica nell'elenco di base non viene modificata.

L'attributo coclasse rende disponibili anche le funzioni seguenti tramite codice inserito o nel caso di GetObjectCLSID, come metodo statico nella classe CComCoClassbase :

  • UpdateRegistry registra le class factory della classe di destinazione.

  • GetObjectCLSID, correlato alla registrazione, può essere usato anche per ottenere il CLSID della classe di destinazione.

  • GetObjectFriendlyName per impostazione predefinita restituisce una stringa del formato "<nome>Object classe di destinazione". Se questa funzione è già presente, non viene aggiunta. Aggiungere questa funzione alla classe di destinazione per restituire un nome più descrittivo rispetto a quello generato automaticamente.

  • GetProgID, correlato alla registrazione, restituisce la stringa specificata con l'attributo progid .

  • GetVersionIndependentProgID ha la stessa funzionalità di GetProgID, ma restituisce la stringa specificata con vi_progid.

Le modifiche seguenti, correlate alla mappa COM, vengono apportate alla classe di destinazione:

Il nome della coclasse generata nel file con estensione idl per la classe avrà lo stesso nome della classe . Ad esempio, e facendo riferimento all'esempio seguente, per accedere all'ID classe per una coclasse CMyClass, in un client tramite il file di intestazione generato da MIDL, usare CLSID_CMyClass.

Esempio

Il codice seguente illustra come usare l'attributo coclasse :

// 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 {};

L'esempio seguente illustra come eseguire l'override dell'implementazione predefinita di una funzione visualizzata nel codice inserito dall'attributo coclasse . Per altre informazioni sulla visualizzazione del codice inserito, vedere /Fx . Tutte le classi o le interfacce di base usate per una classe verranno visualizzate nel codice inserito. Inoltre, se una classe è inclusa per impostazione predefinita nel codice inserito e si specifica esplicitamente tale classe come base per la coclasse, il provider di attributi userà il modulo specificato nel codice.

// 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);
   }
};

Requisiti

Contesto attributo Valore
Si applica a class, struct
Ripetibile No
Attributi obbligatori None
Attributi non validi None

Per altre informazioni sui contesti di attributi, vedere Contesti di attributi.

Vedi anche

Attributi IDL
Attributi COM
Attributi di classe
Attributi Typedef, Enum, Union e Struct
appobject