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

ExecQueryAsync Method

Previous pageReturn to chapter overviewNext page

描述

 

IWbemServices.ExecQueryAsync方法执行查询以异步检索对象。

 

C++ 语法

 

HRESULT ExecQueryAsync(

[in]  const BSTR strQueryLanguage,

[in]  const BSTR strQuery,

[in]  long lFlags,

[in]  IWbemContext *pCtx,

[in]  IWbemObjectSink *pResponseHandler

);

 

PowerBASIC 语法

 

METHOD ExecQueryAsync ( _

BYVAL strQueryLanguage AS DWORD, _

BYVAL strQuery AS DWORD, _

BYVAL lFlags AS LONG, _

BYVAL pCtx AS IWbemContext, _

BYVAL pResponseHandler AS IWbemObjectSink _

) AS LONG

 

参数

 

strQueryLanguage

 

有效的BSTR包含Windows Management Instrumentation(WMI)支持的查询语言之一。这必须是“WQL”。

 

strQuery

 

有效BSTR包含查询的文本。这不能为NULL。实现实例提供者时,您的提供者可以拒绝该查询,因为它太复杂了。当提供程序确定查询太复杂时,WMI可以使用简单查询重试提供程序,或者选择检索和枚举查询实例的超集。

 

lFlags

 

此参数可以是以下值之一。

 

含义

WBEM_FLAG_USE_AMENDED_QUALIFIERS

如果设置此标志,WMI将检索存储在当前连接的本地化名称空间中的修改后的限定符。如果未设置,则仅检索存储在立即命名空间中的限定符。

WBEM_FLAG_BIDIRECTIONAL

此标志使WMI保留指向枚举对象的指针,直到客户端释放枚举器。

WBEM_FLAG_SEND_STATUS

该标志通过客户端的实施IWbemObjectSink.SetStatus向WMI注册一个请求,以接收中间状态报告。提供商实施必须支持中间状态报告,以使该标志更改。

WBEM_FLAG_ENSURE_LOCATABLE

此标志确保返回的对象在其中具有足够的信息,以便系统属性(如__PATH__RELPATH__SERVER)不为空。

WBEM_FLAG_PROTOTYPE

该标志用于原型设计。它不执行查询,但返回一个看起来像一个典型结果对象的对象。

WBEM_FLAG_DIRECT_READ

该标志引起对指定类的提供者的直接访问,而不考虑其父类或子类。

 

pCtx

 

通常为NULL。否则,这是一个指向IWbemContext对象的指针,提供者可以使用它来返回所请求的类或实例。必须在提供程序的文档中指定上下文对象中的值。有关此参数的更多信息,请参阅拨打电话给WMI.

 

pResponseHandler

 

指向来电者执行IWbemObjectSink的指针。该处理程序在查询结果集中可用时接收对象。如果返回任何错误代码,则不使用提供的IWbemObjectSink指针。如果返回WBEM_S_NO_ERROR,则调用用户的IWbemObjectSink实现来指示操作的结果。Windows Management Instrumentation(WMI)调用IWbemObjectSink.Indicate与对象任何次数,之后单次调用IWbemObjectSink.SetStatus以指示最终状态。

 

当WBEM_S_NO_ERROR返回时,WMI只会调用AddRef到指针。当错误代码返回时,引用计数与入口相同。有关异步调用方法的详细说明,请参阅调用方法.

 

返回值

 

此方法返回一个HRESULT,表示方法调用的状态。下表列出了HRESULT中包含的值。

 

当发生故障时,可以从COM功能GetErrorInfo获取信息。

 

其他错误代码返回到由pResponseHandler参数指定的对象宿。

 

如果网络问题导致您失去与WMI的远程连接,则可能会返回COM特定的错误代码。

 

完成后,实例提供商可以通过ExecQueryAsync的返回代码或通过pResponseHandler进行的SetStatus呼叫来报告成功或失败。如果您选择调用SetStatus,则通过pResponseHandler发送的返回码优先。

 

退货代码

描述

WBEM_E_FAILED

这表示其他未指定的错误。

WBEM_E_NOT_FOUND

该查询指定一个不存在的类。

WBEM_E_INVALID_PARAMETER

指定了无效参数。

WBEM_E_OUT_OF_MEMORY

没有足够的内存来完成操作。

WBEM_E_SHUTTING_DOWN

Windows管理服务已停止并重新启动。需要新的电话ConnectServer.

WBEM_E_TRANSPORT_FAILURE

这表示当前进程和Windows Management之间的远程过程调用(RPC)链接失败。

WBEM_E_PROVIDER_NOT_CAPABLE

提供者由于其复杂性而无法执行查询,即使它识别语法。在不需要更具体的代码的情况下,返回此代码。

WBEM_S_NO_ERROR

通话成功。

 

备注

 

对于可在WQL查询中使用的ANDOR关键字的数量有限制。复杂查询中使用的大量WQL关键字可能导致WMI返回作为HRESULT值的WBEM_E_QUOTA_VIOLATION错误代码。WQL关键字的限制取决于查询的复杂程度。

 

可以调用呼叫者的IWbemObjectSink.Indicate方法来报告间歇性状态。调用IWbemObjectSink.SetStatus方法来指示结果集的结束。

 

当提供商不支持查询处理时,WMI可以支持查询处理。然而,查询处理的提供者实现可能比WMI版本更有效。为了支持查询,您的实例提供者必须实现ExecQueryAsync方法。如果提供商支持ExecQueryAsync,则WMI将通过strQuery参数直接向提供者发送简单的一元SELECT查询,提供程序必须解析查询并返回相关实例。提供程序必须解析查询,因为即使查询以WQL编写,WMI也不会修改查询—.

 

要使用WMI进行查询处理,请勿在__InstanceProviderRegistration中设置QuerySupportLevels属性。执行此操作时,WMI将调用CreateInstanceEnumAsync的实现,并对结果进行过滤,以便调用方仅获取符合查询条件的那些实例。

 

以下示例显示了ExecQueryAsync的典型实例提供程序实现。调用IWbemObjectSink.SetStatus方法来指示结果集的结束。如果出现错误条件,也可以调用IWbemObjectSink.Indicate的中间调用。

 

因为回调可能不会以与客户端所需的相同的身份验证级别返回,所以建议您使用半异步而不是异步通信。如果需要异步通信,请参阅调用方法.

 

有关详细信息,请参阅IWbemServices.ExecQuery调用方法.

 

[C++]

 

HRESULT CStdProvider::ExecQueryAsync(

          /* [in] */ BSTR strQueryLanguage,

          /* [in] */ BSTR strQuery,

          /* [in] */ long lFlags,

          /* [in] */ IWbemContext __RPC_FAR *pCtx,

          /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler

          )

{

 IWbemClassObject *pClass = 0;

 

// Parse the query.

//   You must implement ParseQuery().

  if (!ParseQuery(strQuery))  return WBEM_E_PROVIDER_NOT_CAPABLE;  

 

// Assume there is an IWbemServices pointer (m_pSvc) available to

// retrieve the class definition.

 

  HRESULT hRes = m_pSvc->GetObject(L"ClassName", 0, NULL, &pClass, 0);

  if (FAILED(hRes))

      return hRes;

 

// Call a method to determine number of instances returned.

// You need to implement the GetNumberInst function.

  int iNumInst = GetNumberInst();

 

// Now loop through the private source and create each  

// instance which is part of the result set of the query.

  for (int iCnt = 0 ; iCnt < iNumInst ; iCnt++)

  {

// Prepare an empty object to receive the class definition.

       IWbemClassObject *pNextInst = 0;

       hRes = pClass->SpawnInstance(0, &pNextInst);

 

// Create the instance.

//   You must implement FillInst().

       /*FillInst(pNextInst, iCnt);*/

 

// Deliver the class to WMI.

       pResponseHandler->Indicate(1, &pNextInst);

       pNextInst->Release( );

  }

 

// Clean up memory

  pClass->Release();

 

// Send finish message to WMI.

 

  pResponseHandler->SetStatus(0, hRes, 0, 0);

 

  return hRes;

}

 

在前面的示例中,实例提供者从WMI获取一个线程来执行必要的同步操作。您可以调用sink AddRef方法,并创建另一个线程来传递结果集中的对象。创建另一个线程允许当前线程返回到WMI,而不会耗尽线程池。提供者选择单线程设计还是双线程设计取决于提供商计划使用WMI线程的时间。没有固定的规则。实验可以帮助您确定设计如何影响WMI性能。

 

注意当提供商实施ExecQueryAsync时,默认情况下,它们将根据查询返回正确的结果集。如果提供程序无法轻松返回正确的结果集,则可能返回结果的超集,并请求在将对象发送给客户端之前WMI执行后置过滤,以确保结果集正确。为此,提供商在提供给它的ExecQueryAsync实现的接收器上调用SetStatus,并带有以下标志。

 

[C++]

 

// The pSink variable is of type IWbemObjectSink*

pSink->SetStatus(WBEM_STATUS_REQUIREMENTS,

  WBEM_REQUIREMENTS_START_POSTFILTER, 0, 0);

 

注意随后发送到WMI服务的任何对象都将被过滤。提供者可以通过使用以下呼叫来关闭流媒体中的后置过滤功能。

 

[C++]

 

// The pSink variable is of type IWbemObjectSink*

pSink->SetStatus(WBEM_STATUS_REQUIREMENTS,

  WBEM_REQUIREMENTS_STOP_POSTFILTER, 0, 0);

 

要求

 

客户

需要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。