Поделиться через


coclass

Создает COM-объект, который может реализовать COM-интерфейс.

Синтаксис

[coclass]

Замечания

Атрибут coclass C++ помещает в созданный IDL-файл сокласс конструкцию.

При определении сокласса можно также указать атрибуты uuid, version, threading, vi_progid и progid. Если какой-либо из них не указан, он будет создан.

Если два файла заголовка содержат классы с атрибутом coclass и не указывают GUID, компилятор будет использовать один и тот же GUID для обоих классов, и это приведет к ошибке MIDL. Поэтому при использовании сокласса uuidследует использовать атрибут.

Проекты ATL

Если этот атрибут предшествует определению класса или структуры в проекте ATL, он:

  • Внедряет код или данные для поддержки автоматической регистрации объекта.

  • Внедряет код или данные для поддержки фабрики классов COM для объекта.

  • Внедряет код или данные для реализации IUnknown и создания объекта com-creatable.

В частности, в целевой объект добавляются следующие базовые классы:

Наконец, любой двойной интерфейс, который не определен с помощью встроенного IDL, заменяется соответствующим классом IDispatchImpl . Если двойной интерфейс определен в внедренном IDL, конкретный интерфейс в базовом списке не изменяется.

Атрибут coclass также делает следующие функции доступными через внедренный код или в случае GetObjectCLSIDстатического метода в базовом классе CComCoClass:

  • UpdateRegistry регистрирует фабрики классов целевого класса.

  • GetObjectCLSID, который связан с регистрацией, также можно использовать для получения CLSID целевого класса.

  • GetObjectFriendlyName по умолчанию возвращает строку формата "<имя>Object целевого класса". Если эта функция уже присутствует, она не добавляется. Добавьте эту функцию в целевой класс, чтобы вернуть более дружественное имя, чем автоматически созданное.

  • GetProgID, связанный с регистрацией, возвращает строку, указанную атрибутом progid .

  • GetVersionIndependentProgID имеет ту же функциональность, что GetProgIDи строка, указанная в vi_progid.

Следующие изменения, связанные с картой COM, вносятся в целевой класс:

  • Карта COM добавляется с записями для всех интерфейсов целевого класса, производных от атрибута COM Interface Entry Points или необходимых атрибуту агрегатов .

  • Макрос OBJECT_ENTRY_AUTO вставляется в карту COM.

Имя сокласса, созданного в IDL-файле для класса, будет иметь то же имя, что и класс. Например, и ссылаясь на следующий пример, чтобы получить доступ к идентификатору класса для сокласса CMyClass, в клиенте через созданный MIDL файл заголовка, используйте CLSID_CMyClass.

Пример

В следующем коде показано, как использовать атрибут 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 {};

В следующем примере показано, как переопределить реализацию функции по умолчанию, которая отображается в коде, внедренном атрибутом сокласса. Дополнительные сведения о просмотре внедренного кода см. в разделе /Fx . Все базовые классы или интерфейсы, используемые для класса, будут отображаться в внедренном коде. Кроме того, если класс включен по умолчанию в внедренный код, и вы явно указываете этот класс в качестве базы для своего coclass, поставщик атрибутов будет использовать форму, указанную в коде.

// 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);
   }
};

Требования

Контекст атрибута Значение
Относится к class, struct
Повторяемый No
Обязательные атрибуты нет
Недопустимые атрибуты нет

Дополнительные сведения о контекстах атрибутов см. в разделе Контексты атрибутов.

См. также

Атрибуты IDL
Атрибуты COM
Атрибуты классов
Атрибуты Typedef, Enum, Union и Struct
appobject