描述
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接口及其主界面,例如IWbemServices或IWbemEventProvider.
通过致电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。 |