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 CComCoClass
base :
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à diGetProgID
, ma restituisce la stringa specificata con vi_progid.
Le modifiche seguenti, correlate alla mappa COM, vengono apportate alla classe di destinazione:
Viene aggiunta una mappa COM con voci per tutte le interfacce che la classe di destinazione deriva da e tutte le voci specificate dall'attributo COM Interface Entry Points o quelle richieste dall'attributo aggregates .
Una macro OBJECT_ENTRY_AUTO viene inserita nella mappa COM.
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