C++零食:重啟後消失的註冊表索引值

來源:互聯網
上載者:User
文章目錄
  • Bug描述
  • Why?
  •  
  • 原因
  • 解決辦法
  • 參考資料

今天遇到一個bug,折騰了半天才解決掉,分享給大家。

 

Bug描述

一位開發人員調用下面的代碼來建立一個註冊表索引值:

HKEY hKey;if(::RegOpenKeyEx(HKEY_CURRENT_USER, DemoRegKey, 0, KEY_WRITE, &hKey) != ERROR_SUCCESS){    RegCreateKeyEx(HKEY_CURRENT_USER, DemoRegKey, 0, NULL, REG_OPTION_VOLATILE        , KEY_ALL_ACCESS   , NULL   , &hKey, NULL);        }

執行後,成功的在登錄編輯程式中看到了索引值,後續從中擷取值等代碼沒有任何問題。

提交測試後發現,當系統重啟後,上面的程式建立的註冊表索引值都沒有了,導致後面讀取索引值的代碼都報錯。

 

Why?

隨後我調整了代碼,發現下面的代碼在重啟後得到的錯誤碼是2

LONG lRet;lRet = ::RegOpenKeyEx(HKEY_CURRENT_USER, DemoRegKey, 0, KEY_WRITE, &hKey);

執行這段代碼lRet的值是2. 錯誤碼2的意思是:系統找不到指定的檔案。 對於註冊表函數而已,就是對應的鍵不存在。

調試後發現,建立註冊表的代碼的確成功執行了,在註冊表中也可以看得到。同時,再調用讀取索引值的代碼,也沒有任何問題。但是一旦重啟電腦,路徑就不存在了,裡面儲存的索引值都沒有了。

看來是某些程式刪掉了我的索引值,於是尋找所有刪除索引值的代碼,沒有找到。

在重啟前將所有的程式都刪除掉。但是重啟後,該死的索引值還是沒有出現。

看來是系統或者其它程式刪除的。難道我的索引值和某些程式的索引值重名了?好,這次用guid做鍵名,還是重啟後沒有了。

哇哇,真是抓狂啊。

這時候,我回過頭來再細看所有建立註冊表相關的代碼,因為必定是我的程式導致索引值消失的。

我注意到了REG_OPTION_VOLATILE  這個奇怪的參數。

MSDN之後,我終於找到了原因,就是這個參數造成的。

 原因

REG_OPTION_VOLATILE  這個參數的意思是建立的註冊表索引值都位於記憶體中,不會儲存到相應的註冊表檔案中

英文如下:

All registry keys are created as volatile, and the information is stored in memory and is not preserved when the corresponding registry hive is unloaded. For HKEY_LOCAL_MACHINE, this occurs when the OS is shut down. The RegSaveKey function does not save volatile registry keys. This flag is ignored for keys that already exist.

所以,重啟後這些索引值當然就沒有了。

 

解決辦法

很簡單,使用REG_OPTION_NON_VOLATILE 即可

RegCreateKeyEx(HKEY_CURRENT_USER, DemoRegKey, 0, NULL, REG_OPTION_NON_VOLATILE            , KEY_ALL_ACCESS   , NULL   , &hKey, NULL);        

 

這個可以用在測試上。一重啟,之前建立的索引值都沒了。

 

參考資料

RegCreateKeyEx Function

http://msdn.microsoft.com/en-us/library/ms724844(VS.85).aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.