从注册表项中读取字符串值

时间:2013-03-12 19:29:39

标签: c++ registry windows-7-x64 visual-studio-2008-sp1

我的简化代码:

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但在一个案例中(从Wow6432Node读取)GetStringRegKey()会返回ERROR_SUCCESS并初始化strKeyValue并在在其他情况下,它返回ERROR_FILE_NOT_FOUND。所有路径和值名称都是正确的。这些条目已手动添加到注册表中。

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

1 个答案:

答案 0 :(得分: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)键包含文件扩展名   关联和COM类注册信息,如ProgIDs,   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是“真正的”注册表路径,因此出于安全原因,所有与需要写访问权限的注册表的交互都应该通过它。要采用哪个分支取决于您是仅更新注册表中的用户设置,还是更新注册表中的所有用户设置。