描述
IWbemServices.CreateInstanceEnumAsync方法创建一个枚举器,根据用户指定的选择条件异步返回指定类的实例。此方法支持简单的WMI查询语言(WQL)查询。可以使用IWbemServices.ExecQueryAsync方法处理更复杂的查询。
C++ 语法
HRESULT CreateInstanceEnumAsync( [in] const BSTR strClass, [in] LONG lFlags, [in] IWbemContext *pCtx, [in] IWbemObjectSink *pResponseHandler ); |
PowerBASIC 语法
METHOD CreateInstanceEnumAsync ( _ BYVAL strClass AS DWORD, _ BYVAL lFlags AS LONG, _ BYVAL pCtx AS IWbemContext, _ BYVAL pResponseHandler AS IWbemObjectSink _ ) AS LONG |
参数
strClass
有效BSTR包含需要实例的类的名称。此参数不能为NULL。
lFlags
此参数可以是以下值之一。
旗 |
含义 |
WBEM_FLAG_USE_AMENDED_QUALIFIERS |
如果设置此标志,Windows Management Instrumentation(WMI)将检索存储在当前连接的本地化命名空间中的修改后的限定符。如果未设置,则仅检索存储在立即命名空间中的限定符。 |
WBEM_FLAG_DEEP |
该标志强制枚举在层次结构中包含此子类和所有子类的实例。 |
WBEM_FLAG_SHALLOW |
此标志强制枚举仅包含此类的纯实例,不包括所有子类的实例,该子类提供此类中未找到的属性。 |
WBEM_FLAG_SEND_STATUS |
该标志向Windows Management注册通过客户端实现IWbemObjectSink.SetStatus接收中间状态报告的请求。提供商实施必须支持该标志的中间状态报告来改变行为。 |
WBEM_FLAG_BIDIRECTIONAL |
此标志使Windows Management保留指向枚举对象的指针,直到客户端释放枚举器。 |
WBEM_FLAG_DIRECT_READ |
该标志引起对指定类的提供者的直接访问,而不考虑其父类或子类。 |
pCtx
通常为NULL。否则,这是指向可以由提供者提供请求的实例的IWbemContext对象的指针。必须在相关提供者的文档中指定上下文对象中的值。
pResponseHandler
指向呼叫者执行IWbemObjectSink的指针。该处理程序在对象可用时接收对象。如果返回任何错误代码,则不使用提供的IWbemObjectSink指针。如果返回WBEM_S_NO_ERROR,则将调用用户的IWbemObjectSink实现来指示操作的结果。如果WBEM_S_NO_ERROR返回,Windows Management只会调用该指针的AddRef.在错误代码返回的情况下,引用计数与输入相同。
返回值
此方法返回一个HRESULT,指示方法调用的状态。下表列出了HRESULT中包含的值。
失败时,您可以从COM函数GetErrorInfo获取更多信息。
如果网络问题导致您失去与Windows Management的远程连接,也可能会返回COM特定的错误代码。
实例提供商可以通过CreateInstanceEnumAsync的返回代码或通过pResponseHandler进行的SetStatus呼叫来报告成功或失败。如果您选择致电SetStatus,则通过pResponseHandler发送的返回码优先。
如果CreateInstanceEnumAsync返回WBEM_S_NO_ERROR,则WMI等待来自响应处理程序的SetStatus方法的结果。WMI在本地连接上无限期地等待,或者直到发生远程连接超时。
退货代码 |
描述 |
WBEM_E_FAILED |
这表示其他未指定的错误。 |
WBEM_E_INVALID_PARAMETER |
指定了无效参数。 |
WBEM_E_INVALID_CLASS |
指定的类不存在或无效。 |
WBEM_E_OUT_OF_MEMORY |
没有足够的内存来完成操作。 |
WBEM_E_SHUTTING_DOWN |
Windows管理服务可能已停止并重新启动。需要新的电话ConnectServer. |
WBEM_E_TRANSPORT_FAILURE |
这表示当前进程和Windows Management之间的远程过程调用(RPC)链接失败。 |
WBEM_E_NOT_FOUND |
提供者无法识别类名称。 |
WBEM_E_PROVIDER_NOT_CAPABLE |
提供程序无法枚举实例,无论它是否识别名称。如果不需要更具体的代码,则在所有情况下返回此错误代码。 |
WBEM_S_NO_ERROR |
通话成功。 |
示例代码
以下示例说明如何实现CreateInstanceEnumAsync.
#define NUM_OF_INSTANCES 3
HRESULT CStdProvider::CreateInstanceEnumAsync(
/* [in] */ BSTR strClass,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
)
{
IWbemClassObject *pClass = 0;
IWbemClassObject *pNextInst = 0;
// Assume there is an IWbemServices pointer available to
// retrieve the class definition.
HRESULT hRes = m_pSvc->GetObject(strClass, 0, NULL, &pClass, 0);
if (hRes)
return hRes;
// Now loop through the private source and create each instance.
for (int i = 0; i < NUM_OF_INSTANCES; i++)
{
// Prepare an empty object to receive the class definition.
pClass->SpawnInstance(0, &pNextInst);
// Create the instance.
// For example, create the instance in a
// FillInst method you implement:
/*FillInst(pNextInst);*/
// Deliver the class to WMI.
pResponseHandler->Indicate(1, &pNextInst);
pNextInst->Release();
}
// Send a finish message to WMI.
pResponseHandler->SetStatus(0, WBEM_S_NO_ERROR, 0, 0);
// Free memory resources.
SysFreeString(strClass);
pClass->Release();
m_pSvc->Release();
return WBEM_S_NO_ERROR;
}
在前面的示例中,实例提供者从WMI获取一个线程来执行任何必要的操作。您可能想要调用sink AddRef方法,并创建另一个线程来传递结果集中的对象。创建另一个线程允许当前线程返回到WMI,而不会耗尽线程池。提供者是否通过双线程设计选择单线程设计取决于提供商计划使用WMI线程的时间。没有固定的规则。实验可以帮助您确定设计如何影响WMI性能。
备注
调用IWbemObjectSink.SetStatus方法来指示结果集的结束。也可以调用它,而不会对IWbemObjectSink进行任何调用:指示是否发生错误条件。
因为回调可能不会在客户端要求的相同身份验证级别返回,建议您使用半异步而不是异步通信。
有关详细信息,请参阅IWbemServices.CreateInstanceEnum和调用方法.
要求
客户 |
需要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。 |