读书人

高分请问:如何获取一个进程占用的系统

发布时间: 2012-02-07 17:45:37 作者: rapoo

高分请教:怎么获取一个进程占用的系统资源,如:cpu,memory(物理内存, 虚拟内存,以及增量), 内存分页等信息,详见内容
RT:

1、获取指定进程的信息:cpu, mem(物理内存, 虚拟内存,以及增量), pagefile(大小以及增量)等信息

2、获取某个时刻,主机一共消耗的这些信息

不知道有没有直接的API函数,或者通过一些API组合函数来获取这些信息

请不吝赐教,定多分相送


[解决办法]
剖析Windows任务管理器开发原理与实现
http://www.vckbase.com/document/viewdoc/?id=809
[解决办法]
学习1楼资料,谢谢!
[解决办法]
GetPerformanceInfo
[解决办法]

C/C++ code
#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;    } 

读书人网 >VC/MFC

热点推荐