从注册表项读取字符串值

Reading string value from registry key

本文关键字:字符串 读取 注册表      更新时间:2023-10-16

我的简化代码:

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。所有路径和值名称都是正确的。手工将表项添加到注册表。

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

注意:最初的问题是使用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类注册信息,如progid,clsid和iid。它主要用于与

类注册和文件扩展名信息存储在HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER键。的HKEY_LOCAL_MACHINESoftwareClasses键包含默认设置可以应用于本地计算机上的所有用户。的HKEY_CURRENT_USERSoftwareClasses键包含适用的设置只对交互用户。HKEY_CLASSES_ROOT键提供了一个合并这两个信息的注册中心的视图来源。HKEY_CLASSES_ROOT也为为以前版本的Windows设计的应用程序。

所以不同之处在于:HKEY_CLASSES_ROOT将为以前版本的Windows提供一个统一的注册表视图,并将默认用户设置与当前用户设置合并。它主要用于读取交互式用户的设置。它不应该用于存储值,只用于读取,可以在提供的链接中找到,它实际上映射到' HKEY_CURRENT_USER' hive。

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