为什么在Vista 64位系统中,RegOpenKeyEx()返回错误码2?

32

我正在进行以下调用:

result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);

(C++, Visual Studio 5, Vista 64bit).

尽管“regedit”显示键存在,但它以错误代码2(“文件未找到”)失败。 在32位XP上,此代码一直有效。为什么明明存在还是会显示“文件未找到”?

5个回答

63

26

在 Windows 64 位系统中,注册表实际上被分成了两个部分。一部分由 64 位进程使用,另一部分由 32 位进程使用。

例如,如果一个 32 位应用程序以编程方式写入它认为是 HKLM\SOFTWARE\Company\Application 的位置,它实际上会被 WoW64 层重定向到 HKLM\SOFTWARE\Wow6432Node\Company\Application。

因此,当您运行 32 位应用程序并调用 RegOpenKeyEx 时,它实际上是针对 Wow6432Node\ 文件夹而不是常规的 \SOFTWARE 节点进行操作。


2
请注意不要依赖于键名为“Wow6432Node”。相反,使用RegOpenKeyEx的标志访问其他注册表视图。 - Billy ONeal

1

您需要使用“使用多字节字符集”编译或在代码中将字符串转换为(LPWSTR)。


0

我曾经遇到过类似的问题。 当时我在使用:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   (LPWSTR)"SOFTWARE\\0test",
                                   0,
                                   WRITE_DAC ,
                                   &hKey);

那不起作用。我尝试了这样做,它起作用了:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   _T("SOFTWARE\\0test"),
                                   0,
                                   WRITE_DAC ,
                                   &hKey);

7
永远不要只是插入强制转换来让编译器闭嘴。编译器正确地拒绝编译第一个没有强制转换的代码。 - Billy ONeal

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接