0

私の簡略化されたコード:

HKEY hKey;

if(someCondition)
    lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_READ, &hKey);
else
    lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, "SOFTWARW\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_READ, &hKey);

if(lRes == ERROR_SUCCESS)
{
    std::wstring strKeyValue;
    lRes = GetStringRegKey(hKey, L"valueName", strKeyValue, L"bad");
    if(lRes == ERROR_SUCCESS)
    {
         //doSomething
    }
}

両方ともRegOpenKeyExW()戻りERROR_SUCCESSますが、1つの場合(から読み取るWow6432Node)はをGetStringRegKey()返しERROR_SUCCESS、初期化しstrKeyValue、他の場合はを返しますERROR_FILE_NOT_FOUND。すべてのパスと値の名前は正しいです。エントリは手動でレジストリに追加されました。

何が問題ですか?クレデンシャルの問題はありますか?ありがとう!

4

1 に答える 1

0

注: これに関する最初の質問は、HKEY_CLASSES_ROOT と HKEY_LOCAL_MACHINE の使用の違いは何ですか? また、一方が機能し、他方が機能しないのはなぜですか。これは、その質問に投稿された回答です。

Microsoft ソースから取得: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724475(v=vs.85).aspx

HKEY_CLASSES_ROOT (HKCR) キーには、ファイル名拡張子の関連付けと、ProgID、CLSID、IID などの COM クラス登録情報が含まれています。これは主に、16 ビット Windows のレジストリとの互換性を目的としています。

クラスの登録とファイル名拡張子の情報は、HKEY_LOCAL_MACHINE キーと HKEY_CURRENT_USER キーの両方に格納されます。HKEY_LOCAL_MACHINE\Software\Classes キーには、ローカル コンピューター上のすべてのユーザーに適用できる既定の設定が含まれています。HKEY_CURRENT_USER\Software\Classes キーには、対話ユーザーにのみ適用される設定が含まれています。HKEY_CLASSES_ROOT キーは、これら 2 つのソースからの情報をマージするレジストリのビューを提供します。HKEY_CLASSES_ROOT は、以前のバージョンの Windows 用に設計されたアプリケーションに対して、このマージされたビューも提供します。

違いはHKEY_CLASSES_ROOT、以前のバージョンの Windows のレジストリの統一されたビューを表示し、既定のユーザー設定を現在のユーザー設定とマージすることです。これは主に、対話型ユーザーの設定を読み取るために使用されます。提供されたリンクにあるように、値の保存には使用しないでください。読み取り専用であり、実際には「HKEY_CURRENT_USER」ハイブにマップされます。

HKEY_CURRENT_USERは「真の」レジストリ パスであるため、セキュリティ上の理由から、書き込みアクセスを必要とするレジストリとのやり取りはすべて、代わりにこのパスを経由する必要があります。どの分岐を取るかは、レジストリ内のユーザーの設定のみを更新するか、レジストリ内のすべてのユーザー設定を更新するかによって異なります。

于 2013-03-12T20:53:57.720 に答える