Класс 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
Требования
Заголовок: 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".