我正在进行以下调用:
result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);
(C++, Visual Studio 5, Vista 64bit).
尽管“regedit
”显示键存在,但它以错误代码2(“文件未找到”)失败。 在32位XP上,此代码一直有效。为什么明明存在还是会显示“文件未找到”?
我正在进行以下调用:
result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);
(C++, Visual Studio 5, Vista 64bit).
尽管“regedit
”显示键存在,但它以错误代码2(“文件未找到”)失败。 在32位XP上,此代码一直有效。为什么明明存在还是会显示“文件未找到”?
我发现可以使用以下标志解决我的问题:KEY_WOW64_64KEY
:
result = RegOpenKeyEx(key, s, 0, KEY_READ|KEY_WOW64_64KEY, &key);
完整解释请参见:注册表中的32位和64位应用程序数据
在 Windows 64 位系统中,注册表实际上被分成了两个部分。一部分由 64 位进程使用,另一部分由 32 位进程使用。
例如,如果一个 32 位应用程序以编程方式写入它认为是 HKLM\SOFTWARE\Company\Application 的位置,它实际上会被 WoW64 层重定向到 HKLM\SOFTWARE\Wow6432Node\Company\Application。
因此,当您运行 32 位应用程序并调用 RegOpenKeyEx 时,它实际上是针对 Wow6432Node\ 文件夹而不是常规的 \SOFTWARE 节点进行操作。
您需要使用“使用多字节字符集”编译或在代码中将字符串转换为(LPWSTR)。
我曾经遇到过类似的问题。 当时我在使用:
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
(LPWSTR)"SOFTWARE\\0test",
0,
WRITE_DAC ,
&hKey);
那不起作用。我尝试了这样做,它起作用了:
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\0test"),
0,
WRITE_DAC ,
&hKey);
是的,Win7 64位系统,添加进一步的标志KEY_WOW64_64KEY,它就可以工作了。 如果还不行,请参考http://msdn.microsoft.com/en-us/library/ms724897(v=VS.85).aspx
RegOpenKeyEx
的标志访问其他注册表视图。 - Billy ONeal