描述
IWbemServices.CreateClassEnumAsync方法返回类提供者支持的所有类的枚举。类提供者从头开始创建每个类定义,只返回所请求类的子类。作为异步方法,CreateClassEnumAsync立即返回状态消息,然后如果需要,更新通过pResponseHandler参数—传递的接收器。
当一个呼叫成功时,WMI在指针pResponseHandler上调用AddRef,立即返回,然后异步地从具有类定义的线程中异步调用pResponseHandler表明,直到查询满足为止。
C++ 语法
HRESULT CreateClassEnumAsync( [in] const BSTR strSuperclass, [in] LONG lFlags, [in] IWbemContext *pCtx, [in] IWbemObjectSink *pResponseHandler ); |
PowerBASIC 语法
METHOD CreateClassEnumAsync ( _ BYVAL strSuperclass AS DWORD, _ BYVAL lFlags AS LONG, _ BYVAL pCtx AS IWbemContext, _ BYREF pResponseHandler AS IWbemObjectSink _ ) AS LONG |
参数
strSuperclass
如果不是NULL或空白,则指定父类名称。这个类的子类只能在枚举器中返回。如果它是NULL或空白,并且LFLAGS是WBEM_FLAG_SHALLOW,则只返回顶级类(即,没有父类的类)。如果是NULL或空白且LFLAGS为WBEM_FLAG_DEEP,则返回命名空间中的所有类。
lFlags
以下一个或多个值有效。
旗 |
含义 |
WBEM_FLAG_USE_AMENDED_QUALIFIERS |
如果设置此标志,WMI将检索存储在当前连接的本地化名称空间中的修改后的限定符。如果未设置,则仅检索存储在立即命名空间中的限定符。 |
WBEM_FLAG_BIDIRECTIONAL |
此标志使WMI保留指向枚举对象的指针,直到客户端释放枚举器。 |
WBEM_FLAG_DEEP |
该标志强制枚举将所有子类包含在层次结构中,而不是此类。 |
WBEM_FLAG_SHALLOW |
此标志强制枚举仅包括此类的纯实例,不包括提供此类中未找到属性的子类的所有实例。 |
WBEM_FLAG_SEND_STATUS |
该标志在WMI中注册一个请求,通过客户端实现IWbemObjectSink.SetStatus接收中间状态报告。提供商实施必须支持该标志的中间状态报告来改变行为。 |
注意如果strSuperclass为NULL或空白且指定了WBEM_FLAG_DEEP,则返回所有类。
pCtx
通常为NULL。否则,这是指向可以由返回请求的类的提供者使用的IWbemContext对象的指针。必须在提供程序的文档中指定上下文对象中的值。
pResponseHandler
指向IWbemObjectSink的呼叫者实现。该处理程序通过使用IWbemObjectSink.Indicate方法可以接收对象。当没有对象可用时,WMI调用IWbemObjectSink.SetStatus方法。如果返回任何错误代码,则不使用提供的IWbemObjectSink指针。如果返回WBEM_S_NO_ERROR,则调用用户IWbemObjectSink实现来指示操作的结果。当WBEM_S_NO_ERROR返回时,WMI只会在指针上调用AddRef.当错误代码返回时,引用计数与no条目相同。
返回值
此方法返回一个HRESULT,表示方法调用的状态。失败时,您可以从COM函数GetErrorInfo获取可用的信息。如果网络问题导致您失去与WMI的远程连接,则可以返回COM特定的错误代码。请注意,如果CreateClassEnumAsync返回WBEM_S_NO_ERROR,则WMI等待来自响应处理程序的SetStatus方法的结果。WMI在本地连接上无限期等待,或者直到发生远程连接超时。下表列出了HRESULT中包含的值。
退货代码 |
描述 |
WBEM_E_FAILED |
这是一个未指定的错误。 |
WBEM_E_INVALID_CLASS |
指定的类不存在。 |
WBEM_E_INVALID_PARAMETER |
指定了无效参数。 |
WBEM_E_OUT_OF_MEMORY |
没有足够的内存来完成操作。 |
WBEM_E_TRANSPORT_FAILURE |
这表示当前进程和WMI之间的远程过程调用(RPC)链接失败。 |
WBEM_S_NO_ERROR |
通话成功。 |
WBEM_E_NOT_FOUND |
提供者无法识别类名称。 |
WBEM_E_PROVIDER_NOT_CAPABLE |
无论是否识别该名称,提供程序都无法枚举类。如果不需要更具体的代码,则在所有情况下返回此错误代码。 |
WBEM_E_SHUTTING_DOWN |
WMI服务已停止并重新启动。需要新的电话ConnectServer. |
示例代码
以下代码示例显示了如何实现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获取一个线程来执行必要的操作。您可能想要调用sink AddRef方法,并创建另一个线程来传递结果集中的对象。创建另一个线程允许当前线程返回到WMI,而不会耗尽线程池。供应商是否选择单线程设计或双线程设计取决于提供商计划使用WMI线程的时间量。没有固定的规则。实验可以帮助您确定设计如何影响WMI性能。
备注
因为回调可能不会在客户端要求的相同身份验证级别返回,建议您使用半异步而不是异步通信。如果需要异步通信,请参阅调用方法.
有关半异步使用方法的更多信息,请参阅IWbemServices.CreateClassEnum和调用方法.
要求
客户 |
需要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及更高版本。 |
头 |
在Wbemcli.inc中声明。 |
DLL |
需要Fastprox.dll。 需要Esscli.dll。 需要Framedyn.dll。 需要Ntevt.dll。 需要Stdprov.dll。 需要Viewprov.dll。 需要Wbemcomn.dll。 需要Wbemcore.dll。 需要Wbemess.dll。 需要Wbemsvc.dll。 需要Wmipicmp.dll。 需要Wmidcprv.dll。 需要Wmipjobj.dll。 需要Wmiprvsd.dll。 |