正在阅读:简介VC下使用Windows性能计数器简介VC下使用Windows性能计数器

2005-04-13 15:08 出处:PConline 作者:wlzqi 责任编辑:linjixiong
2.枚举计数器和计数器实例   PdhEnumObjectItems (   NULL , // [IN]数据源,NT4.0必须为NULL   szMachineName , // [IN]机器名。本地机器为NULL   pctCounter , // [IN]计数器名   szCounterListBuffer , // [OUT]接收计数器列表的缓冲区,如果计数器列表长度为0,则该项为空   & dwCounterListSize , // [IN/OUT]设置或接收计数器列表长度   szInstanceListBuffer , // [OUT]接收实例列表的缓冲区,如果计数器列表长度为0,则该项为空   & dwInstanceListSize , // [IN/OUT]设置或接收实例列表长度   dwDetailLevel , // 获取信息的级别   // PERF_DETAIL_NOVICE 初级级别   // PERF_DETAIL_ADVANCE 高级级别(包含初级)   // PERF_DETAIL_EXPERT 专家级别(包含初级和高级)   // PERF_DETAIL_WIZARD 系统级别(包含所有级别)   0 ) ; // 最后一个参数系统保留为0      更详细信息请参阅MSDN      */   杖举计数器对象的基本步骤是:   1.获取计数器对象列表大小   2.为计数器列表分配缓冲区   3.开始杖举   以下是编程实现:   第一步:获取计数器对象列表大小   

LPTSTR szObjectListBuffer = NULL ;   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   {   // 如果成功   }   }   // 最后别忘了 free   /*

  通过刚才杖举得到计数器对象就可以继续杖举该对象下的计数器和计数器实例,方法和上面基本雷同,有兴趣的朋友可以自己来做,限于篇幅我就不重复了。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品