【发布时间】: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 位你OR和KEY_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_32KEY和KEY_WOW64_64KEY。 -
@Louise 您需要决定要从哪个注册表视图中读取。那么,它是什么?
-
@DavidHeffernan 确实如此,但这取决于您是否真的要读取哪个键,这可能取决于编译器和您的应用程序偏好,但您是正确的,32 位的标志被忽略windows,但如果你在 64 位 windows 上,你仍然需要它
标签: c++ windows registry 32bit-64bit