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");

2 つのコード スニペットは、言語の違いを除けば、まったく同じように見えます。

x64 で C++ コードをビルドすると、キーを見つけることができることがわかりました。私の質問は、32ビットビルドでキーを見つけるにはどうすればよいですか? 両方のビルドでそれを見つける必要があります。

ありがとう。

4

2 に答える 2

7

これは間違いなくプラットフォーム ターゲットの副作用です。64 ビット オペレーティング システムでは、32 ビット プロセスの HKLM/ソフトウェア キーが HKLM/ソフトウェア/Wow6432Node にリダイレクトされます。探している特定のキーが存在しない場所。

したがって、AnyCPU をターゲットにして 64 ビット モードで実行されるため、C# コードが機能する可能性は高くなります。また、C++/CLI コードは Win32 を対象としているため機能しません。C++/CLI 用の AnyCPU モードはありません。x64 と Win32 のどちらかを明示的に選択する必要があります。ネイティブ コードを含む C++/CLI アセンブリの副作用。

.NET 4 では、レジストリ ビューを指定できる追加の OpenBaseKey() メソッドが RegistryKey クラスに追加されました。以前のバージョンの簡単な回避策はありません。C++/CLI プロジェクトに x64 プラットフォームを追加することを検討してください。または、C++/CLI の強みであるネイティブの winapi 関数を代わりに使用します。

于 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 に答える