GetMemoryInfo只有关于内存工作集的信息,并没有专用工作集的信息,我在网上搜到的答案是通过共享页面获得数据,但是获取的专用工作集(内存)的数据与任务管理器相差挺多的,有没有大佬遇到过这个问题,能不能帮忙解答一下,以下是我在网上搜索到的代码
求解!!!!!
SIZE_T GetMemoryInfo(DWORD dwPid,SIZE_T pageSize) {
BOOL bRet = TRUE;
PSAPI_WORKING_SET_INFORMATION SetInfo; /*包含流程的工作集信息*/
PBYTE pByte = NULL;
DWORD realSize = 0;
PSAPI_WORKING_SET_BLOCK *pSetBlock = SetInfo.WorkingSetInfo; /*一个PSAPI WORKING SET BLOCK元素的数组,每个元素对应流程工作集中的每个页面*/
memset(&SetInfo, 0, sizeof(SetInfo));
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPid);
if (hProcess == NULL || hProcess == INVALID_HANDLE_VALUE) {
int err = GetLastError();
if (err == ERROR_INVALID_PARAMETER || err == ERROR_ACCESS_DENIED)
return 0;
else {
MessageBox(gs_hDialog, TEXT("Open Process Error!"),NULL,NULL);
return -1;
}
}
/*检索有关当前添加到指定进程的工作集中的页的信息*/
bRet = QueryWorkingSet(hProcess, &SetInfo, sizeof(SetInfo));
if (!bRet) {
if (GetLastError() == ERROR_BAD_LENGTH) { /*workingsetinfo数组的条目数*/
realSize = sizeof(SetInfo.NumberOfEntries) + SetInfo.NumberOfEntries*sizeof(PSAPI_WORKING_SET_BLOCK);
}
try {
pByte = new BYTE[realSize];
memset(pByte, 0, realSize);
pSetBlock = (PSAPI_WORKING_SET_BLOCK *)(pByte + sizeof(SetInfo.NumberOfEntries));
if (!QueryWorkingSet(hProcess, pByte, realSize)) {
delete[] pByte;
return 0;
}
}
catch (char *e) {
delete e;
return 0;
}
}
else {
return 0;
}
SIZE_T workSetPrivate = 0;
for (ULONG_PTR i = 0; i < SetInfo.NumberOfEntries; ++i) {
if(!pSetBlock[i].Shared) // 如果不是共享页
workSetPrivate += pageSize;
}
if(pByte)
delete[] pByte;
CloseHandle(hProcess);
return workSetPrivate;
}
SIZE_T InitGetMemoryInfo(DWORD dwPid) {
PERFORMANCE_INFORMATION PerForInfo;
memset(&PerForInfo, 0, sizeof(PerForInfo));
if(!::GetPerformanceInfo(&PerForInfo, sizeof(PerForInfo)))
return -1;
SIZE_T stPageSize = PerForInfo.PageSize;
SIZE_T stMemorySize = GetMemoryInfo(dwPid,stPageSize)/1024;
return stMemorySize;
}