高分请教:怎么获取一个进程占用的系统资源,如:cpu,memory(物理内存, 虚拟内存,以及增量), 内存分页等信息,详见内容 RT:1、获取指定进程的信息:cpu, mem(物理内存, 虚拟内存,以及增量), pagefile(大小以及增量)等信息2、获取某个时刻,主机一共消耗的这些信息不知道有没有直接的API函数,或者通过一些API组合函数来获取这些信息请不吝赐教,定多分相送 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 剖析Windows任务管理器开发原理与实现http://www.vckbase.com/document/viewdoc/?id=809 #include "StdAfx.h"#include <windows.h>#include <stdio.h>#include <conio.h>#include <tchar.h>#include <pdh.h>#include "Performance.h"#include "Log.h"#include <vector> using namespace std;#pragma comment ( lib , "Pdh.lib" )bool CPerCounter::m_bIsInitPerCounter = false;bool CWebSiteFlow::m_bIsInitWebSiteFlow = false;bool CWebSiteConnect::m_bIsInitWebSiteConnect = false;CPerformance::CPerformance(void){ m_hQuery = NULL; m_CounterHandle = NULL; OpenQuery();};void CPerformance::OpenQuery(){ PDH_STATUS pdhStatus = PdhOpenQuery (0, 0, &m_hQuery);#ifdef DEBUG_PERFORMANCE if( ERROR_SUCCESS != pdhStatus) { CString strDebug; strDebug.Format("open query failed with :%d",pdhStatus); IBLOG(strDebug); }#endif}CPerformance::~CPerformance(void){ if( m_hQuery ) { PDH_STATUS pdhStatus = PdhCloseQuery (m_hQuery); }};void CPerformance::Init(LPTSTR countPath){ #ifdef DEBUG_PERFORMANCE CString strTest; strTest.Format("CPerformance::Init %s", countPath); IBLOG(strTest);#endif CHAR szPathBuffer[256] = {'\0'}; strcat(szPathBuffer,countPath); PDH_STATUS pdhStatus; pdhStatus = PdhAddCounter (m_hQuery, szPathBuffer, 0, &m_CounterHandle);#ifdef DEBUG_PERFORMANCE if( ERROR_SUCCESS != pdhStatus) { CString strDebug; strDebug.Format("PdhAddCounter %s failed with :%d",countPath,pdhStatus); IBLOG(strDebug); } else { CString strDebug; strDebug.Format("PdhAddCounter %s succeed",countPath); IBLOG(strDebug); }#endif}int CPerformance::GetObjValue(){ int nRetCode; if( m_hQuery ) { PDH_FMT_COUNTERVALUE fmtValue; DWORD ctrType; PDH_STATUS pdhStatus; pdhStatus = PdhCollectQueryData (m_hQuery);#ifdef DEBUG_PERFORMANCE if( ERROR_SUCCESS != pdhStatus) { CString strDebug; strDebug.Format("PdhCollectQueryData failed with :%d",pdhStatus); IBLOG(strDebug); return 0; }#endif pdhStatus = PdhGetFormattedCounterValue (m_CounterHandle, PDH_FMT_DOUBLE, &ctrType, &fmtValue);#ifdef DEBUG_PERFORMANCE if( ERROR_SUCCESS != pdhStatus) { CString strDebug; strDebug.Format("PdhGetFormattedCounterValue failed with :%d",pdhStatus); IBLOG(strDebug); }#endif return nRetCode=(int)fmtValue.doubleValue; } else {#ifdef DEBUG_PERFORMANCE IBLOG("get objvalue with empty query handle");#endif } return 0;}vector<string> CPerformance::GetCountInstance(LPTSTR countObj){ vector<string> vecResult; PDH_STATUS pdhStatus ; LPTSTR szCounterListBuffer = NULL ; DWORD dwCounterListSize = 0; LPTSTR szInstanceListBuffer = NULL ; DWORD dwInstanceListSize = 0; LPTSTR szThisInstance = NULL ; LPTSTR szThisCounter = NULL ; // 首先调用该函数获得接受计数器列表的缓冲区大小 pdhStatus = PdhEnumObjectItems ( NULL , // [IN]数据源,NT4.0必须为NULL NULL , // [IN]机器名。本地机器为NULL countObj , // [IN]计数器名 szCounterListBuffer , // [OUT]接收计数器列表的缓冲区,如果计数器列表长度为0,则该项为空 & dwCounterListSize , // [IN/OUT]设置或接收计数器列表长度 szInstanceListBuffer , // [OUT]接收实例列表的缓冲区,如果计数器列表长度为0,则该项为空 & dwInstanceListSize , // [IN/OUT]设置或接收实例列表长度 PERF_DETAIL_WIZARD , // 获取信息的级别 // PERF_DETAIL_NOVICE 初级级别 // PERF_DETAIL_ADVANCE 高级级别(包含初级) // PERF_DETAIL_EXPERT 专家级别(包含初级和高级) // PERF_DETAIL_WIZARD 系统级别(包含所有级别) 0 ) ; // 最后一个参数系统保留为0 // 根据得到的缓冲区大小分配计数器列表缓冲区内存 szCounterListBuffer = ( LPTSTR ) malloc ( dwCounterListSize * sizeof ( TCHAR ) ) ; // 根据得到的缓冲区大小分配实例名列表缓冲区内存 szInstanceListBuffer = ( LPTSTR ) malloc ( dwInstanceListSize * sizeof ( TCHAR ) ) ;#ifdef DEBUG_PERFORMANCE CString strTest; strTest.Format("dwCounterListSize=%d dwInstanceListSize=%d",dwCounterListSize,dwInstanceListSize); IBLOG(strTest);#endif if( szCounterListBuffer && szInstanceListBuffer) { // 获取指定计数器对象的所有计数器和实例 pdhStatus = PdhEnumObjectItems ( NULL , // [IN]数据源,NT4.0必须为NULL NULL , // [IN]机器名。本地机器为NULL countObj , // [IN]计数器名 szCounterListBuffer , // [OUT]接收计数器列表的缓冲区,如果计数器列表长度为0,则该项为空 & dwCounterListSize , // [IN/OUT]设置或接收计数器列表长度 szInstanceListBuffer , // [OUT]接收实例列表的缓冲区,如果计数器列表长度为0,则该项为空 & dwInstanceListSize , // [IN/OUT]设置或接收实例列表长度 PERF_DETAIL_WIZARD , // 获取信息的级别 0 ) ; // 最后一个参数系统保留为0 if (pdhStatus == ERROR_SUCCESS) { szThisInstance = szInstanceListBuffer ; //szThisCounter = szCounterListBuffer ; for ( ; * szThisInstance != 0 ; szThisInstance += ( lstrlen ( szThisInstance ) + 1 ) ) { // 每循环一次 szThisInstance 就是杖举到的计数器对象 //printf(szThisInstance); string strInstance = szThisInstance; vecResult.push_back(strInstance); } } else {#ifdef DEBUG_PERFORMANCE CString strTest; strTest.Format("PdhEnumObjectItems failed %d",(unsigned int)pdhStatus ); IBLOG(strTest);#endif } } if(szInstanceListBuffer) { free(szInstanceListBuffer); szInstanceListBuffer=NULL; } if( szCounterListBuffer ) { free(szCounterListBuffer); szCounterListBuffer=NULL; } return vecResult;}// 获得主机总物理内存int CPerformance::GetTotalPhysicalMemory(void){ MEMORYSTATUSEX statex; statex.dwLength = sizeof (statex); if (GlobalMemoryStatusEx (&statex)) { return statex.ullTotalPhys/(1024*1024); } return -1; } 怎样和从服务器端发送一个命令给客户端 MFC? 为了获得子对象指针,为什么要强制转换成基对象指针? MSCOMM如何在一个按钮下实现循环发生接受 菜鸟紧急求救关于CListCtrl类中列右对齐的问题 那位老兄用过MSChart控件,如何用MSchart绘制实时曲线 我相信人多力量大,大家帮我想想怎么办 为什么,mscomm控件在数据大于128时收到的数据是0!我给50分! 在dllmain中createthread的问题 怎么样一行一行地保存到数据库呢? 幼儿园问题:怎么在DLL中导出一个继承CAsyncSocket的类? 求助!!!openg中显示问题 VC工具栏问题
http://www.vckbase.com/document/viewdoc/?id=809
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <pdh.h>
#include "Performance.h"
#include "Log.h"
#include <vector> using namespace std;#pragma comment ( lib , "Pdh.lib" )
bool CPerCounter::m_bIsInitPerCounter = false;
bool CWebSiteFlow::m_bIsInitWebSiteFlow = false;
bool CWebSiteConnect::m_bIsInitWebSiteConnect = false;CPerformance::CPerformance(void)
{
m_hQuery = NULL;
m_CounterHandle = NULL;
OpenQuery();};void CPerformance::OpenQuery()
{
PDH_STATUS pdhStatus = PdhOpenQuery (0, 0, &m_hQuery);#ifdef DEBUG_PERFORMANCE
if( ERROR_SUCCESS != pdhStatus)
{
CString strDebug;
strDebug.Format("open query failed with :%d",pdhStatus);
IBLOG(strDebug);
}#endif
}
CPerformance::~CPerformance(void)
{
if( m_hQuery )
{
PDH_STATUS pdhStatus = PdhCloseQuery (m_hQuery);
}};void CPerformance::Init(LPTSTR countPath)
{
#ifdef DEBUG_PERFORMANCE
CString strTest;
strTest.Format("CPerformance::Init %s", countPath);
IBLOG(strTest);
#endif CHAR szPathBuffer[256] = {'\0'};
strcat(szPathBuffer,countPath);
PDH_STATUS pdhStatus;
pdhStatus = PdhAddCounter (m_hQuery,
szPathBuffer,
0,
&m_CounterHandle);#ifdef DEBUG_PERFORMANCE
if( ERROR_SUCCESS != pdhStatus)
{
CString strDebug;
strDebug.Format("PdhAddCounter %s failed with :%d",countPath,pdhStatus);
IBLOG(strDebug);
}
else
{
CString strDebug;
strDebug.Format("PdhAddCounter %s succeed",countPath);
IBLOG(strDebug);
}#endif}int CPerformance::GetObjValue()
{
int nRetCode; if( m_hQuery )
{
PDH_FMT_COUNTERVALUE fmtValue;
DWORD ctrType;
PDH_STATUS pdhStatus;
pdhStatus = PdhCollectQueryData (m_hQuery);
#ifdef DEBUG_PERFORMANCE
if( ERROR_SUCCESS != pdhStatus)
{
CString strDebug;
strDebug.Format("PdhCollectQueryData failed with :%d",pdhStatus);
IBLOG(strDebug);
return 0;
}#endif
pdhStatus = PdhGetFormattedCounterValue (m_CounterHandle,
PDH_FMT_DOUBLE,
&ctrType,
&fmtValue);#ifdef DEBUG_PERFORMANCE
if( ERROR_SUCCESS != pdhStatus)
{
CString strDebug;
strDebug.Format("PdhGetFormattedCounterValue failed with :%d",pdhStatus);
IBLOG(strDebug);
}#endif
return nRetCode=(int)fmtValue.doubleValue;
}
else
{
#ifdef DEBUG_PERFORMANCE
IBLOG("get objvalue with empty query handle");
#endif
} return 0;
}vector<string> CPerformance::GetCountInstance(LPTSTR countObj)
{
vector<string> vecResult; PDH_STATUS pdhStatus ;
LPTSTR szCounterListBuffer = NULL ;
DWORD dwCounterListSize = 0;
LPTSTR szInstanceListBuffer = NULL ;
DWORD dwInstanceListSize = 0;
LPTSTR szThisInstance = NULL ;
LPTSTR szThisCounter = NULL ; // 首先调用该函数获得接受计数器列表的缓冲区大小
pdhStatus = PdhEnumObjectItems (
NULL , // [IN]数据源,NT4.0必须为NULL
NULL , // [IN]机器名。本地机器为NULL
countObj , // [IN]计数器名
szCounterListBuffer , // [OUT]接收计数器列表的缓冲区,如果计数器列表长度为0,则该项为空
& dwCounterListSize , // [IN/OUT]设置或接收计数器列表长度
szInstanceListBuffer , // [OUT]接收实例列表的缓冲区,如果计数器列表长度为0,则该项为空
& dwInstanceListSize , // [IN/OUT]设置或接收实例列表长度
PERF_DETAIL_WIZARD , // 获取信息的级别
// PERF_DETAIL_NOVICE 初级级别
// PERF_DETAIL_ADVANCE 高级级别(包含初级)
// PERF_DETAIL_EXPERT 专家级别(包含初级和高级)
// PERF_DETAIL_WIZARD 系统级别(包含所有级别)
0 ) ; // 最后一个参数系统保留为0 // 根据得到的缓冲区大小分配计数器列表缓冲区内存
szCounterListBuffer = ( LPTSTR ) malloc ( dwCounterListSize * sizeof ( TCHAR ) ) ; // 根据得到的缓冲区大小分配实例名列表缓冲区内存
szInstanceListBuffer = ( LPTSTR ) malloc ( dwInstanceListSize * sizeof ( TCHAR ) ) ;#ifdef DEBUG_PERFORMANCE
CString strTest;
strTest.Format("dwCounterListSize=%d dwInstanceListSize=%d",dwCounterListSize,dwInstanceListSize);
IBLOG(strTest);
#endif if( szCounterListBuffer && szInstanceListBuffer)
{
// 获取指定计数器对象的所有计数器和实例
pdhStatus = PdhEnumObjectItems (
NULL , // [IN]数据源,NT4.0必须为NULL
NULL , // [IN]机器名。本地机器为NULL
countObj , // [IN]计数器名
szCounterListBuffer , // [OUT]接收计数器列表的缓冲区,如果计数器列表长度为0,则该项为空
& dwCounterListSize , // [IN/OUT]设置或接收计数器列表长度
szInstanceListBuffer , // [OUT]接收实例列表的缓冲区,如果计数器列表长度为0,则该项为空
& dwInstanceListSize , // [IN/OUT]设置或接收实例列表长度
PERF_DETAIL_WIZARD , // 获取信息的级别
0 ) ; // 最后一个参数系统保留为0
if (pdhStatus == ERROR_SUCCESS)
{
szThisInstance = szInstanceListBuffer ;
//szThisCounter = szCounterListBuffer ; for ( ; * szThisInstance != 0 ; szThisInstance += ( lstrlen ( szThisInstance ) + 1 ) )
{
// 每循环一次 szThisInstance 就是杖举到的计数器对象
//printf(szThisInstance);
string strInstance = szThisInstance;
vecResult.push_back(strInstance);
}
}
else
{
#ifdef DEBUG_PERFORMANCE
CString strTest;
strTest.Format("PdhEnumObjectItems failed %d",(unsigned int)pdhStatus );
IBLOG(strTest);
#endif
}
} if(szInstanceListBuffer)
{
free(szInstanceListBuffer);
szInstanceListBuffer=NULL;
} if( szCounterListBuffer )
{
free(szCounterListBuffer);
szCounterListBuffer=NULL;
}
return vecResult;
}
// 获得主机总物理内存
int CPerformance::GetTotalPhysicalMemory(void)
{
MEMORYSTATUSEX statex; statex.dwLength = sizeof (statex); if (GlobalMemoryStatusEx (&statex))
{
return statex.ullTotalPhys/(1024*1024);
} return -1;
}