2013-03-12 139 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