描述
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查询中使用的AND和OR关键字的数量有限制。复杂查询中使用的大量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。 |