我一直在尝试通过调用GetSystemInfo()并检查SYSTEM_INFO结构上的lpMaximumApplicationAddress来确定我的程序运行的系统上是否打开或关闭3GB开关。
没有运气。我想我做错了。
如何在C中检查Windows上的3GB开关是否打开? 代码表示赞赏。
感谢
答案 0 :(得分:3)
你的程序是IMAGE_FILE_LARGE_ADDRESS_AWARE吗?
http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx
可以使用3 GB地址空间的可执行文件需要在其图像标头中设置IMAGE_FILE_LARGE_ADDRESS_AWARE位。如果您是可执行文件的开发人员,则可以指定链接器标志(/ LARGEADDRESSAWARE)。
答案 1 :(得分:3)
假设您的程序编译为大地址识别,您只需致电GlobalMemoryStatusEx
并检查ullTotalVirtual
字段即可。如果它大于2GB,并且您在32位系统上运行,则必须打开3GB标志。
我实际上不知道如何'正确'判断Windows本机是32位还是64位,但如果你有32位进程,你可以调用IsWow64Process
来查看你是否运行64位-bit OS。
这一切似乎有点间接,我知道:)。
答案 2 :(得分:2)
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上进行测试。