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


Метод 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"
Этот параметр может иметь значение NULL.

[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, используя одну из следующих двух стратегий:
    1. Выполнение зависимых запросов с потоком, полученным из WMI.
    2. Выполнение зависимых запросов с помощью нового потока, созданного поставщиком.
  • Все поставщики должны возвращать поток, полученный из WMI.
  • WMI ни при каких обстоятельствах не позволяет поставщику блокировать поток, полученный из WMI.

    Опасность не тщательной обработки потоков, предоставляемых WMI, заключается в том, что поставщик может получить все потоки в пуле потоков WMI и продолжить блокировать эти потоки. Это приведет к взаимоблокировке системы.

Вы можете реализовать поставщика в процессе. Внутрипроцессный поставщик, который должен подключаться к WMI отдельно от процесса инициализации, должен использовать идентификатор класса CLSID_WbemAdministrativeLocator для доступа к IWbemLocator в вызове CoCreateInstance.

В следующем примере кода описывается использование идентификатора 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

См. также раздел

IWbemProviderInit

Инициализация поставщика