勇芳软件工作室.汉化:  Windows Management Instrumentation > COM API for WMI > Interfaces > IWbemProviderInit >

Initialize Method

Previous pageReturn to chapter overviewNext page

描述

 

Windows Management调用IWbemProviderInit.Initialize方法来初始化提供程序以接收客户端请求。所有类型的提供者都必须实现这种方法。

 

C++ 语法

 

HRESULT Initialize(

[in]  LPWSTR wszUser,

[in]  LONG lFlags,

[in]  LPWSTR wszNamespace,

[in]  LPWSTR wszLocale,

[in]  IWbemServices *pNamespace,

[in]  IWbemContext *pCtx,

[in]  IWbemProviderInitSink *pInitSink

);

 

PowerBASIC 语法

 

METHOD Initialize(

BYREF wszUser AS WSTRINGZ, _

BYVAL lFlags AS LONG, _

BYREF wszNamespace AS WSTRINGZ, _

BYREF wszLocale AS WSTRINGZ, _

BYVAL pNamespace AS IWbemServices, _

BYVAL pCtx AS IWbemContext, _

BYVAL pInitSink AS IWbemProviderInitSink _

) AS LONG

 

参数

 

wszUser

 

如果在该供应商的__Win32Provider注册实例中请求了每用户初始化,则指向用户名的指针。否则,这是NULL。

 

请注意,事件消费者提供者的此参数设置为NULL,而不管提供商的__Win32Provider实例中的PerUserInitialization属性的值。

 

lFlags

 

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

 

wszNamespace

 

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

 

wszLocale

 

正在初始化提供程序的区域设置名称。

 

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

 

·"MS_409"

 

此参数可能为NULL。

 

pNamespace

 

一个IWbemServices指针回到Windows Management。该指针可以服务于提供者所做的任何请求。如果这个指针在执行过程中要回调到Windows Management,那么提供者应该使用这个指针的IWbemProviderInit.AddRef方法。

 

pCtx

 

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

 

如果提供程序在完成初始化之前将执行请求回到Windows Management,那么它应该使用这个指针的IWbemProviderInit.AddRef方法。

 

如果提供程序必须在另一个提供程序上创建依赖请求,则必须将此上下文字符串传回WMI以避免潜在的锁定。然而,在独立请求的情况下,这不是必需的,并且WMI为其生成新的上下文字符串。

 

pInitSink

 

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

 

返回值

 

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

 

示例代码

 

以下代码示例介绍如何为事件消费者提供程序实现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;

}

 

备注

 

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

 

通过致电IWbemProviderInitSink.SetStatus报告初始化状态。如果需要,可以重复调用此方法来报告增量状态。提供者必须通过调用其IWbemProviderInit.AddRef方法来增加此指针上的引用计数,然后再使用该方法将状态通信给Windows Management。

 

提供者可以同步使用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要求依赖提供者遵守以下规则:

 

·依赖的请求必须重用WMI传递给Initialize的IWbemContext指针。

 

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

 

·非依赖请求不得重复使用IWbemContext指针。

 

·依赖提供者必须使用以下两种策略之一向WMI发出请求:

 

·使用从WMI接收到的线程进行依赖请求。
·使用提供程序创建的新线程来创建依赖请求。

 

·所有提供者必须返回从WMI接收到的线程。

 

·在任何情况下,WMI不允许提供程序阻止从WMI接收到的线程。

 

不仔细处理由WMI发送的线程的危险在于提供者可以获取WMI线程池中的所有线程,并继续阻止这些线程。这将导致一个僵局的系统。

 

您可以选择在过程中实施提供商。必须使用CLSID_WbemAdministrativeLocator类标识符来访问IWbemLocator,以调用CoCreateInstance,必须在初始化过程中单独连接到WMI的进程内提供程序。

 

以下代码示例介绍如何在此类调用中使用CLSID_WbemAdministrativeLocator标识符。

 

IWbemLocator *pLoc = 0;

 

DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0,

  CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);

 

未能使用CLSID_WbemAdministrativeLocator标识符导致访问被拒绝的错误。有关连接到WMI的更多信息,请参阅创建WMI应用程序或脚本.

 

要求

 

客户

需要Windows Vista,Windows XP,Windows 2000 Professional,Windows NT Workstation 4.0 SP4及更高版本,Windows Me,Windows 98或Windows 95。

服务器

需要Windows Server 2008,Windows Server 2003,Windows 2000 Server或Windows NT Server 4.0 SP4及更高版本。

在Wbemprov.inc中声明。

DLL

需要Wbemsvc.dll。