2012-07-24 84 views
0

以下是我在XPCOM CPP DLL中用於檢查註冊表中是否存在密鑰的代碼的簡化示例。 它檢查2鍵的存在:HKLM\SOFTWARE\MicrosoftHKLM\SOFTWARE\Microso都存在具有相同的權限,但第一個是通過此代碼找到,第二個不是......任何想法爲什麼?XPCOM CPP代碼無法在註冊表中找到現有密鑰

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訪問它。

+0

您是否使用了x64 Windows上的x86 Firefox構建(通常)? – 2012-07-30 19:42:58

+0

@WladimirPalant是的。 – zenpoy 2012-07-30 20:11:46

回答

0

nsIWindowsRegKey.Open通過RegOpenKeyEx WinAPI函數實現。該函數需要將現有相對路徑作爲參數傳遞,並且不支持模板。如果註冊表中沒有完全相同的路徑,則會下降。 SOFTLARE \ Microsoft存在於HKLM根空間中,HKLM \ SOFTWARE \ Microso不存在。

+0

嗨 - 看到我的編輯,這兩個鍵都存在。 – zenpoy 2012-07-25 14:22:07

0

該問題很可能是您正在使用x64 regedit查看註冊表,然後期望Firefox具有相同的視圖。但是,註冊表是一個x64應用程序,而通常的Firefox版本是x86,並在32位子系統內運行(通過WoW64)。當x86應用程序訪問HKLM\Software密鑰時,它將被重定向到HKLM\Software\Wow6432Node。您可以運行c:\Windows\SysWOW64\regedit.exe而不是c:\Windows\regedit.exe以查看x86應用程序獲取的註冊表視圖。

所以你的XPCOM組件實際上是試圖訪問HKLM\Software\Wow6432Node\MicrosoftHKLM\Software\Wow6432Node\Microso - 前者存在,而後者不存在。如果您要訪問的「真實」的註冊表鍵代替,你必須通過WOW64_64 flagnsIWindowsRegKey.open()(其對應於KEY_WOW64_64KEY flag可以傳遞給RegOpenKeyEx WinAPI function)的第三個參數:

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"); 

}