0

これは、レジストリにキーが存在するかどうかを確認するために XPCOM CPP DLL で使用するコードの簡単な例です。2 つのキーの存在を確認します。HKLM\SOFTWARE\Microsoft両方HKLM\SOFTWARE\Microsoとも同じアクセス許可で存在しますが、最初のキーはこのコードで検出され、2 番目のキーは検出されません...なぜでしょうか?

nsCOMPtr<nsIWindowsRegKey> regKey = 
    do_CreateInstance("@mozilla.org/windows-registry-key;1");
if (!regKey) {
    log("can't create @mozilla.org/windows-registry-key;1");
    return -1;
}
NS_NAMED_LITERAL_STRING(key2,
   "SOFTWARE\\Microsoft");
if (NS_FAILED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CLASSES_ROOT,
                          key2, nsIWindowsRegKey::ACCESS_QUERY_VALUE))) {

     // FAILED
    LOG("regKey:: no such key");

}

NS_NAMED_LITERAL_STRING(key1,
   "SOFTWARE\\Microso");
if (NS_FAILED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CLASSES_ROOT,
                          key1, nsIWindowsRegKey::ACCESS_QUERY_VALUE))) {

    // FAILED
    LOG("regKey:: no such key");

}

編集:明確にするために、私は自分でレジストリキーを作成し、呼び出しHKLM\SOFTWARE\Microsoて、regedit.

4

2 に答える 2

0

nsIWindowsRegKey.Openは、RegOpenKeyExWinAPI関数を介して実装されます。この関数は、引数として渡された既存の相対パスを必要とし、テンプレートをサポートしていません。レジストリにまったく同じパスがない場合は、該当します。SOFTWARE \ MicrosoftはHKLMルートスペースに存在しますが、HKLM \ SOFTWARE\Microsoは存在しません。

于 2012-07-25T12:56:57.520 に答える
0

この問題は、x64 regedit を使用してレジストリを表示し、Firefox にも同じビューがあることを期待している可能性が最も高いです。ただし、regedit は x64 アプリケーションですが、通常の Firefox ビルドは x86 であり、32 ビット サブシステム内で ( WoW64経由で) 実行されます。x86 アプリケーションがHKLM\Softwareキーにアクセスすると、リダイレクトされHKLM\Software\Wow6432Nodeます。x86 アプリケーションが取得するレジストリのビューを表示するc:\Windows\SysWOW64\regedit.exe代わりに実行できます。c:\Windows\regedit.exe

したがって、XPCOM コンポーネントは実際にHKLM\Software\Wow6432Node\MicrosoftandにアクセスしようとしていますHKLM\Software\Wow6432Node\Microso- 前者は存在しますが、後者は存在しません。代わりに「実際の」レジストリ キーにアクセスする場合は、次の 3 番目のパラメーターにWOW64_64フラグを渡す必要があります (これは、 WinAPI 関数に渡すことができるフラグnsIWindowsRegKey.open()に対応します)。KEY_WOW64_64KEYRegOpenKeyEx

NS_NAMED_LITERAL_STRING(key1,
   "SOFTWARE\\Microso");
if (NS_FAILED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CLASSES_ROOT, key1,
                          nsIWindowsRegKey::ACCESS_QUERY_VALUE | nsIWindowsRegKey::WOW64_64))) {

    // FAILED
    LOG("regKey:: no such key");

}
于 2012-07-30T22:56:22.757 に答える