我一直试图通过调用GetSystemInfo()并检查SYSTEM_INFO结构上的lpMaximumApplicationAddress来确定系统上的3GB开关是打开还是关闭。检测3gb开关是否以编程方式打开或关闭
没有运气。我认为我做错了什么。
如何检查3GB开关是否打开或不在C的Windows? 代码表示赞赏。
谢谢
我一直试图通过调用GetSystemInfo()并检查SYSTEM_INFO结构上的lpMaximumApplicationAddress来确定系统上的3GB开关是打开还是关闭。检测3gb开关是否以编程方式打开或关闭
没有运气。我认为我做错了什么。
如何检查3GB开关是否打开或不在C的Windows? 代码表示赞赏。
谢谢
假设你的程序被编译为较大的地址,你可以简单地调用GlobalMemoryStatusEx
并检查ullTotalVirtual
领域。如果它大于2GB,并且您在32位系统上运行,则必须打开3GB标志。
我实际上并不知道如何“正确”判断Windows本身是32位还是64位,但如果您有32位进程,则可以调用IsWow64Process
来查看您是否在64位操作系统上运行。
这一切似乎有点间接的,我知道:)
对于'ullTotalVirtual',64位操作系统会报告4GB(开始时减去128k,结束时为128k)。真的,如果ullTotalVirtual大于3 GB,那么你知道它是一个x64操作系统。 – 2017-06-28 17:18:16
是你的程序IMAGE_FILE_LARGE_ADDRESS_AWARE?可以使用3-GB地址空间
http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx
可执行需要具有位IMAGE_FILE_LARGE_ADDRESS_AWARE在他们的图像标头中设置。如果您是可执行文件的开发人员,则可以指定链接器标志(/ LARGEADDRESSAWARE)。
FWIW,我已经能够使用下面的代码做检测(发现here):
if (!isWow64())
{
BOOL b3GBSwitch = FALSE;
SYSTEM_INFO siSysInfo;
GetSystemInfo(&siSysInfo);
b3GBSwitch = ((DWORD)siSysInfo.lpMaximumApplicationAddress & 0x80000000) != 0;
printf("3GB Switch Enabled: %d\n", b3GBSwitch);
}
的代码被执行在的过程中不是 LARGEADDRESSAWARE。
到目前为止,我已经能够在Xp x86,Vista x86和Seven x64上进行测试。
lpMaximumApplicationAddress是正确的检查。当你尝试时会返回什么? – Gabe 2010-02-18 22:25:22