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

CreateClassEnumAsync Method

Previous pageReturn to chapter overviewNext page

描述

 

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。