运行时是否正确检查Windows是否为64位? (C ++)

时间:2010-01-26 16:06:43

标签: c++ registry

bool Win64bit = (sizeof(int*) == 8) ? 1 : 0;

我需要这个,所以我的应用程序可以正常使用Windows注册表功能(或者我需要吗?)。

我做得对吗?

4 个答案:

答案 0 :(得分:15)

以下是Raymond Chen在http://blogs.msdn.com/oldnewthing/archive/2005/02/01/364563.aspx的博客中提出的建议:

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
}

答案 1 :(得分:7)

不,这不能用作运行时检查,因为sizeof(int*)在编译时被修复,您选择将程序编译为32位或64位-bit,一旦编译,检查将具有相同的固定结果,无论您在哪个平台上运行它。

但是,由于64位程序无法在32位平台上运行,因此您会发现检查正常无需修改作为编译时检查:

如果您将程序编译为64位,由于上面的代码,您的程序将使用64位API,并且可以在64位版本的Windows上正常运行。它将无法在32位窗口上运行,因此您不会在32位版本的Windows上意外使用64位API。

v++ platform == 64-bit => sizeof(int*) == 8 => use 64-bit API
AND
( windows platform == 64-bit => 64-bit API works
  OR
  windows platform == 32-bit => program does not run )

如果您以32位模式编译程序,您的程序将正确使用32位API,这将在32位兼容模式下在64位Windows平台上运行,并且显然可以在32-上运行位平台。

v++ platform == 32-bit => sizeof(int*) == 4 => use 32-bit API
AND
( windows platform == 64-bit => 32-bit API works using compatibility mode
  OR
  windows platform == 32-bit => 32-bit API works )

如果你真的想从32位程序访问64位API,我敢说有API可以做到这一点,但我不确定你是否愿意。

答案 2 :(得分:4)

此外,可以使用IsWow64Process检查您是否是在64位Windows计算机上运行WoW64仿真的32位进程(sizeof(void*)==4)。

答案 3 :(得分:0)

这是另一种方式: GetSystemWow64Directory - “检索WOW64使用的系统目录的路径。此目录在32位Windows上不存在。”和“在32位Windows上,该函数始终失败,并且扩展错误设置为ERROR_CALL_NOT_IMPLEMENTED。” 关于IsWow64Process我个人不确定在MSDN中的用法在IsWow64Process的描述中有文字“请注意,这种技术不是一种可靠的方法来检测操作系统是否是64位版本的Windows,因为当前版本的32位Windows中的Kernel32.dll也包含此功能。“