Метод IWbemProviderInit::Initialize (wbemprov.h)
Управление Windows вызывает метод IWbemProviderInit::Initialize для инициализации поставщика для получения клиентских запросов. Все типы поставщиков должны реализовывать этот метод.
Синтаксис
HRESULT Initialize(
[in] LPWSTR wszUser,
[in] LONG lFlags,
[in] LPWSTR wszNamespace,
[in] LPWSTR wszLocale,
[in] IWbemServices *pNamespace,
[in] IWbemContext *pCtx,
[in] IWbemProviderInitSink *pInitSink
);
Параметры
[in] wszUser
Указатель на имя пользователя, если в экземпляре регистрации __Win32Provider для этого поставщика была запрошена инициализация для каждого пользователя. В противном случае это значение равно NULL.
Имейте в виду, что этот параметр имеет значение NULL для поставщиков потребителей событий независимо от значения свойства PerUserInitialization в экземпляре __Win32Provider для поставщика.
[in] lFlags
Зарезервировано. Этот параметр должен иметь значение 0 (ноль).
[in] wszNamespace
Имя пространства имен, для которого инициализируется поставщик.
[in] wszLocale
Имя языкового стандарта, для которого инициализируется поставщик.
Строка следующего формата, где шестнадцатеричное значение является стандартным значением LCID Майкрософт:
- "MS_409"
[in] pNamespace
Указатель IWbemServices на управление Windows. Этот указатель может обслуживать любые запросы, сделанные поставщиком. Поставщик должен использовать метод IWbemProviderInit::AddRef для этого указателя, если он собирается вызвать управление Windows во время его выполнения.
[in] pCtx
Указатель IWbemContext, связанный с инициализацией. Этот параметр может иметь значение NULL.
Если поставщик будет выполнять запросы обратно в управление Windows перед завершением инициализации, он должен использовать метод IWbemProviderInit::AddRef для этого указателя. Дополнительные сведения см. в разделе Вызовы WMI.
В случае, если поставщик должен выполнить зависимый запрос от другого поставщика, необходимо передать эту строку контекста обратно в инструментарий WMI, чтобы избежать потенциальных блокировок. Однако в случае независимого запроса это необязательно, и WMI создает для него новую строку контекста.
[in] pInitSink
Указатель IWbemProviderInitSink , используемый поставщиком для сообщения о состоянии инициализации.
Возвращаемое значение
Поставщик должен вернуть WBEM_S_NO_ERROR и указать его состояние с помощью предоставленного приемника объекта в параметре pInitSink . Однако если поставщик возвращает WBEM_E_FAILED и не использует приемник, то инициализация поставщика считается неудачной.
Комментарии
Как правило, поставщик реализует COM-объект с использованием множественного наследования для поддержки как интерфейса IWbemProviderInit , так и его основного интерфейса, например IWbemServices или IWbemEventProvider.
Состояние инициализации сообщается путем вызова IWbemProviderInitSink::SetStatus. Этот метод можно вызывать несколько раз, чтобы при необходимости сообщать о добавочном состоянии. Поставщик должен увеличить количество ссылок для этого указателя, вызвав его метод IWbemProviderInit::AddRef , прежде чем использовать его для передачи состояния управлению Windows.
Поставщик может использовать указатель IWbemProviderInitSink синхронно, как показано в следующем примере кода.
HRESULT SampleProvider::Initialize(
/* [unique][in] */ LPWSTR wszUser,
/* [in] */ LONG lFlags,
/* [in] */ LPWSTR wszNamespace,
/* [unique][in] */ LPWSTR wszLocale,
/* [in] */ IWbemServices __RPC_FAR *pNamespace,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink
)
{
// Use AddRef on the pNamespace pointer, if required.
// Analyze other parameters.
// Tell Windows Management that you are initialized.
pInitSink->SetStatus(WBEM_S_INITIALIZED, 0);
return WBEM_S_NO_ERROR;
}
Поставщик также может использовать метод AddRef для указателя и создать отдельный поток для завершения его инициализации и немедленного возврата из вызова.
Процесс инициализации некоторых поставщиков может включать обратный вызов в WMI. Поставщик, который вызывает WMI и должен ждать завершения этого вызова, называется зависимым поставщиком. Аналогичным образом вызов WMI называется зависимым запросом. При реализации инициализации инструментарий WMI требует, чтобы зависимый поставщик подчинялся следующим правилам:
-
Зависимые запросы должны повторно использовать указатель IWbemContext , который WMI передал в Initialize.
Это означает, что все вызовы WMI, выполненные во время инициализации, должны повторно использовать указатель IWbemContext , переданный WMI. Невыполнение этого действия может привести к взаимоблокировке.
- Независимые запросы не должны повторно использовать указатель IWbemContext .
-
Зависимые поставщики должны отправлять запросы к WMI, используя одну из следующих двух стратегий:
- Выполнение зависимых запросов с потоком, полученным из WMI.
- Выполнение зависимых запросов с помощью нового потока, созданного поставщиком.
- Все поставщики должны возвращать поток, полученный из WMI.
-
WMI ни при каких обстоятельствах не позволяет поставщику блокировать поток, полученный из WMI.
Опасность не тщательной обработки потоков, предоставляемых WMI, заключается в том, что поставщик может получить все потоки в пуле потоков WMI и продолжить блокировать эти потоки. Это приведет к взаимоблокировке системы.
В следующем примере кода описывается использование идентификатора CLSID_WbemAdministrativeLocator в таком вызове.
IWbemLocator *pLoc = 0;
DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
Неиспользование идентификатора CLSID_WbemAdministrativeLocator приводит к ошибке "Отказано в доступе". Дополнительные сведения о подключении к WMI см. в разделе Создание приложения или скрипта WMI.
Примеры
В следующем примере кода описывается реализация initialize для поставщика потребителя событий.
HRESULT CMyEventConsumer::Initialize(
/* [in] */ LPWSTR pszUser,
/* [in] */ LONG lFlags,
/* [in] */ LPWSTR pszNamespace,
/* [in] */ LPWSTR pszLocale,
/* [in] */ IWbemServices __RPC_FAR *pNamespace,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink
)
{
pInitSink->SetStatus(WBEM_S_INITIALIZED, 0);
// Optionally, examine the namespace, locale, and so on
// being used.
return WBEM_S_NO_ERROR;
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows Vista |
Минимальная версия сервера | Windows Server 2008 |
Целевая платформа | Windows |
Header | wbemprov.h (включая Wbemidl.h) |
Библиотека | Wbemuuid.lib |
DLL | Wbemsvc.dll |