一、注冊表的組織結構
圖一
類比:Key有如文件夾,Value有如文件。
Value組成:Name/Type/Data, 通常指某Value就是指其Name。
二、目前的訪問手段
regedit, regedt32,第三方軟件,編程。
Windows提供了三種方式供編程實現:函數,Shell函數,CRegKey類(由ATL庫提供,是對API的封裝,簡化了部分功能)。這三種方式的提供的函數大同小異;由於它們對注冊表操作的函數都是原子動作,故功能強大卻使用不便。
類比:dir浏覽當前文件夾下的子文件夾和文件,卻無法知道子文件夾中有什麼;注冊表操作函數也僅能浏覽當前Key下的Subkey和Value,卻無法知道Subkey中有什麼。
三、面臨的問題——本程序的目的
無法直接查詢注冊表中是否存在某一Key或Value。
為實現對注冊表的查詢,必須編程對注冊表進行遍歷。
遞歸函數是不二的選擇。
圖二
四、基本函數(以API為例):
1、RegOpenKeyEx
主要參數:欲訪問鍵柄,子鍵路徑,訪問權限,返回鍵柄
欲訪問鍵柄可以是5個預定義根鍵,也可以是返回鍵柄
子鍵路徑如果是空串,表明直接打開欲訪問鍵柄
返回的鍵柄可以直接指定為欲訪問鍵柄
為加快處理速度,鍵柄用長整型表示
注:鍵的句柄,簡稱鍵柄
2、RegQueryKeyInfo
主要參數:欲訪問鍵柄,返回子鍵數目
3、RegEnumKeyEx
主要參數:欲訪問鍵柄,子鍵編號,返回某編號子鍵名
通過RegQueryKeyInfo返回的子鍵數目,再用RegEnumKeyEx逐個返回子鍵名
4、RegQueryValueEx
主要參數:欲訪問鍵柄, 欲查詢Value的Name
如果存在該Name,則返回ERROR_SUCCESS
五、算法設計:使用遞歸函數對注冊表進行遍歷
1、使用RegOpenKeyEx打開一個鍵
2、使用RegQueryValueEx查找是否存在欲查詢的Value
A、是:退出遞歸,並表示“已找到”
B、否:使用RegQueryKeyInfo查找當前鍵下是否有子鍵
I、否:當前鍵下無欲查找的Value
II、是:逐個打開子鍵,並調用遞歸函數
六、算法流程圖:
圖三
七、結束語——尚待改進之處
針對不同條件查找:目前查找的對象僅為value的name,改進可使其查找key和value的data。
模糊查找:該程序目前對字符串的搜索是精確查找,要使其功能更加強大,須加入字符串模糊匹配算法。
查找下一個符合條件的值:如果注冊表中有多個滿足條件的值,那麼本程序只能查出第一個,對遞歸進行中斷,再恢復,可實現下一次查找。
本文示例代碼或素材下載