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