Макросы сопоставления служб
Эти макросы определяют карты служб и записи.
Имя | Описание |
---|---|
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()
Пример
SERVICE_ENTRY
Указывает, что объект поддерживает идентификатор службы, указанный идентификатором SID.
SERVICE_ENTRY( SID )
Параметры
SID
Идентификатор службы.
Пример
SERVICE_ENTRY_CHAIN
Указывает IServiceProviderImpl::QueryService цепочки к объекту, указанному панком.
SERVICE_ENTRY_CHAIN( punk )
Параметры
панк
Указатель на интерфейс IUnknown , к которому следует приклинить.
Пример
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). Идентификатор объекта не предполагается при указании другого идентификатора службы.