Sdílet prostřednictvím


coclass

Vytvoří objekt modelu COM lze implementovat rozhraní COM.

[coclass]

Poznámky

Coclass C++ atribut umístí soubor generovaný .idl coclass konstrukce.

Při definování coclass můžete také zadat uuid, verze, threading, vi_progid, a progid atributy.Pokud žádný z nich není zadán, bude vygenerována.

Pokud dva soubory záhlaví obsahují třídy se coclass atributu a určit identifikátor GUID, kompilátor bude používat stejný identifikátor GUID pro obě třídy jakosti a bude výsledkem chyba jazyk MIDL.Proto byste měli použít uuid při použití atributu coclass.

Projekty ATL

Pokud tento atribut předchází definice třídy nebo struktury v projektu ATL ji:

  • Injects kódu nebo dat. pro podporu automatického zápisu pro objekt.

  • Injects kódu nebo dat. pro podporu pro objekt COM třídu factory.

  • Injects kódu nebo dat. implementovat IUnknown a objekt COM možné vytvořit objekt.

Konkrétně se doplňují následující základní třídy cílového objektu:

Nakonec duální rozhraní, který není definován pomocí vloženého IDL nahrazen odpovídající IDispatchImpl třídy.Duální rozhraní je definován v IDL vložený, zejména rozhraní v základním seznamu se nemění.

Coclass atribut také poskytuje následující funkce prostřednictvím vloženého kódu nebo v případě GetObjectCLSID, jako statická metoda v základní třídě CComCoClass:

  • UpdateRegistryregistruje ClassFactory cílové třídy.

  • GetObjectCLSID, který se vztahuje k registraci, lze také získat identifikátor CLSID cílové třídy.

  • GetObjectFriendlyName ve výchozím nastavení vrátí řetězec formátu "<název cílové třídy> Object".Pokud tato funkce již existuje, nebude přidána.Tato funkce přidáte cílové třídy vrátit příjemnější název, než je automaticky generován.

  • GetProgID, který se vztahuje k registraci, vrátí řetězec zadán progid atributu.

  • GetVersionIndependentProgID má stejné funkce jako GetProgID, ale vrátí řetězec s vi_progid.

Cílové třídy jsou provedeny následující změny, které souvisejí s COM mapy:

  • Mapa COM je přidán položkami pro všechna rozhraní cílové třídy je odvozen z a všechny položky určené COM rozhraní vstupní body atributu nebo vyžadovaným agregáty atributu.

  • OBJECT_ENTRY_AUTO makro je vložen do mapy COM.Toto makro je podobná OBJECT_ENTRY z hlediska funkčnosti, ale nemusí být součástí COM mapa cílové třídy.

Název třídy typu coclass generován 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ázka ID třídy pro coclass CMyClass, klient prostřednictvím souboru hlavičky generované jazyk MIDL přístup pomocí CLSID_CMyClass.

Příklad

Následující kód ukazuje způsob použití coclass atribut:

// 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í příklad ukazuje, jak lze přepsat výchozí implementace funkce, která se zobrazí v kódu injekčně coclass atributu.Viz /Fx Další informace o zobrazení vloženého kódu.Všechny základní třídy nebo rozhraní, které používáte pro třídu se zobrazí v vloženého kódu.   Dále pokud výslovně zadáte třídy jako základ pro váš coclass třídy je standardně zahrnuty do vloženého kódu, zprostředkovatel atribut použije formulář určený 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

Atribut kontextu

V aplikacích

Třída,struct

Opakovatelné

Ne

Požadované atributy

Žádná

Neplatné atributy

Žádná

Další informace o kontextech atribut, viz Kontexty atribut.

Viz také

Referenční dokumentace

appobject

Další zdroje

IDL – atributy

COM – atributy

Atributy třídy

Atributy klíčových slov typedef, enum, union a struct