提供程序可以在其方法实现中调用 WMI 实现的方法。 但是,当提供程序从其自己的同一方法实现中调用 IWbemServices 方法的 WMI 实现时,有一些特殊注意事项。 无论提供程序是调用方法的同步版本还是异步版本,这些注意事项都很重要。
每个提供程序可以实现的 IWbemServices 方法都有一个 pCtx 参数,该参数是指向 IWbemContext 接口实现的指针。 当 WMI 调用提供程序时,WMI 会在此参数中传递有效的指针。 提供程序必须在对 WMI 的任何调用中始终传递相同的指针,这些调用是在处理请求时发出的。 忽略适当设置 pCtx 可能会导致 WMI 启动无限循环。
下面的代码示例演示了从 GetObjectAsync 实现中调用 GetObject 的 WMI 实现的正确方法。
STDMETHODIMP CClassProv::GetObjectAsync (BSTR ObjectPath,
long lFlags, IWbemContext *pCtx,
IWbemObjectSink *pHandler)
{
IWbemClassObject *pclObj = NULL;
IWbemServices* m_pNamespace;
HRESULT hr = m_pNamespace->GetObject(
_bstr_t(L"AClass"), 0, pCtx, &pclObj,
NULL );
pclObj->Release();
return pHandler->SetStatus(0, hr, NULL, NULL);
}
本主题中的C++代码示例需要以下引用和 #include 语句才能正确编译。
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
实例、类和属性提供程序不得在为读取请求提供服务时发出对 WMI 的任何调用,请求修改数据。 此规则唯一的例外是推送服务商。 推送提供程序是一个类提供程序,用于在 WMI 存储库中存储数据,并依赖 WMI 来处理来自客户端的请求。 在为读取请求提供服务时,推送提供程序可以更新 WMI 存储库,但必须将 lFlags 参数设置为在相应的 IWbemServices 调用中WBEM_FLAG_OWNER_UPDATE。
事件提供程序在为调用提供服务时不得进行任何类更改。 它们也不能发出任何与事件相关的调用,例如修改事件筛选器。
相关主题