如何确定一个进程“虚拟大小”(WinXP)?

我有一个需要大量内存的程序,一旦达到2GB的虚拟地址空间就会崩溃。 Sysinternals进程资源pipe理器将其显示为“虚拟大小”列。 我怎样才能用C(或C ++)代码来确定这个“虚拟大小”?

好吧,我必须查询“虚拟字节”的性能计数器。 Perfmon在我的德语Win XP安装中显示查询string(或如何调用),例如“\ Process(firefox)\ VirtuelleGröße”。

如何确定“当前进程”的查询string,是否有一个非本地化的名称?

Solutions Collecting From Web of "如何确定一个进程“虚拟大小”(WinXP)?"

根据MSDN:内存性能信息 PROCESS_MEMORY_COUNTERS_EX.PrivateUsage与Windows XP中的任务管理器中的VM大小相同。 GetProcessMemoryInfo应该工作:

 PROCESS_MEMORY_COUNTERS_EX pmcx = {}; pmcx.cb = sizeof(pmcx); GetProcessMemoryInfo(GetCurrentProcess(), reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb); 

现在pmcx.PrivateUsage保存进程的VM大小。

您查询性能计数器。
在win32 API中有一个完整的API,在这里阅读 。
你可以看看所有的性能计数器,如果你运行一个名为“perfmon.exe”

您可以使用性能计数器。 过程对象具有“虚拟字节”值。

我需要的是同样的东西,但不幸的是需要它的一个过程,而不是我自己的。 因此,使用“MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual”的自我回答对我来说不起作用,因为GlobalMemoryStatusEx()(返回MEMORYSTATUXEX的函数)仅适用于当前进程。

到目前为止,如果不使用性能计数器,我一直无法准确找到我要找的东西(我没有涉及到,因为它们看起来比我想要的要复杂得多)。 我非常接近,循环使用“VirtualQueryEx”来探索所需进程的地址空间,统计所有没有MEM_FREE状态的区域。 在我的测试中,似乎比我预期的要比Process Explorer高17M。 …而且,这当然不是无条件的。

无论如何,我知道这是一个无法回答的问题,但我想我至少要记录下我在这方面取得的进展。

在32位WindowsXP地址空间被分成两个2GB的部分:一部分为程序,另一部分为内核。 您可以使用boot.ini文件中的/ 3GB开关将应用程序部分增加到3GB。

你不需要性能计数器。 只要使用NAPI(Win32 FAQ)

请参阅win32组新闻://nntp.aioe.org/comp.os.ms-windows.programmer.win32获取C代码。