请教个问题,获取程序本身占用的内存

公共马甲0315 2018-08-13 03:14:06

void CKIS1Dlg::MyRecycleRecord()
{
HANDLE handle = GetCurrentProcess();
if(handle)
{
PROCESS_MEMORY_COUNTERS pmc;
GetProcessMemoryInfo(handle,&pmc,sizeof(pmc));
TRACE1("Process cost %dk",pmc.WorkingSetSize/1000);
}
else
TRACE1("Failed to get process handle with err %d\n",GetLastError());
}

我拷贝过来的一段代码,但是发现获取的数据值和任务管理器的不一致,请问如何能让它们一致?
...全文
394 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-08-14
  • 打赏
  • 举报
回复
注意区别64位和32位的不同。
zgl7903 2018-08-14
  • 打赏
  • 举报
回复
我使用定时器观察,和任务管理器看到的是一样的, (XP VS2008)


#include <psapi.h>
#pragma comment(lib, "psapi.lib")

void CDlg1Dlg::OnTimer(UINT_PTR nIDEvent)
{
HANDLE hProcess = GetCurrentProcess();

PROCESS_MEMORY_COUNTERS pmc = {0};
pmc.cb = sizeof(pmc);

if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
{
TRACE( _T("\n") );
TRACE( _T("\tPageFaultCount: %.3fK\n"), pmc.PageFaultCount/1024.0 );
TRACE( _T("\tPeakWorkingSetSize: %.3fK\n"), pmc.PeakWorkingSetSize/1024.0 );
TRACE( _T("\tWorkingSetSize: %.3fK\n"), pmc.WorkingSetSize/1024.0 );
TRACE( _T("\tQuotaPeakPagedPoolUsage: %.3fK\n"), pmc.QuotaPeakPagedPoolUsage/1024.0 );
TRACE( _T("\tQuotaPagedPoolUsage: %.3fK\n"), pmc.QuotaPagedPoolUsage/1024.0 );
TRACE( _T("\tQuotaPeakNonPagedPoolUsage: %.3fK\n"), pmc.QuotaPeakNonPagedPoolUsage/1024.0 );
TRACE( _T("\tQuotaNonPagedPoolUsage: %.3fK\n"), pmc.QuotaNonPagedPoolUsage/1024.0 );
TRACE( _T("\tPagefileUsage: %.3fK\n"), pmc.PagefileUsage/1024.0 );
TRACE( _T("\tPeakPagefileUsage: %.3fK\n"), pmc.PeakPagefileUsage/1024.0 );
}

}
公共马甲0315 2018-08-13
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
NtQuerySystemInformation


//MSDN注解//
/*
typedef struct _SYSTEM_PROCESS_INFORMATION {
ULONG NextEntryOffset;
ULONG NumberOfThreads;
BYTE Reserved1[48];
PVOID Reserved2[3];
HANDLE UniqueProcessId;
PVOID Reserved3;
ULONG HandleCount;
BYTE Reserved4[4];
PVOID Reserved5[11];
SIZE_T PeakPagefileUsage;
SIZE_T PrivatePageCount;
LARGE_INTEGER Reserved6[6];
} SYSTEM_PROCESS_INFORMATION;

The NumberOfThreads member contains the total number of currently running threads in the process.

The HandleCount member contains the total number of handles being used by the process in question; use GetProcessHandleCount to retrieve this information instead.

The PeakPagefileUsage member contains the maximum number of bytes of page-file storage used by the process, and the PrivatePageCount member contains the number of memory pages allocated for the use of this process.

You can also retrieve this information using either the GetProcessMemoryInfo function or the Win32_Process class.

The other members of the structure are reserved for internal use by the operating system.
*/
PSYSTEM_PROCESS_INFORMATION pSS = new SYSTEM_PROCESS_INFORMATION[30000];
ZeroMemory(pSS,sizeof(SYSTEM_PROCESS_INFORMATION)*30000);
DWORD len3 = 0;
DWORD ret = NtmyQ(SystemProcessInformation,pSS,sizeof(SYSTEM_PROCESS_INFORMATION)*30000,&len3);
len3 = len3/sizeof(SYSTEM_PROCESS_INFORMATION);
double vv = 0;
for(int i=0;i<len3;i++)
{
vv = double(pSS[i].PeakPagefileUsage)/1024/1024;
if(vv<0.02)
continue;
TRACE2("PID %d --> Memory %.2lfMB\n",pSS[i].UniqueProcessId,vv);
}

返回结果当中很多超大内存开销的上几个G的,任务管理器当中都没有这么大的进程
请问大侠,我获取的数据结果当中大量的UniqueProcessId数值为0的,还有一些和任务管理器里面的PID也不是对应的,这个获取到以后,怎么知道哪个是哪个进程的信息?
-------------->一些返回结果
PID 273904 --> Memory 21.10MB
PID 5 --> Memory 0.00MB
PID 8 --> Memory 0.00MB
PID 7736 --> Memory 0.00MB
PID 0 --> Memory 59.99MB
PID 30683808 --> Memory 1459.72MB
PID 0 --> Memory 1.34MB
PID 0 --> Memory 0.00MB
PID 0 --> Memory 0.00MB
PID 5 --> Memory 0.00MB
PID 8 --> Memory 0.00MB
PID 6960 --> Memory 0.00MB
PID 1498633392 --> Memory 60.02MB
PID 30683820 --> Memory 3136.07MB
PID 0 --> Memory 0.00MB
PID 0 --> Memory 0.00MB
PID 0 --> Memory 0.00MB
PID 5 --> Memory 0.13MB
。。。。。。
公共马甲0315 2018-08-13
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
NtQuerySystemInformation

调用出错了,怎么办?没有DDK

hNtDll = LoadLibrary(L"NtDll.dll");
NtmyQ = (pNTFunc)GetProcAddress(hNtDll,"NtQuerySystemInformation");
SYSTEM_PROCESS_INFORMATION mDB[100];
ZeroMemory(mDB,sizeof(SYSTEM_PROCESS_INFORMATION)*100);
DWORD len3 = 0;
NTSTATUS ret = NtmyQ(SystemProcessInformation,mDB,sizeof(SYSTEM_PROCESS_INFORMATION)*100,&len3);

ret == -1073741820
len3 == 177648 没有这么多进城的
赵4老师 2018-08-13
  • 打赏
  • 举报
回复
NtQuerySystemInformation

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧