Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Замечание
Библиотека активных шаблонов (ATL) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.
Эти макросы вводят интерфейсы объекта в карту 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.