2

下面的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 位构建中找到密钥?我需要在两个版本中找到它。

谢谢。

4

2 回答 2

7

这无疑是平台目标的副作用。在 64 位操作系统上,32 位进程的 HKLM/Software 密钥被重定向到 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 的优势。

于 2012-04-27T14:00:31.513 回答
2

尝试使用标准变体在 C++ 中打开

LONG lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders", 0, KEY_READ, &hKey);
于 2012-04-27T14:01:13.637 回答