OpenSubKey在C++中的行为与在C#中的行为不同

Ada*_*uss 2 c# c++-cli

以下C++/CLI代码将nullptr返回给pKey.

RegistryKey^ pKey = Microsoft::Win32::Registry::LocalMachine->OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders");
Run Code Online (Sandbox Code Playgroud)

下面的C#代码返回一个指向pKey的有效指针.

RegistryKey pKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders");
Run Code Online (Sandbox Code Playgroud)

除了语言差异外,这两个代码片段看起来与我完全相同.

我只是想通过在x64中构建C++代码可以找到密钥.所以我现在的问题是如何在32位版本中找到密钥?我需要在两个版本中找到它.

谢谢.

Han*_*ant 7

毫无疑问,这是平台目标的副作用.在64位操作系统上,HKLM/Software密钥被重定向到32位进程到HKLM/Software/Wow6432Node.您要查找的特定密钥不存在的位置.

因此,C#代码的工作原理很好,因为它以AnyCPU为目标,因此以64位模式运行.并且C++/CLI代码不起作用,因为它针对的是Win32.C++/CLI没有AnyCPU模式,您必须在x64和Win32之间进行选择.包含本机代码的C++/CLI程序集的副作用.

在.NET 4中,RegistryKey类获得了一个额外的OpenBaseKey()方法,该方法允许指定注册表视图.早期版本没有简单的解决方法.考虑在C++/CLI项目中添加x64平台.或者使用原生的winapi函数,而不是C++/CLI的优势.