coclass
Tworzy obiekt COM, który można zaimplementować interfejsu COM.
[coclass]
Uwagi
Coclass atrybut C++ umieszcza konstrukcja coclass w pliku .idl wygenerowany.
Podczas definiowania coclass, można również określić uuid, wersji, threading, vi_progid, i progid atrybuty.Jednym z nich nie jest określony, zostanie wygenerowany.
Jeśli dwa pliki nagłówków zawierają klasy z coclass atrybutu i nie określono identyfikatora GUID, kompilator będzie używać tego samego identyfikatora GUID dla obu klas, i że spowoduje błąd MIDL.W związku z tym, należy użyć uuid atrybutu podczas korzystania z coclass.
Projekty ATL
Gdy ten atrybut poprzedza definicji klasy lub struktury w projekcie ATL go:
Wszczepia kod lub dane do obsługi rejestracji auto dla obiektu.
Wszczepia kod lub dane do obsługi fabryki klasy COM dla obiektu.
Wszczepia kod lub dane do wprowadzenia w życie IUnknown i utworzyć obiekt COM tego obiektu.
W szczególności następujące klasy podstawowej są dodawane do obiektu docelowego:
Klasa CComCoClass zapewnia model fabryki i Agregacja klasy domyślne dla tego obiektu.
Klasa CComObjectRootEx zawiera szablon, na podstawie klasy modelu wątkowości określonej przez threading atrybut.Jeśli threading atrybut nie jest określony, domyślnie model wątków jest apartament.
IProvideClassInfo2Impl dodaje się, jeśli noncreatable atrybut nie został określony dla obiektu docelowego.
Wreszcie, podwójnym interfejsem, który nie jest zdefiniowany przy użyciu osadzonego IDL zastępuje się z odpowiednimi IDispatchImpl klasy.Podwójne interfejsu jest zdefiniowany w osadzonych IDL, konkretnego interfejsu podstawowej liście, nie jest modyfikowany.
Coclass atrybut także udostępnia następujące funkcje poprzez kod lub w przypadku GetObjectCLSID, jako statyczna metoda w klasie bazowej CComCoClass:
UpdateRegistryrejestruje fabryk klas klasy docelowej.
GetObjectCLSID, które jest związane z rejestracją, może również służyć do uzyskiwania CLSID klasy docelowej.
GetObjectFriendlyName domyślnie zwraca ciąg formatu "<nazwę klasy docelowej> Object".Jeśli ta funkcja jest już obecny, nie jest dodawany.Tej funkcji należy dodać do klasy docelowej do zwracania bardziej przyjazny nazwy niż generowane automatycznie.
GetProgID, który jest powiązany z rejestracji, zwraca ciąg znaków określony z progid atrybut.
GetVersionIndependentProgID ma taką samą funkcjonalność jak GetProgID, ale zwraca ciąg określony z vi_progid.
Następujące zmiany, które są związane z mapy COM, są wprowadzone do klasy docelowej:
Mapa COM dodaje się wpisy dla wszystkich interfejsów klasy docelowej pochodzi od i wszystkie wpisy określone przez Punkty wejścia interfejsu COM atrybutu lub wymagane przez agregatów atrybut.
OBJECT_ENTRY_AUTO makro jest wstawiany do mapy COM.To makro jest podobny do OBJECT_ENTRY w zakresie funkcjonalności, ale nie muszą być częścią mapę COM klasy docelowej.
Nazwa coclass, wygenerowany w pliku .idl dla klasy mają taką samą nazwę jak klasy.Na przykład i odnoszące się do poniższego przykładu Identyfikatora klasy dla coclass CMyClass, na kliencie za pomocą pliku nagłówka wygenerowane MIDL dostęp do użyć CLSID_CMyClass.
Przykład
Poniższy kod pokazuje, jak używać coclass atrybut:
// 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 {};
Poniższy przykład pokazuje, jak zastąpić Domyślna implementacja funkcji, która pojawia się w kodzie wtryskiwanego poprzez coclass atrybut.Zobacz /Fx Aby uzyskać więcej informacji dotyczących przeglądania kod.Wszelkich podstawowych klas lub interfejsów, które używają dla klasy, będą wyświetlane w kod. Ponadto jeśli klasa jest uwzględniane domyślnie w kodzie wniesiony, należy jawnie określić tej klasy jako podstawy dla użytkownika coclass dostawcy atrybut użyć formularz określony w kodzie.
// 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);
}
};
Wymagania
Atrybutu kontekstu
Stosuje się do |
Klasa,struct |
Powtarzalne |
Nr |
Wymagane atrybuty |
Brak |
Nieprawidłowe atrybuty |
Brak |
Aby uzyskać więcej informacji na temat kontekstów atrybutu, zobacz Kontekstów atrybutu.