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


Макросы COM_INTERFACE_ENTRY

Эти макросы вводят интерфейсы объекта в карту COM, чтобы получить доступ к QueryInterfaceней. Порядок записей в com-карте — это интерфейсы заказа, которые будут проверяться на наличие соответствующего IID во время QueryInterface.

Макрос Description
COM_INTERFACE_ENTRY Вводит интерфейсы в карту com-интерфейса.
COM_INTERFACE_ENTRY2 Используйте этот макрос для диамбигуации двух ветвей наследования.
COM_INTERFACE_ENTRY_IID Используйте этот макрос, чтобы ввести интерфейс в карту COM и указать его IID.
COM_INTERFACE_ENTRY2_IID То же, что и COM_INTERFACE_ENTRY2, за исключением того, что можно указать другой идентификатор IID.
COM_INTERFACE_ENTRY_AGGREGATE Когда интерфейс, определяемый iid , запрашивается, COM_INTERFACE_ENTRY_AGGREGATE перенаправляется в punk.
COM_INTERFACE_ENTRY_AGGREGATE_BLIND То же, что и COM_INTERFACE_ENTRY_AGGREGATE, за исключением того, что запрос на любой идентификатор IID приводит к переадресации запроса на панк.
COM_INTERFACE_ENTRY_AUTOAGGREGATE То же, что и COM_INTERFACE_ENTRY_AGGREGATE, за исключением того, что панк имеет значение NULL, он автоматически создает агрегат, описанный clsid.
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND То же, что и COM_INTERFACE_ENTRY_AUTOAGGREGATE, за исключением того, что запрос на любой идентификатор IID приводит к переадресации запроса на панк, а если панк имеет значение NULL, автоматически создает агрегат, описанный clsid.
COM_INTERFACE_ENTRY_BREAK Заставляет программу вызывать DebugBreak , когда указанный интерфейс запрашивается.
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF Сохраняет данные, относящиеся к интерфейсу для каждого экземпляра.
COM_INTERFACE_ENTRY_TEAR_OFF Предоставляет интерфейсы отключения.
COM_INTERFACE_ENTRY_CHAIN Обрабатывает com-карту базового класса, когда обработка достигает этой записи на карте COM.
COM_INTERFACE_ENTRY_FUNC Общий механизм перехвата логики QueryInterface ATL.
COM_INTERFACE_ENTRY_FUNC_BLIND То же, что и COM_INTERFACE_ENTRY_FUNC, за исключением того, что запрос на любой идентификатор IID приводит к вызову func.
COM_INTERFACE_ENTRY_NOINTERFACE Возвращает E_NOINTERFACE и завершает обработку com-карты при запросе указанного интерфейса.

Требования

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

COM_INTERFACE_ENTRY

Вводит интерфейсы в карту com-интерфейса.

Синтаксис

COM_INTERFACE_ENTRY( x )

Параметры

x
[in] Имя интерфейса, наследуемого объектом класса, напрямую.

Замечания

Как правило, это наиболее часто используемый тип записи.

Пример

BEGIN_COM_MAP(CThisExample)
   COM_INTERFACE_ENTRY(IThisExample)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

Требования

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

COM_INTERFACE_ENTRY2

Используйте этот макрос для диамбигуации двух ветвей наследования.

COM_INTERFACE_ENTRY2(x, x2)

Параметры

x
[in] Имя интерфейса, который требуется предоставить из объекта.

x2
[in] Имя ветви наследования, из которой предоставляется x .

Замечания

Например, если вы наследуете объект класса из двух двух интерфейсов, вы предоставляете IDispatch использование COM_INTERFACE_ENTRY2, так как IDispatch их можно получить из одного из интерфейсов.

Пример

class ATL_NO_VTABLE CEntry2Example :
   public CEntry2ExampleBase, // CEntry2ExampleBase derives from IDispatch
   public IDispatchImpl<IEntry2Example, &IID_IEntry2Example, &LIBID_NVC_ATL_WindowingLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public CComCoClass<CEntry2Example, &CLSID_Entry2Example>
{
public:
   CEntry2Example()
   {
   }

BEGIN_COM_MAP(CEntry2Example)
   COM_INTERFACE_ENTRY(IEntry2Example)
   COM_INTERFACE_ENTRY2(IDispatch, IEntry2Example)
END_COM_MAP()
};

COM_INTERFACE_ENTRY_IID

Используйте этот макрос, чтобы ввести интерфейс в карту COM и указать его IID.

COM_INTERFACE_ENTRY_IID(iid, x)

Параметры

iid
[in] Идентификатор GUID предоставленного интерфейса.

x
[in] Имя класса, vtable которого будет предоставляться в качестве интерфейса, определяемого iid.

Пример

BEGIN_COM_MAP(CExample)
   COM_INTERFACE_ENTRY(IExample)
   COM_INTERFACE_ENTRY_IID(IID_IDispatch, CExampleDispatch)
   COM_INTERFACE_ENTRY(IExampleBase)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

COM_INTERFACE_ENTRY2_IID

То же, что и COM_INTERFACE_ENTRY2, за исключением того, что можно указать другой идентификатор IID.

COM_INTERFACE_ENTRY2_IID(iid, x, x2)

Параметры

iid
[in] Идентификатор GUID, указанный для интерфейса.

x
[in] Имя интерфейса, наследуемого объектом класса напрямую.

x2
[in] Имя второго интерфейса, наследуемого объектом класса напрямую.

COM_INTERFACE_ENTRY_AGGREGATE

Когда интерфейс, определяемый iid , запрашивается, COM_INTERFACE_ENTRY_AGGREGATE перенаправляется на панк.

COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)

Параметры

iid
[in] Идентификатор GUID интерфейса, запрашиваемого.

панк
[in] Имя указателя IUnknown .

Замечания

Предполагается , что параметр punk указывает на внутренний неизвестный агрегат или значение NULL, в этом случае запись игнорируется. Как правило, статистическое выражение выполняется CoCreate в FinalConstruct.

Пример

BEGIN_COM_MAP(COuter1)
   COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IAgg), m_punkAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AGGREGATE_BLIND

То же, что и COM_INTERFACE_ENTRY_AGGREGATE, за исключением того, что запрос на любой идентификатор IID приводит к переадресации запроса на панк.

COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)

Параметры

панк
[in] Имя указателя IUnknown .

Замечания

Если запрос интерфейса завершается сбоем, обработка карты COM продолжается.

Пример

BEGIN_COM_MAP(COuter2)
   COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE

То же, что и COM_INTERFACE_ENTRY_AGGREGATE, за исключением того, что панк имеет значение NULL, он автоматически создает агрегат, описанный clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)

Параметры

iid
[in] Идентификатор GUID интерфейса, запрашиваемого.

панк
[in] Имя указателя IUnknown . Должен быть членом класса, содержащего карту COM.

clsid
[in] Идентификатор агрегата, который будет создан, если панк имеет значение NULL.

Замечания

Пример

BEGIN_COM_MAP(COuter3)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE(__uuidof(IAutoAgg), m_punkAutoAgg, CLSID_CAutoAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND

То же, что и COM_INTERFACE_ENTRY_AUTOAGGREGATE, за исключением того, что запрос на любой идентификатор IID приводит к переадресации запроса на панк, а если панк имеет значение NULL, автоматически создает агрегат, описанный clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)

Параметры

панк
[in] Имя указателя IUnknown . Должен быть членом класса, содержащего карту COM.

clsid
[in] Идентификатор агрегата, который будет создан, если панк имеет значение NULL.

Замечания

Если запрос интерфейса завершается сбоем, обработка карты COM продолжается.

Пример

BEGIN_COM_MAP(COuter4)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(m_punkAutoAggB, CLSID_CAutoAggB)
END_COM_MAP()

COM_INTERFACE_ENTRY_BREAK

Заставляет программу вызывать DebugBreak , когда указанный интерфейс запрашивается.

COM_INTERFACE_ENTRY_BREAK(x)

Параметры

x
[in] Текст, используемый для создания идентификатора интерфейса.

Замечания

Интерфейс IID будет создан путем добавления x к IID_. Например, если x имеет IPersistStorageзначение, будет иметь IID_IPersistStorageзначение IID.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF

Сохраняет данные, относящиеся к интерфейсу для каждого экземпляра.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)

Параметры

iid
[in] GUID интерфейса отключения.

x
[in] Имя класса, реализующего интерфейс.

панк
[in] Имя указателя IUnknown . Должен быть членом класса, содержащего карту COM. Следует инициализировать значение NULL в конструкторе объекта класса.

Замечания

Если интерфейс не используется, это снижает общий размер экземпляра объекта.

Пример

BEGIN_COM_MAP(COuter)
   COM_INTERFACE_ENTRY(IOuter)
   COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_ITearOff, CTearOff, punkTearOff)
END_COM_MAP()

COM_INTERFACE_ENTRY_TEAR_OFF

Предоставляет интерфейсы отключения.

COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)

Параметры

iid
[in] GUID интерфейса отключения.

x
[in] Имя класса, реализующего интерфейс.

Замечания

Интерфейс отключения реализуется как отдельный объект, который создается каждый раз, когда интерфейс, который он представляет, запрашивается. Как правило, вы создаете интерфейс в виде разрыва, если интерфейс редко используется, так как это сохраняет указатель vtable в каждом экземпляре основного объекта. Разрыв удаляется, когда его число ссылок становится нулевым. Класс, реализующий разрыв, должен быть производным от CComTearOffObjectBase и иметь собственную карту COM.

Пример

BEGIN_COM_MAP(CBeeper)
   COM_INTERFACE_ENTRY(IBeeper)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()

COM_INTERFACE_ENTRY_CHAIN

Обрабатывает com-карту базового класса, когда обработка достигает этой записи на карте COM.

COM_INTERFACE_ENTRY_CHAIN(classname)

Параметры

classname
[in] Базовый класс текущего объекта.

Замечания

Например, в следующем коде:

BEGIN_COM_MAP(COuterObject)
   COM_INTERFACE_ENTRY2(IDispatch, IOuterObject)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

Обратите внимание, что первая запись на карте COM должна быть интерфейсом объекта, содержащего карту COM. Таким образом, вы не можете запустить записи карты COM с COM_INTERFACE_ENTRY_CHAIN, что приводит к поиску com-карты другого объекта в точке, где COM_INTERFACE_ENTRY_CHAIN(COtherObject) отображается на карте COM объекта. Если вы хотите сначала выполнить поиск по com-карте другого объекта, добавьте запись интерфейса для IUnknown карты COM, а затем привязите карту COM другого объекта. Например:

BEGIN_COM_MAP(CThisObject)
   COM_INTERFACE_ENTRY(IUnknown)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

COM_INTERFACE_ENTRY_FUNC

Общий механизм перехвата логики QueryInterface ATL.

COM_INTERFACE_ENTRY_FUNC(iid, dw, func)

Параметры

iid
[in] Идентификатор GUID предоставленного интерфейса.

dw
[in] Параметр, передаваемый в func.

func
[in] Указатель функции, возвращающий iid.

Замечания

Если iid соответствует iiD интерфейса, запрашиваемого интерфейса, вызывается функция, указанная func . Объявление функции должно быть следующим:

HRESULT WINAPI func(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw);

При вызове pv функции указывает на объект класса. Параметр riid ссылается на интерфейс, ppv запрашиваемый, — это указатель на расположение, в котором функция должна хранить указатель на интерфейс, а dw — это параметр, указанный в записи. Функция должна иметь значение * NULL ppv и возвращать E_NOINTERFACE или S_FALSE, если она не возвращает интерфейс. При E_NOINTERFACE обработка карты COM завершается. При S_FALSE обработка карты COM продолжается, даже если указатель интерфейса не был возвращен. Если функция возвращает указатель интерфейса, он должен вернуть S_OK.

COM_INTERFACE_ENTRY_FUNC_BLIND

То же, что и COM_INTERFACE_ENTRY_FUNC, за исключением того, что запрос на любой идентификатор IID приводит к вызову func.

COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)

Параметры

dw
[in] Параметр, передаваемый в func.

func
[in] Функция, которая вызывается при обработке этой записи на карте COM.

Замечания

Любая ошибка приведет к продолжению обработки на карте COM. Если функция возвращает указатель интерфейса, он должен вернуть S_OK.

COM_INTERFACE_ENTRY_NOINTERFACE

Возвращает E_NOINTERFACE и завершает обработку com-карты при запросе указанного интерфейса.

COM_INTERFACE_ENTRY_NOINTERFACE(x)

Параметры

x
[in] Текст, используемый для создания идентификатора интерфейса.

Замечания

Этот макрос можно использовать для предотвращения использования интерфейса в конкретном случае. Например, этот макрос можно вставить в карту COM прямо перед COM_INTERFACE_ENTRY_AGGREGATE_BLIND, чтобы предотвратить перенаправление запроса на внутренний неизвестный интерфейс.

Интерфейс IID будет создан путем добавления x к IID_. Например, если x имеет IPersistStorageзначение, будет иметь IID_IPersistStorageзначение IID.