GetProcessMemoryInfo函数xp使用正常,在Win10上使用不正常.函数的功能已被kernel32.dll中的K32GetProcessMemoryInfo替代.因此在Win10采用动态调用的方法,如下:
#include <windows.h>
#include <psapi.h>
typedef BOOL (WINAPI *PGET_PROCESS_MEMORY_INFO)(HANDLE handle,
PROCESS_MEMORY_COUNTERS* memCounters, DWORD cb);
static PGET_PROCESS_MEMORY_INFO GCGetProcessMemoryInfo = 0;
HINSTANCE hKernel32DLL=LoadLibrary("kernel32.dll");//加载dll库
if(hKernel32DLL)
{
GCGetProcessMemoryInfo = (PGET_PROCESS_MEMORY_INFO)GetProcAddress(hKernel32DLL,"K32GetProcessMemoryInfo");
if(!GCGetProcessMemoryInfo) return "内存占用:%0.0MB峰值:%0.0MB";
DWORD dwProcessID = GetCurrentProcessId();
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_READ, NULL, dwProcessID);
PROCESS_MEMORY_COUNTERS process_mem_counters = {0};
process_mem_counters.cb = sizeof(PROCESS_MEMORY_COUNTERS);
DWORD bRet = GCGetProcessMemoryInfo(hProcess, &process_mem_counters,sizeof(PROCESS_MEMORY_COUNTERS));
AnsiString strTemp = AnsiString().sprintf("内存占用:%0.2fMB峰值:%0.2fMB",
process_mem_counters.WorkingSetSize/1024.0/1024.0,
process_mem_counters.PeakWorkingSetSize/1024.0/1024.0);
CloseHandle(hProcess);
return strTemp;
}
if(hKernel32DLL)//卸载dll
{
FreeLibrary(hKernel32DLL);
hKernel32DLL = NULL;
}
在Win10上获取的是程序集内存,不是内存(专用程序集),如果程序既要在xp上使用,又要在Win10上使用,需要判断一下Windows的版本。新的开发工具,可以直接GetProcessMemoryInfo,对于老的开发工具,如VC6,BCB6等才需要如上代码。