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”
[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 接口及其主接口,例如 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 的调用称为依赖请求。 实现 Initialize 时,WMI 要求依赖提供程序遵守以下规则:
-
依赖请求必须重复使用 WMI 传递给 Initialize 的 IWbemContext 指针。
这意味着,在初始化期间对 WMI 进行的任何调用都必须重复使用 WMI 传入的 IWbemContext 指针。 否则可能会导致死锁。
- 非依赖请求不得重复使用 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 |
标头 | wbemprov.h (包括 Wbemidl.h) |
Library | Wbemuuid.lib |
DLL | Wbemsvc.dll |