Макросы 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_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.