Sdílet prostřednictvím


coclass

Vytvoří objekt COM, který může implementovat rozhraní MODELU COM.

Syntaxe

[coclass]

Poznámky

Atribut coclass C++ umístí konstruktor coclass do vygenerovaného souboru .idl.

Při definování třídy coclass můžete také zadat atributy uuid, version, threading, vi_progid a progid . Pokud některý z nich není zadaný, vygeneruje se.

Pokud dva soubory hlaviček obsahují třídy s atributem coclass a nezadávají identifikátor GUID, kompilátor použije stejný identifikátor GUID pro obě třídy a výsledkem bude chyba MIDL. Proto byste měli použít uuid atribut při použití třídy coclass.

Projekty ATL

Pokud tento atribut předchází definici třídy nebo struktury v projektu ATL, je následující:

  • Vloží kód nebo data pro podporu automatické registrace objektu.

  • Vloží kód nebo data pro podporu objektu třídy COM.

  • Vloží kód nebo data pro implementaci IUnknown a vytvoří objekt objektu com-creatable.

Konkrétně se do cílového objektu přidají následující základní třídy:

Nakonec je jakékoli duální rozhraní, které není definováno pomocí vloženého IDL, nahrazeno odpovídající IDispatchImpl třídy. Pokud je duální rozhraní definováno ve vloženém IDL, konkrétní rozhraní v základním seznamu není změněno.

Atribut coclass také zpřístupňuje následující funkce prostřednictvím vloženého kódu, nebo v případě GetObjectCLSID, jako statickou metodu v základní třídě CComCoClass:

  • UpdateRegistry zaregistruje továrny tříd cílové třídy.

  • GetObjectCLSID, které souvisí s registrací, lze také použít k získání CLSID cílové třídy.

  • GetObjectFriendlyName ve výchozím nastavení vrátí řetězec formátu "<název>Object cílové třídy". Pokud už tato funkce existuje, nepřidá se. Přidejte tuto funkci do cílové třídy, aby se vrátil popisnější název, než který se automaticky vygeneroval.

  • GetProgID, který souvisí s registrací, vrátí řetězec zadaný atributem progid .

  • GetVersionIndependentProgID má stejnou funkci jako GetProgID, ale vrátí řetězec zadaný pomocí vi_progid.

V cílové třídě jsou provedeny následující změny, které souvisejí s mapou modelu COM:

Název třídy coclass vygenerované v souboru .idl pro třídu bude mít stejný název jako třída. Například a odkazující na následující ukázku pro přístup k ID třídy pro třídu coclass CMyClass, v klientovi prostřednictvím souboru hlaviček vygenerovaného MIDL použijte CLSID_CMyClass.

Příklad

Následující kód ukazuje, jak použít atribut coclass :

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

Následující ukázka ukazuje, jak přepsat výchozí implementaci funkce, která se zobrazí v kódu vloženého atributem coclass . Další informace o zobrazení vloženého kódu najdete v /Fx . Všechny základní třídy nebo rozhraní, které použijete pro třídu, se zobrazí v vložený kód. Dále platí, že pokud je třída ve výchozím nastavení zahrnuta do vloženého kódu a explicitně určíte tuto třídu jako základ pro vaši třídu coclass, zprostředkovatel atributů použije formulář zadaný v kódu.

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

Požadavky

Kontext atributu Hodnota
Platí pro class, struct
Opakovatelnou Číslo
Požadované atributy Žádné
Neplatné atributy Žádné

Další informace o kontextech atributů naleznete v tématu Kontexty atributů.

Viz také

IDL – atributy
COM – atributy
Atributy třídy
Atributy klíčových slov typedef, enum, union a struct
appobject