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