0

Visual Studio2010のデバッガーでWindows764ビットのC++プログラム(32ビットWin XPでうまく機能します)を実行していますが、次のコードで既存のレジストリキーを開くことができません。

#define ACCESS  (KEY_WRITE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS)

HKEY hKey;
long dwErrorCode = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\MYTHING", 0, ACCESS|KEY_WOW64_64KEY, &hKey);

if (dwErrorCode != ERROR_SUCCESS) 
{
// display error message
}

返されるエラーコードは次のとおりです。5「アクセスが拒否されました」というシステムメッセージが表示されます。

これは、Visual Studio 2010を管理者として実行している場合は機能しますが、実行する必要はありません。誰かが提案を提供できますか?

更新:言及するのを忘れました。ここで行っているのは、WindowsXPからのレガシーコードの移植です。そのため、このソフトウェアの作成方法の基本構造を変更するオプションはありません。レガシーコードはレジストリを使用するため、移植されたコードもレジストリを使用する必要があります。

また、特定のコンピューターに変更を加えたくはありません。つまり、これを実行するすべてのコンピューターを変更する必要があるためです。影響を受けるマシンがたくさんあるため、これは厄介になる可能性があります。たとえば、マシン全体でUACをオフにしたくありません。

さらなる更新:私は満足している解決策を見つけられませんでした。デバッグの目的でエラーコード5を無視することにしましたが、今のところ十分に機能しているようです。Word、Firefoxなどの標準アプリがすべての種類の設定でレジストリを使用しているように見えるが、昇格されていないことや、レジストリを変更するための特別な権限を付与する必要がないことを理解しようとしていますか?

4

3 に答える 3

4

わかりました。私の質問に対する答えを見つけたので、他の誰かが将来の参照のためにそれを必要とする場合に備えて、ここに投稿します。このスレッドは、実際にはC#のトピックになっていますが、役立つことがわかりました。

http://social.msdn.microsoft.com/Forums/da-DK/netfx64bit/thread/92f962d6-7f5e-4e62-ac0a-b8b0c9f552a3

基本的に、次のように、64ビットレジストリではなく32ビットレジストリを読み取るためのアクセス許可を変更する必要がありました。

HKEY hKey;
long dwErrorCode = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\MYTHING", 0, ACCESS|KEY_WOW64_32KEY, &hKey);

if (dwErrorCode != ERROR_SUCCESS) 
{
// display error message
}

出来上がり、すべてがうまくいきました!皆様のご尽力に感謝いたします。

更新:これは他のマシンではうまく機能しなかったことが判明しました。そのため、誰かが私のマシンの1つで32ビットレジストリへのアクセス権を変更したに違いないことがわかりました。したがって、操作するレジストリキーへのアクセス権をユーザーに付与する必要があります。

于 2011-10-16T14:17:56.913 に答える
2

昇格モードでプロセスを実行するか、UAC をオフにする必要があります。もちろん、アクセスを許可する特定のレジストリ キーにアクセス権を割り当てることができます。

于 2011-10-15T22:09:49.727 に答える