勇芳软件工作室.汉化:  Windows Management Instrumentation > COM API for WMI > Interfaces > IWbemServices >

CreateInstanceEnumAsync Method

Previous pageReturn to chapter overviewNext page

描述

 

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。