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


Макросы сопоставления служб

Эти макросы определяют карты служб и записи.

Имя Описание
BEGIN_SERVICE_MAP Помечает начало карты службы ATL.
END_SERVICE_MAP Помечает конец карты службы ATL.
SERVICE_ENTRY Указывает, что объект поддерживает определенный идентификатор службы.
SERVICE_ENTRY_CHAIN Указывает IServiceProviderImpl::QueryService цепочки с указанным объектом.

Требования

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

BEGIN_SERVICE_MAP

Помечает начало карты служб.

BEGIN_SERVICE_MAP(theClass)

Параметры

TheClass
[in] Указывает класс, содержащий карту службы.

Замечания

Используйте карту службы для реализации функций поставщика услуг в объекте COM. Сначала необходимо наследить класс от IServiceProviderImpl. Существует два типа записей:

  • SERVICE_ENTRY Указывает поддержку указанного идентификатора службы (SID).

  • SERVICE_ENTRY_CHAIN Инструктирует IServiceProviderImpl::QueryService цепочку с другим заданным объектом.

Пример

BEGIN_SERVICE_MAP(CMyService)
   SERVICE_ENTRY(SID_SBindHost)  // This object supports the SBindHost service
   SERVICE_ENTRY_CHAIN(m_spClientSite) // Everything else, just ask the container
END_SERVICE_MAP()

END_SERVICE_MAP

Помечает конец карты служб.

END_SERVICE_MAP()

Пример

Пример BEGIN_SERVICE_MAP.

SERVICE_ENTRY

Указывает, что объект поддерживает идентификатор службы, указанный идентификатором SID.

SERVICE_ENTRY( SID )

Параметры

SID
Идентификатор службы.

Пример

Пример BEGIN_SERVICE_MAP.

SERVICE_ENTRY_CHAIN

Указывает IServiceProviderImpl::QueryService цепочки к объекту, указанному панком.

SERVICE_ENTRY_CHAIN( punk )

Параметры

Панк
Указатель на интерфейс IUnknown , к которому следует приклинить.

Пример

Пример BEGIN_SERVICE_MAP.

IServiceProviderImpl::QueryService

Создает или обращается к указанной службе и возвращает указатель интерфейса на указанный интерфейс для службы.

STDMETHOD(QueryService)(
    REFGUID guidService,
    REFIID riid,
    void** ppvObject);

Параметры

guidService
[in] Указатель на идентификатор службы (SID).

riid
[in] Идентификатор интерфейса, к которому вызывающий объект получает доступ.

ppvObj
[out] Косвенный указатель на запрошенный интерфейс.

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

Возвращенное HRESULT является одним из следующих значений:

Возвращаемое значение Значение
S_OK Служба успешно создана или извлечена.
E_INVALIDARG Один или несколько аргументов являются недопустимыми.
E_OUTOFMEMORY Недостаточно памяти для создания службы.
E_UNEXPECTED Произошла неизвестная ошибка.
E_NOINTERFACE Запрошенный интерфейс не является частью этой службы, или служба неизвестна.

Замечания

QueryService возвращает косвенный указатель на запрошенный интерфейс в указанной службе. Вызывающий объект отвечает за освобождение этого указателя, если он больше не требуется.

При вызове QueryServiceвы передаете идентификатор службы (guidService) и идентификатор интерфейса (riid). GuidService указывает службу, к которой требуется доступ, и riid определяет интерфейс, который является частью службы. В свою очередь, вы получаете косвенный указатель на интерфейс.

Объект, реализующий интерфейс, также может реализовывать интерфейсы, которые являются частью других служб. Рассмотрим следующие возможности:

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

  • В отличие от вызовов QueryInterface, передача другого идентификатора службы не обязательно означает, что возвращается другой объект объект объектной модели компонента (COM).

  • Возвращаемый объект может иметь другие интерфейсы, которые не являются частью определения службы.

Две разные службы, такие как SID_SMyService и SID_SYourService, могут указывать использование одного и того же интерфейса, даже если реализация интерфейса может не иметь ничего общего между двумя службами. Этот подход работает, так как вызов QueryService (SID_SMyService, IID_IDispatch) может возвращать объект, отличный QueryService от (SID_SYourService, IID_IDispatch). Идентификатор объекта не предполагается при указании другого идентификатора службы.

См. также

Макросы