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,但在一种情况下(从 读取Wow6432NodeGetStringRegKey()返回ERROR_SUCCESS并初始化 ,strKeyValue而在另一种情况下则返回ERROR_FILE_NOT_FOUND。所有路径和值名称都是正确的。这些条目是手动添加到注册表中的。

问题是什么?是任何凭据问题吗?谢谢!

4

1 回答 1

0

注意:最初的问题是使用 HKEY_CLASSES_ROOT 和 HKEY_LOCAL_MACHINE 之间的区别是什么,以及为什么使用一种有效而另一种无效。这是该问题的答案。

取自微软来源: http: //msdn.microsoft.com/en-us/library/windows/desktop/ms724475 (v=vs.85).aspx

HKEY_CLASSES_ROOT (HKCR) 键包含文件扩展名关联和 COM 类注册信息,例如 ProgID、CLSID 和 IID。它主要用于与 16 位 Windows 中的注册表兼容。

类注册和文件扩展名信息存储在 HKEY_LOCAL_MACHINE 和 HKEY_CURRENT_USER 键下。HKEY_LOCAL_MACHINE\Software\Classes 项包含可应用于本地计算机上所有用户的默认设置。HKEY_CURRENT_USER\Software\Classes 键包含仅适用于交互式用户的设置。HKEY_CLASSES_ROOT 键提供了一个注册表视图,它合并了来自这两个源的信息。HKEY_CLASSES_ROOT 还为为以前版本的 Windows 设计的应用程序提供此合并视图。

所以不同的是:HKEY_CLASSES_ROOT会为以前版本的Windows呈现一个统一的注册表视图,并将默认用户设置与当前用户设置合并。它主要用于读取交互式用户的设置。它不应该用于存储值,只能用于读取,如提供的链接中所示,它实际上映射到“HKEY_CURRENT_USER”配置单元。

HKEY_CURRENT_USER是“真正的”注册表路径,因此出于安全原因,所有需要写访问权限的注册表交互都应该通过它。采用哪个分支取决于您是仅更新注册表中的用户设置,还是更新注册表中的所有用户设置。

于 2013-03-12T20:53:57.720 回答