coclass
Erstellt ein COM-Objekt, das eine COM-Schnittstelle implementieren kann.
Syntax
[coclass]
Hinweise
Das Coclass C++-Attribut platziert ein Coclass-Konstrukt in der generierten IDL-Datei.
Beim Definieren einer CoClass können Sie auch die Attribute "uuid", "version", "threading", "vi_progid" und "progid " angeben. Wenn eine davon nicht angegeben ist, wird sie generiert.
Wenn zwei Headerdateien Klassen mit dem Coclass-Attribut enthalten und keine GUID angeben, verwendet der Compiler dieselbe GUID für beide Klassen, und dies führt zu einem MIDL-Fehler. Daher sollten Sie das uuid
Attribut verwenden, wenn Sie coclass verwenden.
ATL-Projekte
Wenn diesem Attribut eine Klassen- oder Strukturdefinition in einem ATL-Projekt vorangestellt ist, gilt Folgendes:
Fügt Code oder Daten ein, um die automatische Registrierung für das Objekt zu unterstützen.
Fügt Code oder Daten ein, um eine COM-Klassenfactory für das Objekt zu unterstützen.
Fügt Code oder Daten ein, um das Objekt zu implementieren
IUnknown
und zu einem com-creatablen Objekt zu machen.
Insbesondere werden dem Zielobjekt die folgenden Basisklassen hinzugefügt:
Die CComCoClass-Klasse stellt das Standardklassen-Factory- und Aggregationsmodell für das Objekt bereit.
Die CComObjectRootEx-Klasse verfügt über eine Vorlage basierend auf der Threadingmodellklasse, die durch das Threading-Attribut angegeben wird. Wenn das
threading
Attribut nicht angegeben ist, ist das Standardthreadingmodell Apartment.IProvideClassInfo2Impl wird hinzugefügt, wenn das nicht erstellbare Attribut für das Zielobjekt nicht angegeben ist.
Schließlich wird jede duale Schnittstelle, die nicht mit eingebetteter IDL definiert ist, durch die entsprechende IDispatchImpl-Klasse ersetzt. Wenn die duale Schnittstelle in eingebetteter IDL definiert ist, wird die bestimmte Schnittstelle in der Basisliste nicht geändert.
Das Coclass-Attribut stellt auch die folgenden Funktionen über eingefügten Code oder im Fall von GetObjectCLSID
, als statische Methode in der Basisklasse CComCoClass
zur Verfügung:
UpdateRegistry
registriert die Klassenfabriken der Zielklasse.GetObjectCLSID
, was mit der Registrierung zusammenhängt, kann auch verwendet werden, um die CLSID der Zielklasse abzurufen.GetObjectFriendlyName
Gibt standardmäßig eine Zeichenfolge des Formats "<ZielklassennameObject
>" zurück. Wenn diese Funktion bereits vorhanden ist, wird sie nicht hinzugefügt. Fügen Sie diese Funktion der Zielklasse hinzu, um einen benutzerfreundlicheren Namen als den automatisch generierten zurückzugeben.GetProgID
, die mit der Registrierung verknüpft ist, gibt die mit dem progid-Attribut angegebene Zeichenfolge zurück.GetVersionIndependentProgID
hat die gleiche Funktionalität wieGetProgID
, aber sie gibt die mit vi_progid angegebene Zeichenfolge zurück.
Die folgenden Änderungen, die sich auf die COM-Zuordnung beziehen, werden an der Zielklasse vorgenommen:
Eine COM-Zuordnung wird mit Einträgen für alle Schnittstellen hinzugefügt, von denen die Zielklasse abgeleitet wird, und alle Einträge, die durch das COM Interface Entry Points-Attribut oder die vom Attribut "Aggregates " benötigt werden.
Ein OBJECT_ENTRY_AUTO Makro wird in die COM-Zuordnung eingefügt.
Der Name der in der IDL-Datei für die Klasse generierten Coclass hat denselben Namen wie die Klasse. Verwenden Sie zum Beispiel, und verweisen Sie auf das folgende Beispiel, um auf die Klassen-ID für eine CoClass CMyClass
in einem Client über die MIDL-generierte Headerdatei CLSID_CMyClass
zuzugreifen.
Beispiel
Der folgende Code zeigt die Verwendung des Coclass-Attributs :
// 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 {};
Im folgenden Beispiel wird gezeigt, wie die Standardimplementierung einer Funktion außer Kraft setzen kann, die im code angezeigt wird, der vom Coclass-Attribut eingefügt wird. Weitere Informationen zum Anzeigen von eingefügtem Code finden Sie unter /Fx . Alle Basisklassen oder Schnittstellen, die Sie für eine Klasse verwenden, werden im eingefügten Code angezeigt. Wenn eine Klasse standardmäßig im eingefügten Code enthalten ist und Sie diese Klasse explizit als Basis für Ihre Coclass angeben, verwendet der Attributanbieter das im Code angegebene Formular.
// 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);
}
};
Anforderungen
Attributkontext | Wert |
---|---|
Gilt für | class , struct |
Wiederholbar | No |
Erforderliche Attribute | Keine |
Ungültige Attribute | Keine |
Weitere Informationen zu den Attributkontexten finden Sie unter Attributkontexte.
Siehe auch
IDL-Attribute
COM-Attribute
Klassenattribute
typedef-, enum-, union- und struct-Attribute
appobject