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

时间:2012-04-27 13:51:46

标签: c# c++-cli

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

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

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

RegistryKey pKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders");

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

我刚才发现在x64中构建C ++代码可以让它找到密钥。所以我现在的问题是如何在32位版本中找到密钥?我需要在两个版本中找到它。

感谢。

2 个答案:

答案 0 :(得分: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的优势。

答案 1 :(得分:2)

尝试使用标准变体

在C ++中打开
LONG lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders", 0, KEY_READ, &hKey);