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

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

+0

你有一个错字:lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE,“SOFTWARW \\ Wow6432Node \\”。它应该是“SOFTWARE”。 另外,你不需要包含'\\ Wow6432Node \\ '当打开注册表项时,Windows操作系统会为你做这些,当你使用RegEdit.exe工具去注册时,你只​​需要知道它。 – StarPilot 2013-03-12 22:10:21

回答

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是“真”的注册表路径,因此所有与注册表交互,需要写访问应该通过它来代替,由于安全方面的原因。要采取的分支取决于您是仅更新注册表中的用户设置还是注册表中的所有用户设置。

+1

它是如何解释读取时收到的'FILE_NOT_FOUND' 'HKEY_LOCAL_MACHINE'? – Sanich 2013-03-12 21:05:35

+0

您所要求的条目不存在,或者您无法使用当前的信用访问它,您应该检查您所要求的内容,并检查注册表以确保路径对您尝试的条目是正确的如果您在64位操作系统(例如Windows 7)上运行32位应用程序,则会发现实际的注册表项不在您认为的位置,因为它们插入了“Wow643 “SOFTWARE”键后的“2Node”。 – StarPilot 2013-03-12 21:07:37

+0

正如后续---操作系统将照顾在“WoW64”下运行的32位应用程序(因此将其注册表调用映射到Wow6432Node中),但如果您自己去查看注册表,则需要了解额外的蜂房在那里。 – StarPilot 2013-03-12 21:19:57