web-dev-qa-db-ja.com

RegOpenKeyEx()がVista 64ビットでエラーコード2を返すのはなぜですか?

私は次の電話をかけていました:

result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);

(C++、Visual Studio 5、Vista 64ビット)。

regedit」はキーが存在することを示していますが、エラーコード2(「ファイルが見つかりません」)で失敗しています。このコードは常に32ビットXPで動作します。明らかにそこにあるのに、なぜ「ファイルが見つからない」のですか?

29
Tim Cooper

次のフラグを使用して問題を解決できることを発見しました:KEY_WOW64_64KEY、次のように:

result = RegOpenKeyEx(key, s, 0, KEY_READ|KEY_WOW64_64KEY, &key);

完全な説明: レジストリ内の32ビットおよび64ビットのアプリケーションデータ

57
Tim Cooper

Windows 64ビットシステムでは、レジストリは実際には2つの部分に分かれています。 1つのセクションは64ビットプロセスで使用され、1つのセクションは32ビットプロセスで使用されます。

たとえば、32ビットアプリケーションがHKLM\SOFTWARE\Company\Applicationであるとプログラムが書き込む場合、実際にはWoW64レイヤーによってHKLM\SOFTWARE\Wow6432Node\Company\Applicationにリダイレクトされます。

したがって、32ビットアプリケーションを実行してRegOpenKeyExを呼び出すと、実際には通常の\ SOFTWAREノードではなくWow6432Node \フォルダに対して機能します。

23
Frode Lillerud

「マルチバイト文字セットを使用」でコンパイルするか、コード内の文字列を(LPWSTR)にキャストする必要があります

1
GMG

はい、win7 64B、さらにKEY_WOW64_64KEYフラグを追加すると、機能します。動作しない場合は、 http://msdn.Microsoft.com/en-us/library/ms724897(v = VS.85).aspx を参照してください

0
yue

同様の問題がありました。私は使っていました:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   (LPWSTR)"SOFTWARE\\0test",
                                   0,
                                   WRITE_DAC ,
                                   &hKey);

それはうまくいきませんでした。私はこれを試してみましたが、うまくいきました:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   _T("SOFTWARE\\0test"),
                                   0,
                                   WRITE_DAC ,
                                   &hKey);
0
Alex