【问题标题】:Detect whether the 3gb Switch is on or off programmatically以编程方式检测 3gb 开关是打开还是关闭
【发布时间】:2010-02-18 21:12:46
【问题描述】:

我一直在尝试通过调用 GetSystemInfo() 并检查 SYSTEM_INFO 结构上的 lpMaximumApplicationAddress 来确定我的程序正在运行的系统上的 3GB 开关是打开还是关闭。

没有运气。我觉得我做错了什么。

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

谢谢

【问题讨论】:

  • lpMaximumApplicationAddress 是正确的检查。试了会返回什么?

标签: c winapi


【解决方案1】:

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

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

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

【讨论】:

  • 64 位操作系统会报告ullTotalVirtual 的内存为 4GB(开始时减去 128k,结束时减去 128k)。真的,如果ullTotalVirtual 大于 3 GB,那么你就知道它是一个 x64 操作系统。
【解决方案2】:

你的程序是 IMAGE_FILE_LARGE_ADDRESS_AWARE 吗?

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

可以使用 3 GB 地址空间的可执行文件需要在其映像头中设置 IMAGE_FILE_LARGE_ADDRESS_AWARE 位。如果您是可执行文件的开发者,您可以指定链接器标志 (/LARGEADDRESSAWARE)。

【讨论】:

  • 我只需要知道它是否打开。就是这样
  • 你用来测试是否开启的程序必须是/LARGEADDRESSAWARE。是吗?
  • 谢谢。我再问:有没有办法通过代码知道3gb开关是ON还是OFF?如果是,你知道怎么做吗?无论是否设置了该标志。
  • @Jessica:我认为 John 试图告诉您,除非在可执行文件中设置了 IMAGE_FILE_LARGE_ADDRESS_AWARE 位,否则 Windows 会欺骗您的应用程序。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2013-03-11
    • 2021-06-17
    相关资源
    最近更新 更多