Freigeben über


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:

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 CComCoClasszur 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.

  • GetObjectFriendlyNameGibt 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 wie GetProgID, 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:

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 CMyClassin einem Client über die MIDL-generierte Headerdatei CLSID_CMyClasszuzugreifen.

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 Nein
Erforderliche Attribute None
Ungültige Attribute None

Weitere Informationen zu den Attributkontexten finden Sie unter Attributkontexte.

Siehe auch

IDL-Attribute
COM-Attribute
Klassenattribute
typedef-, enum-, union- und struct-Attribute
appobject