VC下使用 Windows 的性能计数器简介
2006-07-20 11:41:28 来源:WEB开发网枚举计数器对象的基本步骤是:
- 获取计数器对象列表大小;
- 为计数器列表分配缓冲区;
- 开始杖举;
以下是编程实现:
第一步:获取计数器对象列表大小
LPTSTR szObjectListBuffer = NULL ;
最后别忘了 free
DWORD dwObjectListSize = 0 ;
LPTSTR szThisObject = NULL ;
__try
{
// 第一次调用该函数获得接收性能计数器对象列表的缓冲区大小
pdhStatus = PdhEnumObjects (
NULL , // [IN]数据源,NT4.0必须为NULL
NULL , // [IN]机器名。本地机器为NULL
szObjectListBuffer , // [OUT]接收计数器列表的缓冲区,如果计数器列表长度为0,则该项为空
& dwObjectListSize , // [IN/OUT]设置或接收计数器列表长度
PERF_DETAIL_WIZARD , // 获取信息的级别
// PERF_DETAIL_NOVICE 初级级别
// PERF_DETAIL_ADVANCE 高级级别(包含初级)
// PERF_DETAIL_EXPERT 专家级别(包含初级和高级)
// PERF_DETAIL_WIZARD 系统级别(包含所有级别)
true ) ;
if ( pdhStatus != ERROR_SUCCESS )
{
__leave ;
}
// 根据得到的缓冲区大小分配计数器对象列表缓冲区内存
szObjectListBuffer = ( LPTSTR ) malloc ( ( dwObjectListSize * sizeof ( TCHAR ) ) ) ;
if ( szObjectListBuffer == NULL )
{
__leave ;
}
// 第二次调用该函数获得计数器对象
pdhStatus = PdhEnumObjects (
NULL , // [IN]数据源,NT4.0必须为NULL
NULL , // [IN]机器名。本地机器为NULL
szObjectListBuffer , // [OUT]接收计数器列表的缓冲区,如果计数器列表长度为0,则该项为空
& dwObjectListSize , // [IN/OUT]设置或接收计数器列表长度
PERF_DETAIL_WIZARD , // 获取信息的级别
// PERF_DETAIL_NOVICE 初级级别
// PERF_DETAIL_ADVANCE 高级级别(包含初级)
// PERF_DETAIL_EXPERT 专家级别(包含初级和高级)
// PERF_DETAIL_WIZARD 系统级别(包含所有级别)
TRUE ) ;
if ( pdhStatus != ERROR_SUCCESS )
{
__leave ;
}
szThisObject = szObjectListBuffer ;
// 开始杖举
for ( ; * szThisObject != 0 ; szThisObject += ( lstrlen ( szThisObject ) + 1 ) )
{
// 每循环一次 szThisObject 就是杖举到的计数器对象
}
}
__finally
{
if ( AbnormalTermination () )
{
// 如果失败
if ( szObjectListBuffer != NULL )
{
free ( szObjectListBuffer ) ;
szObjectListBuffer = NULL ;
}
}
else
{
// 如果成功
}
}
更多精彩
赞助商链接