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:
Třída CComCoClass poskytuje model výchozí třídu factory a agregace pro objekt.
Třída CComObjectRootEx na základě podprocesů model třídy určené šablonou threading atributu.Pokud threading atributu není zadán, je výchozí model podprocesů typu apartment.
IProvideClassInfo2Impl je přidán, pokud noncreatable tento atribut není určen pro cílový objekt.
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.