创建性能扩展 DLL

重要

由于显著的性能和可靠性限制,用于提供本主题描述的性能计数器数据的方法将来可能会更改或不可用。 相反,Microsoft 建议使用 使用版本 2.0 提供计数器数据 中所述的方法创建新的性能计数器,并迁移现有性能计数器以使用该方法。

V1 提供程序使用向使用者提供计数器数据的性能 DLL。 性能 DLL 必须导出 OpenPerformanceDataCollectPerformanceDataClosePerformanceData 函数。 通常,使用模块定义 (.def) 文件从 DLL 导出函数。 当使用者查询性能数据时,系统会调用这些函数。

使用者第一次调用 RegQueryValueEx 时,或者如果使用者使用 RegOpenKeyRegConnectRegistry 函数打开 HKEY_PERFORMANCE_DATA,系统将为计算机上注册的每个提供程序调用 OpenPerformanceData 函数。 如果提供程序在 .INI 文件的 节中 [objects] 指定它支持的对象列表,则例外。 在这种情况下,仅当查询的对象之一与列表中的对象匹配时,系统才会调用提供程序。

OpenPerformanceData 函数为每个提供程序提供初始化其性能数据结构的机会。 然后,如果 OpenPerformanceData 函数成功返回,系统将调用提供程序的 CollectPerformanceData 函数。 后续调用 RegQueryValueEx 会导致系统调用 CollectPerformanceData 函数。

当使用者完成性能数据收集时,它会在对 RegCloseKey 函数的调用中指定 HKEY_PERFORMANCE_DATA 。 这会导致系统为每个提供程序调用 ClosePerformanceData 函数。 然后卸载提供程序。

多个使用者可以同时收集性能数据。 每次加载或卸载 DLL 时,系统仅调用 OpenPerformanceDataClosePerformanceData 函数一次。

注意

请务必在 C++ 代码中包含外部“C”,以防止编译器向函数名称添加修饰;否则,系统可能无法找到函数。

注意

如果在加载性能 DLL、查找函数或调用函数时发生错误,系统将为同一进程中的后续集合禁用提供程序。 此外,如果在特权进程中运行时发生这种情况,系统会将 禁用性能计数器 值添加到 性能 键,以防止将来加载提供程序。

有关编写性能 DLL 的详细信息,请参阅以下主题: