Udostępnij za pośrednictwem


coclass

Tworzy obiekt COM, który może implementować interfejs COM.

Składnia

[coclass]

Uwagi

Atrybut coclass C++ umieszcza konstrukcję coclass w wygenerowanym pliku idl.

Podczas definiowania coclass można również określić atrybuty uuid, version, threading, vi_progid i progid. Jeśli którykolwiek z nich nie zostanie określony, zostanie wygenerowany.

Jeśli dwa pliki nagłówkowe zawierają klasy z atrybutem coclass i nie określają identyfikatora GUID, kompilator użyje tego samego identyfikatora GUID dla obu klas i spowoduje to błąd MIDL. W związku z tym należy użyć atrybutu podczas używania uuidcoclass.

Projekty ATL

Gdy ten atrybut poprzedza definicję klasy lub struktury w projekcie ATL, jest to:

  • Wprowadza kod lub dane do obsługi automatycznej rejestracji obiektu.

  • Wprowadza kod lub dane do obsługi fabryki klas COM dla obiektu.

  • Wprowadza kod lub dane w celu zaimplementowania IUnknown i utworzenia obiektu obiektu COM-creatable.

W szczególności następujące klasy bazowe są dodawane do obiektu docelowego:

  • Klasa CComCoClass udostępnia domyślną fabrykę klas i model agregacji dla obiektu.

  • Klasa CComObjectRootEx ma szablon oparty na klasie modelu wątkowania określonej przez atrybut wątkowania . threading Jeśli atrybut nie zostanie określony, domyślnym modelem wątkowania jest apartament.

  • Element IProvideClassInfo2Impl jest dodawany, jeśli atrybut niekreatable nie został określony dla obiektu docelowego.

Na koniec każdy podwójny interfejs, który nie jest zdefiniowany przy użyciu osadzonego języka IDL, jest zastępowany odpowiednią klasą IDispatchImpl . Jeśli interfejs podwójny jest zdefiniowany w osadzonym języku IDL, określony interfejs na liście podstawowej nie jest modyfikowany.

Atrybut coclass udostępnia również następujące funkcje za pośrednictwem wprowadzonego kodu lub w przypadku GetObjectCLSIDmetody statycznej w klasie CComCoClassbazowej :

  • UpdateRegistry rejestruje fabryki klas klasy klasy docelowej.

  • GetObjectCLSID, który jest związany z rejestracją, może również służyć do uzyskania identyfikatora CLSID klasy docelowej.

  • GetObjectFriendlyName domyślnie zwraca ciąg formatu "<nazwa>Object klasy docelowej". Jeśli ta funkcja jest już obecna, nie jest dodawana. Dodaj tę funkcję do klasy docelowej, aby zwrócić bardziej przyjazną nazwę niż ta, która została wygenerowana automatycznie.

  • GetProgID, który jest związany z rejestracją, zwraca ciąg określony za pomocą atrybutu progid .

  • GetVersionIndependentProgID ma taką samą funkcjonalność jak GetProgID, ale zwraca ciąg określony za pomocą vi_progid.

Następujące zmiany, które są powiązane z mapą MODELU COM, są wprowadzane do klasy docelowej:

  • Mapa COM jest dodawana z wpisami dla wszystkich interfejsów, z których pochodzi klasa docelowa, a wszystkie wpisy określone przez atrybut punkty wejścia interfejsu COM lub te wymagane przez atrybut agregacji .

  • Makro OBJECT_ENTRY_AUTO jest wstawione do mapy COM.

Nazwa coclass wygenerowanej w pliku idl dla klasy będzie mieć taką samą nazwę jak klasa. Na przykład i odwołując się do poniższego przykładu, aby uzyskać dostęp do identyfikatora klasy dla coclass CMyClass, w kliencie za pośrednictwem pliku nagłówka wygenerowanego przez MIDL użyj polecenia CLSID_CMyClass.

Przykład

Poniższy kod pokazuje, jak używać atrybutu 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 {};

Poniższy przykład pokazuje, jak zastąpić domyślną implementację funkcji, która pojawia się w kodzie wstrzykiwanym przez atrybut coclass . Zobacz /Fx , aby uzyskać więcej informacji na temat wyświetlania wprowadzonego kodu. Wszystkie klasy bazowe lub interfejsy używane dla klasy będą wyświetlane w wstrzykniętym kodzie. Ponadto, jeśli klasa jest domyślnie dołączona do wprowadzonego kodu i jawnie określisz, że klasa jako podstawa dla coclass, dostawca atrybutów użyje formularza określonego 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

Kontekst atrybutu Wartość
Dotyczy class, struct
Powtarzalne Nie.
Wymagane atrybuty None
Nieprawidłowe atrybuty None

Aby uzyskać więcej informacji na temat kontekstów atrybutów, zobacz Konteksty atrybutów.

Zobacz też

Atrybuty IDL
Atrybuty COM
Atrybuty klasy
Atrybuty Typedef, Enum, Union oraz Struct
appobject