OpenSubKey在C++;比C#

OpenSubKey在C++;比C#,c#,c++-cli,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::LocalMa

下面的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");
RegistryKey pKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders");
除了语言上的差异外,这两段代码在我看来完全相同

<>我刚刚发现,在x64中构建C++代码使它能够找到密钥。所以我现在的问题是,在32位构建中,如何找到密钥?我需要在两个版本中都找到它


谢谢。

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

因此,C#代码工作的可能性很大,因为它以任何CPU为目标,因此在64位模式下运行。C++/CLI代码无法工作,因为它以Win32为目标。C++/CLI没有AnyCPU模式,您必须明确地在x64和Win32之间进行选择。包含本机代码的C++/CLI程序集的副作用


在.NET4中,RegistryKey类获得了一个额外的OpenBaseKey()方法,该方法允许指定注册表视图。早期版本没有简单的解决方法。考虑在您的C++/CLI项目中添加X64平台。或者使用本机WiAPI函数代替C++/CLI的强度。

< P>试着用标准变型

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

我只是随口说说,所以我不能把它作为一个答案,但是传递的字符串参数有可能有差异吗?也许C++/CLI值正在以ASCII字符串传递,而C#代码没有使用ASCII编码。使用本机函数RegOpenKeyEx并将KEY_WOW64_64KEY分解到第四个参数samDesired中,用于在64位机器上运行的32位构建中访问注册表。