#include <iostream>
#include <windows.h>
#include <psapi.h>
#pragma comment(lib,"psapi.lib")
using namespace std;
SIZE_T CalcWorkSetPrivate(HANDLE hProcess, SIZE_T pageSize)
{
BOOL bRet = TRUE;
PSAPI_WORKING_SET_INFORMATION workSetInfo;
PBYTE pByte = NULL;
PSAPI_WORKING_SET_BLOCK *pWorkSetBlock = workSetInfo.WorkingSetInfo;
memset(&workSetInfo, 0, sizeof(workSetInfo));
// 要求操作进程的权限:PROCESS_QUERY_INFORMATION and PROCESS_VM_READ
// 第一次调用获取实际缓冲区大小
bRet = ::QueryWorkingSet(hProcess, &workSetInfo, sizeof(workSetInfo));
if(!bRet) // 调用失败
{
if(GetLastError() == ERROR_BAD_LENGTH) // 需要重新分配缓冲区
{
DWORD realSize = sizeof(workSetInfo.NumberOfEntries)
+ workSetInfo.NumberOfEntries*sizeof(PSAPI_WORKING_SET_BLOCK);
try
{
pByte = new BYTE[realSize];
memset(pByte, 0, realSize);
pWorkSetBlock = (PSAPI_WORKING_SET_BLOCK *)(pByte + sizeof(workSetInfo.NumberOfEntries));
// 重新获取
if(!::QueryWorkingSet(hProcess, pByte, realSize))
{
delete[] pByte; // 清理内存
return 0;
}
}
catch(char *e) // 分配内存失败
{
// e->Delete();
return 0;
}
}
else // 其它错误,认为获取失败
return 0;
}
SIZE_T workSetPrivate = 0;
for (ULONG_PTR i = 0; i < workSetInfo.NumberOfEntries; ++i)
{
if(!pWorkSetBlock[i].Shared) // 如果不是共享页
workSetPrivate += pageSize;
}
if(pByte)
delete[] pByte;
return workSetPrivate;
}
void main( )
{
PERFORMANCE_INFORMATION performanceInfo;
memset(&performanceInfo, 0, sizeof(performanceInfo));
if(!::GetPerformanceInfo(&performanceInfo, sizeof(performanceInfo)))
return ;
SIZE_T m_stPageSize = performanceInfo.PageSize; // 获取页面大小, 单位:byte
SIZE_T d = CalcWorkSetPrivate(OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, 11460 ), m_stPageSize);
printf("%d\n",d);
system("pause");
}
#include <windows.h>
#include <psapi.h>
#pragma comment(lib,"psapi.lib")
using namespace std;
SIZE_T CalcWorkSetPrivate(HANDLE hProcess, SIZE_T pageSize)
{
BOOL bRet = TRUE;
PSAPI_WORKING_SET_INFORMATION workSetInfo;
PBYTE pByte = NULL;
PSAPI_WORKING_SET_BLOCK *pWorkSetBlock = workSetInfo.WorkingSetInfo;
memset(&workSetInfo, 0, sizeof(workSetInfo));
// 要求操作进程的权限:PROCESS_QUERY_INFORMATION and PROCESS_VM_READ
// 第一次调用获取实际缓冲区大小
bRet = ::QueryWorkingSet(hProcess, &workSetInfo, sizeof(workSetInfo));
if(!bRet) // 调用失败
{
if(GetLastError() == ERROR_BAD_LENGTH) // 需要重新分配缓冲区
{
DWORD realSize = sizeof(workSetInfo.NumberOfEntries)
+ workSetInfo.NumberOfEntries*sizeof(PSAPI_WORKING_SET_BLOCK);
try
{
pByte = new BYTE[realSize];
memset(pByte, 0, realSize);
pWorkSetBlock = (PSAPI_WORKING_SET_BLOCK *)(pByte + sizeof(workSetInfo.NumberOfEntries));
// 重新获取
if(!::QueryWorkingSet(hProcess, pByte, realSize))
{
delete[] pByte; // 清理内存
return 0;
}
}
catch(char *e) // 分配内存失败
{
// e->Delete();
return 0;
}
}
else // 其它错误,认为获取失败
return 0;
}
SIZE_T workSetPrivate = 0;
for (ULONG_PTR i = 0; i < workSetInfo.NumberOfEntries; ++i)
{
if(!pWorkSetBlock[i].Shared) // 如果不是共享页
workSetPrivate += pageSize;
}
if(pByte)
delete[] pByte;
return workSetPrivate;
}
void main( )
{
PERFORMANCE_INFORMATION performanceInfo;
memset(&performanceInfo, 0, sizeof(performanceInfo));
if(!::GetPerformanceInfo(&performanceInfo, sizeof(performanceInfo)))
return ;
SIZE_T m_stPageSize = performanceInfo.PageSize; // 获取页面大小, 单位:byte
SIZE_T d = CalcWorkSetPrivate(OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, 11460 ), m_stPageSize);
printf("%d\n",d);
system("pause");
}