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


Класс CComCoClass

Этот класс предоставляет методы для создания экземпляров класса и получения его свойств.

Синтаксис

template <class T, const CLSID* pclsid = &CLSID_NULL>
class CComCoClass

Параметры

T
Класс, производный от CComCoClass.

pclsid
Указатель на CLSID объекта.

Участники

Открытые методы

Имя Описание
CComCoClass::CreateInstance (статический) Создает экземпляр класса и запросов для интерфейса.
CComCoClass::Error (статический) Возвращает подробные сведения об ошибке клиенту.
CComCoClass::GetObjectCLSID (статический) Возвращает идентификатор класса объекта.
CComCoClass::GetObjectDescription (статический) Переопределите, чтобы вернуть описание объекта.

Замечания

CComCoClass предоставляет методы для получения CLSID объекта, задания сведений об ошибке и создания экземпляров класса. Любой класс, зарегистрированный на карте объектов, должен быть производным от CComCoClass.

CComCoClass также определяет фабрику классов по умолчанию и модель агрегирования для объекта. CComCoClass использует следующие два макроса:

  • DECLARE_CLASSFACTORY Объявляет фабрику классов для CComClassFactory.

  • DECLARE_AGGREGATABLE объявляет, что объект можно агрегировать.

Вы можете переопределить любой из этих значений по умолчанию, указав другой макрос в определении класса. Например, чтобы использовать CComClassFactory2 вместо CComClassFactoryэтого, укажите макрос DECLARE_CLASSFACTORY2 :

class ATL_NO_VTABLE CMyClass2 :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyClass2, &CLSID_MyClass>,
   public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public IDispatchImpl<IMyDualInterface, &__uuidof(IMyDualInterface), &LIBID_NVC_ATL_COMLib, /* wMajor = */ 1, /* wMinor = */ 0>
{
public:
   DECLARE_CLASSFACTORY2(CMyLicense)

   // Remainder of class declaration omitted

Requirements

Заголовок: atlcom.h

CComCoClass::CreateInstance

Используйте эти CreateInstance функции для создания экземпляра COM-объекта и извлечения указателя интерфейса без использования COM-API.

template <class  Q>
static HRESULT CreateInstance( Q** pp);

template <class  Q>
static HRESULT CreateInstance(IUnknown* punkOuter, Q** pp);

Параметры

Q
COM-интерфейс, который должен быть возвращен через pp.

punkOuter
[in] Внешний неизвестный или контролируемый неизвестным агрегатом.

Pp
[out] Адрес переменной указателя, получающей запрошенный указатель интерфейса при успешном создании.

Возвращаемое значение

Стандартное значение HRESULT. Описание возможных возвращаемых значений см. в разделе CoCreateInstance в пакете SDK для Windows.

Замечания

Используйте первую перегрузку этой функции для типичного создания объектов; используйте вторую перегрузку, если необходимо агрегировать созданный объект.

Класс ATL, реализующий обязательный COM-объект (т. е. класс, используемый в качестве первого параметра шаблона для CComCoClass), должен находиться в том же проекте, что и вызывающий код. Создание COM-объекта выполняется фабрикой классов, зарегистрированной для этого класса ATL.

Эти функции полезны для создания объектов, которые вы не позволили создавать внешние функции с помощью макроса OBJECT_ENTRY_NON_CREATEABLE_EX_AUTO . Они также полезны в ситуациях, когда вы хотите избежать COM-API по соображениям эффективности.

Обратите внимание, что интерфейс Q должен иметь идентификатор IID, который можно получить с помощью оператора __uuidof .

Пример

В следующем примере создается класс ATL, CDocument созданный мастером, IDocument производный от CComCoClass этого интерфейса. Класс регистрируется на карте объектов с помощью макроса OBJECT_ENTRY_NON_CREATEABLE_EX_AUTO, чтобы клиенты не могли создавать экземпляры документа с помощью CoCreateInstance. CApplication — coClass, который предоставляет метод на одном из собственных COM-интерфейсов для создания экземпляров класса документов. В приведенном ниже коде показано, как легко создавать экземпляры класса документов с помощью элемента, CreateInstance унаследованного от CComCoClass базового класса.

STDMETHODIMP CMyApp::CreateDocument( /* [out, retval] */ IDocument** ppDoc)
{
   *ppDoc = NULL;
   return CMyDoc::CreateInstance(ppDoc);
}

CComCoClass::Error

Эта статическую функцию настраивает IErrorInfo интерфейс для предоставления клиенту сведений об ошибках.

static HRESULT WINAPI Error(
    LPCOLESTR lpszDesc,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

static HRESULT WINAPI Error(
    LPCOLESTR lpszDesc,
    DWORD dwHelpID,
    LPCOLESTR lpszHelpFile,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

static HRESULT WINAPI Error(
    LPCSTR lpszDesc,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

static HRESULT WINAPI Error(
    LPCSTR lpszDesc,
    DWORD dwHelpID,
    LPCSTR lpszHelpFile,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

static HRESULT WINAPI Error(
    UINT nID,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0,
    HINSTANCE hInst = _AtlBaseModule.GetResourceInstance ());

static HRESULT Error(
    UINT nID,
    DWORD dwHelpID,
    LPCOLESTR lpszHelpFile,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0,
    HINSTANCE hInst = _AtlBaseModule.GetResourceInstance());

Параметры

lpszDesc
[in] Строка, описывающая ошибку. Версия Юникода Error указывает, что lpszDesc имеет тип LPCOLESTR; версия ANSI указывает тип LPCSTR.

Iid
[in] IiD интерфейса, определяющего ошибку или GUID_NULL (значение по умолчанию), если ошибка определена операционной системой.

hRes
[in] HRESULT, который вы хотите вернуть вызывающему объекту. Значение по умолчанию равно 0. Дополнительные сведения о hRes см. в разделе "Примечания".

Nid
[in] Идентификатор ресурса, в котором хранится строка описания ошибки. Это значение должно лежать между 0x0200 и 0xFFFF включительно. В отладочных сборках утверждение приведет к тому, что nID не индексирует допустимую строку. В сборках выпуска строка описания ошибки будет иметь значение "Неизвестная ошибка".

dwHelpID
[in] Идентификатор контекста справки для ошибки.

lpszHelpFile
[in] Путь и имя файла справки, описывающего ошибку.

hInst
[in] Дескриптор ресурса. По умолчанию этот параметр является _AtlModule::GetResourceInstance_AtlModule глобальным экземпляром CAtlModule.

Возвращаемое значение

Стандартное значение HRESULT. Дополнительные сведения см. в разделе "Заметки".

Замечания

Для вызова Errorобъект должен реализовать ISupportErrorInfo интерфейс.

Если параметр hRes не является ненулевой, Error возвращает значение hRes. Если hRes равно нулю, первые четыре версии возвращаемого Error DISP_E_EXCEPTION. Последние две версии возвращают результат макроса MAKE_HRESULT(1, FACILITY_ITF,nID).

CComCoClass::GetObjectCLSID

Предоставляет согласованный способ получения CLSID объекта.

static const CLSID& WINAPI GetObjectCLSID();

Возвращаемое значение

Идентификатор класса объекта.

CComCoClass::GetObjectDescription

Эта статическую функцию извлекает текстовое описание объекта класса.

static LPCTSTR WINAPI GetObjectDescription();

Возвращаемое значение

Описание объекта класса.

Замечания

Реализация по умолчанию возвращает ЗНАЧЕНИЕ NULL. Этот метод можно переопределить с помощью макроса DECLARE_OBJECT_DESCRIPTION . Например:

class ATL_NO_VTABLE CMyDoc :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyDoc, &CLSID_MyDoc>,
   public IDocument
{
public:
   DECLARE_OBJECT_DESCRIPTION("My Document Object 1.0")

   // Remainder of class declaration omitted.

GetObjectDescription вызывается IComponentRegistrar::GetComponents. IComponentRegistrar — это интерфейс службы автоматизации, позволяющий регистрировать и отменять регистрацию отдельных компонентов в библиотеке DLL. При создании объекта Регистратора компонентов с помощью мастера проектов ATL мастер автоматически реализует IComponentRegistrar интерфейс. IComponentRegistrar обычно используется сервером транзакций Майкрософт.

Дополнительные сведения о мастере проектов ATL см. в статье "Создание проекта ATL".

См. также

Общие сведения о классе