2010-02-18 85 views
4

我一直试图通过调用GetSystemInfo()并检查SYSTEM_INFO结构上的lpMaximumApplicationAddress来确定系统上的3GB开关是打开还是关闭。检测3gb开关是否以编程方式打开或关闭

没有运气。我认为我做错了什么。

如何检查3GB开关是否打开或不在C的Windows? 代码表示赞赏。

谢谢

+0

lpMaximumApplicationAddress是正确的检查。当你尝试时会返回什么? – Gabe 2010-02-18 22:25:22

回答

3

假设你的程序被编译为较大的地址,你可以简单地调用GlobalMemoryStatusEx并检查ullTotalVirtual领域。如果它大于2GB,并且您在32位系统上运行,则必须打开3GB标志。

我实际上并不知道如何“正确”判断Windows本身是32位还是64位,但如果您有32位进程,则可以调用IsWow64Process来查看您是否在64位操作系统上运行。

这一切似乎有点间接的,我知道:)

+0

对于'ullTotalVirtual',64位操作系统会报告4GB(开始时减去128k,结束时为128k)。真的,如果ullTotalVirtual大于3 GB,那么你知道它是一个x64操作系统。 – 2017-06-28 17:18:16

3

是你的程序IMAGE_FILE_LARGE_ADDRESS_AWARE?可以使用3-GB地址空间

http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx

可执行需要具有位IMAGE_FILE_LARGE_ADDRESS_AWARE在他们的图像标头中设置。如果您是可执行文件的开发人员,则可以指定链接器标志(/ LARGEADDRESSAWARE)。

+0

我只需要知道它是否打开。这就是全部 – Jessica 2010-02-18 21:33:53

+0

您用来测试它的程序是否必须构建/ LARGEADDRESSAWARE。是吗? – 2010-02-18 21:42:04

+0

谢谢。 我会再问一次:有没有办法通过代码知道3gb开关是ON还是OFF?如果是的话,你知道如何做到这一点?不管该标志是否设置。 – Jessica 2010-02-18 21:43:49

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上进行测试。

相关问题