为什么RegOpenKeyEx()在Vista 64bit上返回错误代码2?

时间:2008-10-31 00:58:25

标签: c++ winapi windows-vista registry wow64

我正在拨打以下电话:

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

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

即使“regedit”表示该密钥存在,它也会失败并显示错误代码2(“找不到文件”)。这段代码一直在32位XP上运行。当它显然存在时,为什么“找不到文件”?

5 个答案:

答案 0 :(得分:56)

我发现我可以使用旗帜KEY_WOW64_64KEY来解决我的问题,如:

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

有关完整说明:32-bit and 64-bit Application Data in the Registry

答案 1 :(得分:23)

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

例如,如果32位应用程序以编程方式写入其认为是HKLM \ SOFTWARE \ Company \ Application的内容,则它实际上由WoW64层重定向到HKLM \ SOFTWARE \ Wow6432Node \ Company \ Application。

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

答案 2 :(得分:1)

你必须使用"使用多字节字符集"或者将代码中的字符串转换为(LPWSTR)

答案 3 :(得分: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);

答案 4 :(得分:0)

是的,win7 64B,进一步添加标志KEY_WOW64_64KEY,它会起作用。 如果不起作用,请参阅http://msdn.microsoft.com/en-us/library/ms724897(v=VS.85).aspx