我的简化代码:
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
。所有路径和值名称都是正确的。这些条目已手动添加到注册表中。
有什么问题?是否有任何凭据问题?谢谢!
答案 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
是“真正的”注册表路径,因此出于安全原因,所有与需要写访问权限的注册表的交互都应该通过它。要采用哪个分支取决于您是仅更新注册表中的用户设置,还是更新注册表中的所有用户设置。