【问题标题】:What is 32 & 64 bit c++ code?什么是 32 位和 64 位 C++ 代码?
【发布时间】:2014-07-31 01:45:35
【问题描述】:

我正在尝试从注册表项中获取值,并且最终程序必须在 32 位和 64 位计算机上都可以运行。

目前的代码是:

   HKEY hKey; 
   LONG Result1;
   LONG result2;
   Result1 = RegOpenKeyEx(HKEY_CLASSES_ROOT,L"Word.Application\\CurVer",0,KEY_READ,&hKey);
    cout << Result1;
    cout << "\n";
   TCHAR value[255];
   DWORD BufferSize = 255;
   result2 = RegGetValue(hKey, L"Word.Application\\CurVer", L"", RRF_RT_ANY, NULL, (PVOID)&value, &BufferSize);
   cout << result2;

我从 RegGetValue 收到错误“2”,并查看了这个 RegOpenKeyEx/RegGetValue return ERROR_FILE_NOT_FOUND on keys that exist,它说如果它是“64 位操作系统上的 32 位代码”,它将无法工作,但我不明白这意味着什么.

是需要针对不同架构编译的程序,还是32位特有的RegGetValue?

抱歉,我的大部分 C++ 编程都是在 64 位计算机成为主流之前完成的,此后我偶尔编写的项目都没有出现这个问题。

【问题讨论】:

  • link 注册表有 2 个空间 - 32 位和 64 位。它们在内容方面有所不同,就我而言,您可以一次访问一个。
  • 32 位和 64 位注册表项位于不同的位置,因此取决于它应该查询哪个注册表。所以对于 32 位你需要 OR 你的 KEY_READ 标志和 KEY_WOW64_32KEY 对于 64 位你 ORKEY_WOW64_64KEY 这是一个 64 位应用程序查询 32 位或 64-位键。通常,您可以使用ifdef _M_X64 检测到 64 位,然后相应地设置标志。见msdn.microsoft.com/en-gb/library/windows/desktop/…msdn.microsoft.com/en-gb/library/windows/desktop/…
  • 不需要ifdef _M_X64。您可以无条件使用KEY_WOW64_32KEYKEY_WOW64_64KEY
  • @Louise 您需要决定要从哪个注册表视图中读取。那么,它是什么?
  • @DavidHeffernan 确实如此,但这取决于您是否真的要读取哪个键,这可能取决于编译器和您的应用程序偏好,但您是正确的,32 位的标志被忽略windows,但如果你在 64 位 windows 上,你仍然需要它

标签: c++ windows registry 32bit-64bit


【解决方案1】:

在 64 位 Windows 上,有两个注册表视图,32 位视图和 64 位视图。这在 MSDN 上标题为 Accessing an Alternate Registry View 的主题中进行了描述。

默认情况下,32 位进程将从 32 位视图读取,而 64 位进程将从 64 位视图读取。如果您希望从特定视图读取,无论进程的体系结构如何,您都需要提供以下标志之一:KEY_WOW64_64KEYKEY_WOW64_32KEY

因此,如果您需要的数据是 32 位视图,请传递 KEY_WOW64_32KEY。如果数据在 64 位视图中,则通过 KEY_WOW64_64KEY。如果数据可以在任一键中,请检查两次,一次通过KEY_WOW64_32KEY,再次通过KEY_WOW64_64KEY

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2011-04-05
    • 2011-09-04
    • 1970-01-01
    • 2021-02-08
    • 2010-09-07
    相关资源
    最近更新 更多