coclass
Создает COM-объект, который может реализовать COM-интерфейс.
Синтаксис
[coclass]
Замечания
Атрибут coclass C++ помещает в созданный IDL-файл сокласс конструкцию.
При определении сокласса можно также указать атрибуты uuid, version, threading, vi_progid и progid. Если какой-либо из них не указан, он будет создан.
Если два файла заголовка содержат классы с атрибутом coclass и не указывают GUID, компилятор будет использовать один и тот же GUID для обоих классов, и это приведет к ошибке MIDL. Поэтому при использовании сокласса uuid
следует использовать атрибут.
Проекты ATL
Если этот атрибут предшествует определению класса или структуры в проекте ATL, он:
Внедряет код или данные для поддержки автоматической регистрации объекта.
Внедряет код или данные для поддержки фабрики классов COM для объекта.
Внедряет код или данные для реализации
IUnknown
и создания объекта com-creatable.
В частности, в целевой объект добавляются следующие базовые классы:
Класс CComCoClass предоставляет фабрику классов по умолчанию и модель агрегирования для объекта.
Класс CComObjectRootEx имеет шаблон на основе класса модели потоков, указанного атрибутом потоков .
threading
Если атрибут не указан, модель потоков по умолчанию — это квартира.Добавляется IProvideClassInfo2Impl , если для целевого объекта не указан атрибут noncreatable .
Наконец, любой двойной интерфейс, который не определен с помощью встроенного 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