IWbemProviderInit::Initialize 方法 (wbemprov.h)

IWbemProviderInit::Initialize 方法由 Windows 管理调用,以初始化提供程序以接收客户端请求。 所有类型的提供程序都必须实现此方法。

语法

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

请注意,无论提供程序的 __Win32Provider 实例中的 PerUserInitialization 属性的值如何,事件使用者提供程序的此参数都设置为 NULL

[in] lFlags

保留。 此参数必须为 0 (零) 。

[in] wszNamespace

为其初始化提供程序的命名空间名称。

[in] wszLocale

要为其初始化提供程序的区域设置名称。

以下格式的字符串,其中十六进制值是 Microsoft 标准 LCID 值:

  • “MS_409”
此参数可以为 NULL

[in] pNamespace

返回 Windows 管理的 IWbemServices 指针。 此指针可以为提供程序发出的任何请求提供服务。 如果提供程序在执行期间要回调到 Windows Management,则应在此指针上使用 IWbemProviderInit::AddRef 方法。

[in] pCtx

与初始化关联的 IWbemContext 指针。 此参数可以为 NULL

如果提供程序将在完成初始化之前执行回 Windows 管理的请求,则应在此指针上使用 IWbemProviderInit::AddRef 方法。 有关详细信息,请参阅调用 WMI

如果提供程序必须对另一个提供程序发出依赖请求,则必须将此上下文字符串传递回 WMI 以避免潜在的锁定。 但是,对于独立请求,这不是必需的,WMI 会为其生成新的上下文字符串。

[in] pInitSink

提供程序用于报告初始化状态的 IWbemProviderInitSink 指针。

返回值

提供程序应返回 WBEM_S_NO_ERROR ,并使用 pInitSink 参数中提供的对象接收器指示其状态。 但是,如果提供程序返回 WBEM_E_FAILED 且不使用接收器,则提供程序初始化将被视为失败。

注解

通常,提供程序使用多重继承实现 COM 对象,以支持 IWbemProviderInit 接口及其主接口,例如 IWbemServicesIWbemEventProvider

通过调用 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 的调用称为依赖请求。 实现 Initialize 时,WMI 要求依赖提供程序遵守以下规则:

  • 依赖请求必须重复使用 WMI 传递给 InitializeIWbemContext 指针。

    这意味着,在初始化期间对 WMI 进行的任何调用都必须重复使用 WMI 传入的 IWbemContext 指针。 否则可能会导致死锁。

  • 非依赖请求不得重复使用 IWbemContext 指针。
  • 依赖提供程序必须使用以下两种策略之一向 WMI 发出请求:
    1. 使用从 WMI 接收的线程发出依赖请求。
    2. 使用提供程序创建的新线程发出依赖请求。
  • 所有提供程序都必须返回从 WMI 接收的线程。
  • 在任何情况下,WMI 都不允许提供程序阻止从 WMI 接收的线程。

    不仔细处理 WMI 传递的线程的危险是提供程序可能会获取 WMI 线程池中的所有线程,并继续阻止这些线程。 这将导致系统死锁。

可以选择在进程内实现提供程序。 必须独立于初始化过程连接到 WMI 的进程内提供程序必须使用 CLSID_WbemAdministrativeLocator 类标识符在调用 CoCreateInstance 时访问 IWbemLocator

下面的代码示例介绍如何在此类调用中使用 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
标头 wbemprov.h (包括 Wbemidl.h)
Library Wbemuuid.lib
DLL Wbemsvc.dll

另请参阅

IWbemProviderInit

初始化提供程序