创建查询

若要创建从实时源或日志文件收集性能数据的新查询,请调用 PdhOpenQuery 函数。 函数返回在后续 PDH 函数调用中使用的查询的句柄。

创建查询后,针对要添加到查询的每个计数器调用 PdhAddCounter 函数。 可以使用以下方法之一来提供完全限定的计数器路径。

  • 将计数器路径定义为静态字符串。 如果始终监视同一计数器,并且熟悉计数器路径的正确语法,请使用此方法。 有关用于指定计数器的正确语法的信息,请参阅 指定计数器路径
  • 使用计算机、对象、计数器和实例的名称初始化 PDH_COUNTER_PATH_ELEMENTS 结构。 将此结构传递给 PdhMakeCounterPath ,这将返回指定元素的计数器路径。
  • 指定包含通配符的计数器路径,并调用 PdhExpandWildCardPath 以获取与路径中的通配符匹配的计数器名称列表。 浏览计数器名称列表,并将所需的计数器从此列表添加到查询中。
  • 调用 PdhBrowseCounters 函数以显示允许用户浏览和选择性能计数器的对话框。 有关详细信息,请参阅 浏览计数器

请注意,如果指定的计数器实例不存在, PdhAddCounter 不会报告错误条件。 而是返回ERROR_SUCCESS。 出现此行为的原因是,不知道是否指定了不存在的计数器实例或将存在但尚未创建计数器实例。

缺少的计数器实例将由 PdhCollectQueryDataPdhGetRawCounterValuePdhGetFormattedCounterValue 报告。 如果仅为一个计数器实例调用 PdhCollectQueryData ,并且计数器实例仍不存在,则假定计数器实例不存在,并且函数返回PDH_NO_DATA。 但是,如果查询了多个计数器,即使其中一个计数器实例尚不存在, PdhCollectQueryData 仍可能返回ERROR_SUCCESS。 在这种情况下,请为每个感兴趣的计数器实例调用 PdhGetRawCounterValuePdhGetFormattedCounterValue 。 如果在调用 PdhGetRawCounterValue 时实例不存在,该函数将返回ERROR_SUCCESS并将 PDH_RAW_COUNTERCStatus 成员设置为PDH_STATUS_NO_INSTANCE。 如果在调用 PdhGetFormattedCounterValue 时实例不存在,该函数将返回PDH_INVALID_DATA并将PDH_FMT_COUNTERVALUECStatus 成员设置为PDH_CSTATUS_NO_INSTANCE。

请注意, 必须在 PdhAddCounter 函数中指定的计数器路径进行本地化。 PdhAddEnglishCounter 函数提供了一种非特定区域设置的方式,用于向查询添加性能计数器。 此函数是向查询添加非特定区域设置计数器的建议方法。

若要从查询中删除计数器,请调用 PdhRemoveCounter 函数。

完成查询数据收集后,调用 PdhCloseQuery 函数以关闭查询并释放所有分配的系统资源。 PdhCloseQuery 关闭与查询关联的所有计数器句柄。