【问题标题】:How to detect on C++ is windows 32 or 64 bit?如何在 C++ 上检测是 windows 32 还是 64 位?
【发布时间】:2014-07-04 23:50:28
【问题描述】:

如何在 C++ 上检测 Windows 是 32 位还是 64 位? 我在 .Net 中看到了很多示例,但我需要 C++。 IsWow64Process() 也不适合我,因为“如果进程在 32 位 Windows 下运行,则该值设置为 FALSE。如果该进程是在 64 位 Windows 下运行的 64 位应用程序,则该值为也设置为 FALSE”

如果我在 32 位操作系统下有 32 位 proc,我有 FALSE 如果我在 64 位操作系统下有 64 位 proc,我有 FALSE

但我不关心我需要操作系统位的进程位

【问题讨论】:

  • 为什么不接受一个答案?我想其中两个是正确的。

标签: c++ windows winapi visual-c++


【解决方案1】:

检测底层系统信息的 Win32 API 函数是GetNativeSystemInfo。调用函数并读取函数填充的SYSTEM_INFO 结构的wProcessorArchitecture 成员。

虽然实际上可以使用IsWow64Process 来检测这一点。如果您调用IsWow64Process 并返回TRUE,那么您就知道您在64 位系统上运行。否则,返回FALSE。然后你只需要测试一个指针的大小,例如。 32 位指针表示 32 位系统,64 位指针表示 64 位系统。实际上,您可能可以从编译器提供的条件中获取信息,具体取决于您使用的编译器,因为指针的大小在编译时是已知的。

Raymond Chen 在blog article 中描述了这种方法。他有用地包含了我在这里复制的代码:

BOOL Is64BitWindows()
{
#if defined(_WIN64)
 return TRUE;  // 64-bit programs run only on Win64
#elif defined(_WIN32)
 // 32-bit programs run on both 32-bit and 64-bit Windows
 // so must sniff
 BOOL f64 = FALSE;
 return IsWow64Process(GetCurrentProcess(), &f64) && f64;
#else
 return FALSE; // Win64 does not support Win16
#endif
}

【讨论】:

  • 为什么是最后一个“&& f64”?看起来编译器可以优化整行以“返回 false”,因为“A && false”为 false。
  • @vz0 不,对IsWow64Process() 的调用会修改f64
  • @vz0: IsWow64Process() 返回 TRUE/FALSE 以指示 BOOL 变量是否已更新。如果为 TRUE,则该变量指示所请求的进程是否是 WOW64 进程(在 64 位上运行的 32 位)。这就是需要额外检查的原因:return ((query was successful) && (query result is true));
  • 对我来说看起来像是未定义的行为。是吗?我的 C++-std-fu 被浪费了
  • @vz0 否。C++ 逻辑运算符从左到右进行短路计算
【解决方案2】:

GetSystemWow64DirectoryW

检索 WOW64 使用的系统目录的路径。此目录在 32 位 Windows 上不存在。

【讨论】:

  • 嗯。有趣的答案。这会在 32 位 Windows 上工作还是返回异常?
【解决方案3】:

另一种方法是检查系统分区上是否存在“Program Files (x86)”根文件夹。它将出现在 x64 Windows 安装上,而不是 x86 安装上。

【讨论】:

  • 这绝对不可靠。该文件夹可能有其他语言的其他名称,并且该文件夹的路径也可以轻松更改
  • @phuclv 关于其他语言的好点,但路径不能轻易更改。如果您认为可以,请提供参考。
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 2011-02-10
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多