IWbemServices::CreateClassEnumAsync 方法 (wbemcli.h)
IWbemServices::CreateClassEnumAsync 方法返回类提供程序支持的所有类的枚举。 类提供程序从头开始创建每个类定义,并仅返回所请求类的子类。 作为异步方法, CreateClassEnumAsync 会立即返回状态消息,然后根据需要更新通过 pResponseHandler 参数传递的接收器。
调用成功后,WMI 对指针 pResponseHandler 调用 AddRef,立即返回,然后异步调用 pResponseHandler – >指示从具有类定义的另一个线程,直到满足查询。
语法
HRESULT CreateClassEnumAsync(
[in] const BSTR strSuperclass,
[in] long lFlags,
[in] IWbemContext *pCtx,
[in] IWbemObjectSink *pResponseHandler
);
参数
[in] strSuperclass
如果不是 NULL 或空白,则此参数指定父类名称。 枚举器中仅返回属于此类子类的类。 如果 为 NULL 或空白,并且 lFlagsWBEM_FLAG_SHALLOW,则仅返回顶级类(没有父类的类)。 如果为 NULL 或空白且 lFlagsWBEM_FLAG_DEEP,则返回命名空间中的所有类。
[in] lFlags
以下一个或多个值有效。
WBEM_FLAG_USE_AMENDED_QUALIFIERS
如果设置了此标志,Windows Management Instrumentation (WMI) 检索存储在当前连接区域设置的本地化命名空间中的修改后的限定符。 如果未设置,则仅检索存储在直接命名空间中的限定符。
WBEM_FLAG_BIDIRECTIONAL
此标志使 WMI 保留指向枚举对象的指针,直到客户端释放枚举器。
WBEM_FLAG_DEEP
此标志强制枚举在层次结构中包含此子类和所有子类。
WBEM_FLAG_SHALLOW
此标志强制枚举仅包含此类的纯实例,不包括提供此类中未找到的属性的所有子类实例。
WBEM_FLAG_SEND_STATUS
此标志在 WMI 中注册请求,以通过 IWbemObjectSink::SetStatus 的客户端实现接收中间状态报告。 提供程序实现必须支持此标志的中间状态报告才能更改行为。
[in] pCtx
通常 为 NULL。 否则,这是指向 IWbemContext 对象的指针,该对象可由返回请求的类的提供程序使用。 必须在提供程序的文档中指定上下文对象中的值。 有关此参数的详细信息,请参阅 调用 WMI。
[in] pResponseHandler
指向 IWbemObjectSink 的调用方实现的指针。 此处理程序使用 IWbemObjectSink::Indicate 方法在对象变为可用时接收这些对象。 如果没有可用的对象, WMI 将调用 IWbemObjectSink::SetStatus 方法。 如果返回任何错误代码,则不使用提供的 IWbemObjectSink 指针。 如果返回WBEM_S_NO_ERROR,则调用用户 IWbemObjectSink 实现来指示操作的结果。 WMI 仅在WBEM_S_NO_ERROR返回时对指针调用 AddRef。 当错误代码返回时,引用计数与无条目相同。 有关此参数的详细说明,请参阅 调用方法。
返回值
此方法返回指示方法调用状态的 HRESULT。 失败时,可以从 COM 函数 GetErrorInfo 获取可用信息。 如果网络问题导致你失去与 WMI 的远程连接,则可以返回特定于 COM 的错误代码。 请注意,如果 CreateClassEnumAsync 返回WBEM_S_NO_ERROR,则 WMI 将等待响应处理程序的 SetStatus 方法的结果。 WMI 将无限期地等待本地连接或远程连接超时。 以下列表列出了 HRESULT 中包含的值。
注解
由于回调可能不会在客户端要求的相同身份验证级别返回,因此建议使用半同步通信而不是异步通信。 如果需要异步通信,请参阅 调用方法。
有关半同步使用方法的详细信息,请参阅 IWbemServices::CreateClassEnum 和 调用方法。
示例
下面的代码示例演示如何实现 CreateClassEnumAsync。
HRESULT CStdProvider::CreateClassEnumAsync(
/* [in] */ BSTR strSuperclass,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
)
{
IWbemClassObject *pClass = 0;
// Assume there is an IWbemServices pointer available (m_pSvc).
// Retrieve an 'empty' object that will be built up
// into the class definition.
HRESULT hRes = m_pSvc->GetObject(NULL, 0, NULL, &pClass, 0);
if (hRes)
{
return hRes;
}
// Prepare an empty object to receive the class definition.
IWbemClassObject *pNextClass = 0;
hRes = pClass->Clone(&pNextClass);
// Now loop through the private source of class definitions
// and create each class.
while(hRes)
{
// Create the class definition elsewhere.
// For example, call a function that creates a definition:
// FillClassDef(pNextClass);
// Deliver the class to WMI.
pResponseHandler->Indicate(1, &pNextClass);
pNextClass->Release( );
// Prepare an empty object to receive the class definition.
IWbemClassObject *pNextClass = 0;
hRes = pClass->Clone(&pNextClass);
}
pClass->Release();
// Send a finish message to WMI.
pResponseHandler->SetStatus(0, hRes, 0, 0);
return hRes;
}
在前面的示例中,类提供程序从 WMI 获取线程以执行必要的操作。 你可能想要调用接收器 AddRef 方法并创建另一个线程来传递结果集中的对象。 创建另一个线程允许当前线程返回到 WMI,而不会耗尽线程池。 提供程序选择单线程设计还是双线程设计取决于提供程序计划使用 WMI 线程的时间量。 没有固定的规则。 试验可以帮助你确定设计如何影响 WMI 性能。
要求
最低受支持的客户端 | Windows Vista |
最低受支持的服务器 | Windows Server 2008 |
目标平台 | Windows |
标头 | wbemcli.h (包括 Wbemidl.h) |
Library | Wbemuuid.lib |
DLL | Fastprox.dll;Esscli.dll;FrameDyn.dll;FrameDynOS.dll;Ntevt.dll;Stdprov.dll;Viewprov.dll;Wbemcomn.dll;Wbemcore.dll;Wbemess.dll;Wbemsvc.dll;Wmipicmp.dll;Wmidcprv.dll;Wmipjobj.dll;Wmiprvsd.dll |