程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 遍歷搜索注冊表

遍歷搜索注冊表

編輯:關於VC++

一、注冊表的組織結構

圖一

類比: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。

模糊查找:該程 序目前對字符串的搜索是精確查找,要使其功能更加強大,須加入字符串模糊匹 配算法。

查找下一個符合條件的值:如果注冊表中有多個滿足條件的值,那 麼本程序只能查出第一個,對遞歸進行中斷,再恢復,可實現下一次查找。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved