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:
CComCoClass Class poskytuje výchozí objekt pro vytváření tříd a agregační model objektu.
CComObjectRootEx – třída má šablonu založenou na třídě modelu threading určené atributem threading .
threading
Pokud atribut není zadaný, výchozí model threadingu je byt.IProvideClassInfo2Impl je přidán, pokud není pro cílový objekt zadán noncreatable atribut.
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 jakoGetProgID
, 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:
Mapování modelu COM se přidává s položkami pro všechna rozhraní, která cílová třída odvozuje, a všechny položky určené atributem vstupních bodů rozhraní modelu COM nebo položkami vyžadovanými atributem agregace .
Do mapy COM se vloží OBJECT_ENTRY_AUTO makro.
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 |
Opakovatelný | No |
Požadované atributy | Nic |
Neplatné atributy | Nic |
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