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


IServiceProviderImpl::QueryService

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

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

Параметры

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

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

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

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

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

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

Значение

S_OK

Служба была успешно создана или восстановлена.

E_INVALIDARG

Один или несколько аргументов являются недопустимыми.

E_OUTOFMEMORY

Память недостаточна для создания службы.

E_UNEXPECTED

Неизвестная ошибка.

E_NOINTERFACE

Запрошенный интерфейс не является частью этой службы или служба неизвестна.

Заметки

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

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

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

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

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

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

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

Требования

Header: atlcom.h

См. также

Ссылки

IServiceProviderImpl Class

BEGIN_SERVICE_MAP