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


Класс IServiceProviderImpl

Этот класс предоставляет реализацию IServiceProvider интерфейса по умолчанию.

Синтаксис

template <class T>
class ATL_NO_VTABLE IServiceProviderImpl : public IServiceProvider

Параметры

T
Класс, производный от IServiceProviderImpl.

Участники

Открытые методы

Имя Описание
IServiceProviderImpl::QueryService Создает или обращается к указанной службе и возвращает указатель интерфейса на указанный интерфейс для службы.

Замечания

Интерфейс IServiceProvider находит службу, указанную его GUID, и возвращает указатель интерфейса для запрошенного интерфейса в службе. Класс IServiceProviderImpl предоставляет реализацию этого интерфейса по умолчанию.

IServiceProviderImpl указывает один метод: QueryService, который создает или обращается к указанной службе и возвращает указатель интерфейса на указанный интерфейс для службы.

IServiceProviderImpl использует карту служб, начиная с BEGIN_SERVICE_MAP и заканчивая END_SERVICE_MAP.

Карта службы содержит две записи: SERVICE_ENTRY, указывающий указанный идентификатор службы (SID), поддерживаемый объектом, и SERVICE_ENTRY_CHAIN, который вызывает QueryService цепочку к другому объекту.

Иерархия наследования

IServiceProvider

IServiceProviderImpl

Требования

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

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). Идентификатор объекта не предполагается при указании другого идентификатора службы.

См. также

Общие сведения о классе