私は次の電話をかけていました:
result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);
(C++、Visual Studio 5、Vista 64ビット)。
「regedit
」はキーが存在することを示していますが、エラーコード2(「ファイルが見つかりません」)で失敗しています。このコードは常に32ビットXPで動作します。明らかにそこにあるのに、なぜ「ファイルが見つからない」のですか?
次のフラグを使用して問題を解決できることを発見しました:KEY_WOW64_64KEY
、次のように:
result = RegOpenKeyEx(key, s, 0, KEY_READ|KEY_WOW64_64KEY, &key);
Windows 64ビットシステムでは、レジストリは実際には2つの部分に分かれています。 1つのセクションは64ビットプロセスで使用され、1つのセクションは32ビットプロセスで使用されます。
たとえば、32ビットアプリケーションがHKLM\SOFTWARE\Company\Applicationであるとプログラムが書き込む場合、実際にはWoW64レイヤーによってHKLM\SOFTWARE\Wow6432Node\Company\Applicationにリダイレクトされます。
したがって、32ビットアプリケーションを実行してRegOpenKeyExを呼び出すと、実際には通常の\ SOFTWAREノードではなくWow6432Node \フォルダに対して機能します。
「マルチバイト文字セットを使用」でコンパイルするか、コード内の文字列を(LPWSTR)にキャストする必要があります
はい、win7 64B、さらにKEY_WOW64_64KEYフラグを追加すると、機能します。動作しない場合は、 http://msdn.Microsoft.com/en-us/library/ms724897(v = VS.85).aspx を参照してください
同様の問題がありました。私は使っていました:
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
(LPWSTR)"SOFTWARE\\0test",
0,
WRITE_DAC ,
&hKey);
それはうまくいきませんでした。私はこれを試してみましたが、うまくいきました:
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\0test"),
0,
WRITE_DAC ,
&hKey);