0

这是我在 XPCOM CPP DLL 中使用的代码的简化示例,用于检查注册表中是否存在密钥。它检查是否存在 2 个键:HKLM\SOFTWARE\Microsoft并且HKLM\SOFTWARE\Microso两者都具有相同的权限,但是此代码找到了第一个,而第二个则没有……知道为什么吗?

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 通过 RegOpenKeyEx WinAPI 函数实现。此函数需要作为参数传递的现有相对路径,并且不支持模板。如果注册表中没有完全相同的路径,它就会下降。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. 您可以运行c:\Windows\SysWOW64\regedit.exe而不是c:\Windows\regedit.exe查看 x86 应用程序获取的注册表视图。

因此,您的 XPCOM 组件实际上是在尝试访问HKLM\Software\Wow6432Node\MicrosoftHKLM\Software\Wow6432Node\Microso- 前者存在而后者不存在。如果您想访问“真实”的注册表项,则必须在的第三个参数中传递WOW64_64标志nsIWindowsRegKey.open()(它对应于可以传递给WinAPI 函数的KEY_WOW64_64KEY标志):RegOpenKeyEx

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 回答