Provider::ExecQuery 方法 (provider.h)

[Provider 类是 WMI 提供程序框架的一部分,现在视为处于最终状态,对于影响这些库的非安全性相关问题,将不会提供进一步的开发、增强或更新。 所有新开发均应使用 MI API。]

WMI 调用 ExecQuery 方法来处理 WMI 查询语言 (WQL) 查询。

语法

HRESULT ExecQuery(
        MethodContext     *pMethodContext,
  [ref] CFrameworkQuery & cQuery,
        long              lFlags
);

parameters

pMethodContext

指向此调用的上下文对象的指针。 此值包含客户端指定的任何 IWbemContext 属性。 此外,此指针必须用作对 WMI 的任何调用的参数。

[ref] cQuery

指向提供程序框架已分析的查询的指针。

lFlags

包含有关执行查询操作信息的标志的位掩码。 这是 客户端在 IWbemServices::ExecQuery 方法中指定的值。

以下标志由 (处理,并通过 WMI 筛选出) :

  • WBEM_FLAG_ENSURE_LOCATABLE
  • WBEM_FLAG_FORWARD_ONLY
  • WBEM_FLAG_BIDIRECTIONAL
  • WBEM_FLAG_USE_AMENDED_QUALIFIERS
  • WBEM_FLAG_RETURN_IMMEDIATELY
  • WBEM_FLAG_PROTOTYPE

返回值

此方法的默认框架提供程序实现将 WBEM_E_PROVIDER_NOT_CAPABLE 返回到调用方法。 IWbemServices::ExecQuery 方法列出了常见的返回值,不过你可以选择返回任何 COM 返回代码。

注解

WMI 经常调用 ExecQuery 以响应客户端对 IWbemServices::ExecQuery 的调用,其中客户端传入所选属性的列表或 WHERE 子句。 如果客户端查询包含描述类的“ASSOCIATORS OF”或“REFERENCES OF”语句,WMI 还可以调用 ExecQuery 。 如果 ExecQuery 的实现返回 WBEM_E_NOT_SUPPORTED,则客户端依赖于 WMI 来处理查询。

WMI 通过调用 CreateInstanceEnum 的实现来处理查询,以提供所有实例。 然后,WMI 先筛选生成的实例,然后再将实例返回到客户端。 因此,创建的任何 ExecQuery 实现都必须比 CreateInstanceEnum 更高效。

下面介绍了 ExecQuery 的常见实现:

  1. 使用 Provider::CreateNewInstance 创建类的空实例。
  2. 确定应创建的实例的子集。

    可以使用 IsPropertyRequired 等方法来查看所需的属性,使用 GetValuesForProp 查看 WMI 需要哪些实例。 处理请求的属性的其他方法包括 CFrameworkQuery::GetRequiredPropertiesCFrameworkQuery::AllPropertiesAreRequiredCFrameworkQuery::KeysOnly

  3. 使用 CInstance 类的 Set 方法填充空实例的属性,例如 CInstance::SetByteCInstance::SetStringArray
  4. 使用 CInstance::Commit 将实例发送回客户端。
  5. 返回相应的返回值。

    默认 的 ExecQuery 框架提供程序实现返回 WBEM_E_PROVIDER_NOT_CAPABLE。 如果实现 ExecQuery,则应使用 IWbemServices::ExecQuery 中列出的常见返回值。 但是,如有必要,可以返回任何 COM 返回代码。

WMI 不会通过框架提供程序发送“ASSOCIATORS OF”或“REFERENCES OF”查询。 相反,WMI 使用 架构来确定哪些类与相关类相关,并生成相应的 WQL 查询来检索结果。 因此,无需编写对“ASSOCIATORS OF”和“REFERENCES OF”查询的任何其他支持代码。

但是,在编写框架提供程序时,应牢记以下事项:

要求

   
最低受支持的客户端 Windows Vista
最低受支持的服务器 Windows Server 2008
目标平台 Windows
标头 provider.h (包括 FwCommon.h)
Library FrameDyn.lib
DLL FrameDynOS.dll;FrameDyn.dll