coclasse

Crée un objet COM, qui peut implémenter une interface COM.

Syntaxe

[coclass]

Notes

L’attribut C++ coclasse place une construction de coclasse dans le fichier .idl généré.

Lors de la définition d’une coclasse, vous pouvez également spécifier les attributs uuid, version, threading, vi_progid et progid . Si l’un d’entre eux n’est pas spécifié, il sera généré.

Si deux fichiers d’en-tête contiennent des classes avec l’attribut de coclasse et ne spécifient pas de GUID, le compilateur utilise le même GUID pour les deux classes, et cela entraîne une erreur MIDL. Par conséquent, vous devez utiliser l’attribut lorsque vous utilisez la uuid coclasse.

Projets ATL

Lorsque cet attribut précède une définition de classe ou de structure dans un projet ATL, il :

  • Injecte du code ou des données pour prendre en charge l’inscription automatique de l’objet.

  • Injecte du code ou des données pour prendre en charge une fabrique de classes COM pour l’objet.

  • Injecte du code ou des données pour implémenter IUnknown et rendre l’objet un objet COM creatable.

Plus précisément, les classes de base suivantes sont ajoutées à l’objet cible :

  • La classe CComCoClass fournit la fabrique de classes et le modèle d’agrégation par défaut pour l’objet.

  • La classe CComObjectRootEx a un modèle basé sur la classe de modèle de thread spécifiée par l’attribut threading . Si l’attribut threading n’est pas spécifié, le modèle de threading par défaut est appartement.

  • IProvideClassInfo2Impl est ajouté si l’attribut noncreatable n’est pas spécifié pour l’objet cible.

Enfin, toute interface double qui n’est pas définie à l’aide de l’IDL incorporée est remplacée par la classe IDispatchImpl correspondante. Si l’interface double est définie dans l’IDL incorporé, l’interface particulière de la liste de base n’est pas modifiée.

L’attribut de coclasse rend également les fonctions suivantes disponibles via du code injecté, ou dans le cas d’une méthode statique dans la classe CComCoClassde GetObjectCLSIDbase :

  • UpdateRegistry inscrit les fabriques de classes de la classe cible.

  • GetObjectCLSID, qui est lié à l’inscription, peut également être utilisé pour obtenir le CLSID de la classe cible.

  • GetObjectFriendlyName par défaut retourne une chaîne du format «< nom>Object de classe cible ». Si cette fonction est déjà présente, elle n’est pas ajoutée. Ajoutez cette fonction à la classe cible pour retourner un nom plus convivial que celui généré automatiquement.

  • GetProgID, qui est lié à l’inscription, retourne la chaîne spécifiée avec l’attribut progid .

  • GetVersionIndependentProgID a la même fonctionnalité que GetProgID, mais elle retourne la chaîne spécifiée avec vi_progid.

Les modifications suivantes, qui sont liées à la carte COM, sont apportées à la classe cible :

  • Une carte COM est ajoutée avec des entrées pour toutes les interfaces dont la classe cible dérive et toutes les entrées spécifiées par l’attribut points d’entrée de l’interface COM ou celles requises par l’attribut d’agrégations .

  • Une macro OBJECT_ENTRY_AUTO est insérée dans la carte COM.

Le nom de la coclasse généré dans le fichier .idl de la classe aura le même nom que la classe. Par exemple, et en faisant référence à l’exemple suivant, pour accéder à l’ID de classe d’une coclasse CMyClass, dans un client via le fichier d’en-tête généré par MIDL, utilisez CLSID_CMyClass.

Exemple

Le code suivant montre comment utiliser l’attribut de 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’exemple suivant montre comment remplacer l’implémentation par défaut d’une fonction qui apparaît dans le code injecté par l’attribut de coclasse . Pour plus d’informations sur l’affichage de code injecté, consultez /Fx . Toutes les classes de base ou interfaces que vous utilisez pour une classe apparaissent dans le code injecté. En outre, si une classe est incluse par défaut dans le code injecté et que vous spécifiez explicitement cette classe comme base pour votre coclasse, le fournisseur d’attributs utilise le formulaire spécifié dans votre code.

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

Spécifications

Contexte d’attribut Value
S’applique à class, struct
Renouvelable Non
Attributs requis Aucun
Attributs non valides Aucun

Pour plus d'informations sur les contextes d'attribut, consultez Contextes d'attribut.

Voir aussi

Attributs IDL
Attributs COM
Attributs de classe
Attributs Typedef, Enum, Union et Struct
appobject