利用VB修改註冊表

在Windows出問題時,如果能夠了解Windows系統的註冊表,將更容易解決問題; 許多商品化的軟件或專業化的軟件在您的機器上首次安裝的時候都會通過改寫註冊表來完成軟件的正確安裝運行,要成爲編程高手當然需要掌握讀寫註冊表這一技術。用好註冊表將會爲您的應用程序增色不少,下面筆者將具體介紹VB中與註冊表有關的編程方法。
註冊表的組織結構
存取註冊表以前, 必須先了解註冊表的組織結構, 而瞭解註冊表的組織結構最簡單的方法便是啓動 Windows 提供的“註冊表編輯器”, 啓動的方法是單擊“開始”菜單的“運行”命令,輸入 RegEdit 之後確定,可看到“註冊表編輯器”窗口(如圖1所示)。


● 鍵(Key) 與子鍵(Subkey)
註冊表編輯器的結構與資源管理器很類似, 左邊窗口的每一個文件夾圖標表示一個鍵,就像文件夾下還有子文件夾一樣, 註冊表的鍵下也有子鍵。爲了完整地表示某一個子鍵,習慣上是採用文件夾的路徑表示法。 舉例來說, HKEY_LOCAL_MACHINE 之下的“Software”子鍵表示成 HKEY_LOCAL_
MACHINE/Software,而“Software”之下的 “Microsoft”子鍵則表示成 HKEY_LOCAL_
MACHINE/Software/Microsoft

● 鍵值()、鍵名( Name)、數據( Data) 與默認鍵值(Default )
當我們在註冊表編輯器左邊窗口選取某一個鍵(或子鍵) 之後, 出現在右邊窗口中的是這個鍵的鍵值(),鍵值可分成鍵名(Name)及數據(Data)兩部分。對每一個鍵而言, 至少都含有一個默認鍵值(Default ) , 以 “HKEY_CLASSES_ROOT/
.bmp”子鍵爲例, 其默認鍵值爲 “ACDC_BMP”。 除了默認鍵值之外, 這個子鍵還含有名稱 (Name)“Content Type”和數據 (Data)“image/bmp“

VB 自身提供的
關於註冊表的函數
瞭解註冊表的組織結構之後, 接下來討論如何存取它。就像我們存取文件時必須指明文件所在文件夾(目錄)一樣, 存取註冊表時, 則必須先指明鍵。鍵在註冊表編輯器中所看到的是一長串的字符串,例如 “HKEY_LOCAL_MACHINE/SOFTWARE/
Microsoft/Windows/CurrentVersion”。在 Visual Basic 6.0 內部,已經提供了一個標準的註冊位置,以存儲創建於VB的應用程序的程序信息:HKEY_CURRENT_USER/Software/VB and VBA Program settings/(爲了敘述簡單,以下將這一位置簡稱“標準位置”)。VB 提供了兩個語句和兩個函數來處理存儲在應用程序註冊位置的程序設置值:
函數GetSetting(appname, section, key[, default]): 檢索註冊表設置值。
語句SaveSetting appname,section,key,: 保存或創建註冊表設置值。
函數GetAllSettings(appname, section): 返回一個包含多項註冊表設置值的數組。
語句DeleteSetting appname, section[, key]: 刪除註冊表設置值。
以上所用參數的說明:
[ ]: 表示可選項。
appname:字符串表達式,包含應用程序或工程的名稱,是標準位置下的一個子鍵。
section:字符串表達式,包含區域名稱,是 appname 下的一個子鍵。
key:字符串表達式,標準位置/appname/
section子鍵的鍵名( Name)。
:字符串表達式,標準位置/appname/
section子鍵對應於鍵名( Name)的鍵值()。
default:表達式,如果註冊表項設置中沒有設置值,則返回默認值。如果省略,則 default 取值爲長度爲零的字符串 (“”)。
GetAllSettings返回Variant,是內容爲字符串的二維數組,該二維數組包含指定區域中的所有註冊表項設置值及其對應值。 如果 appname 或 section 不存在,則GetAllSettings 返回未初始化的 Variant。
實例之一
在 VB6.0中新建一工程並命名爲 vbreg.vbp,刪去其中所有窗體,在工程資源管理器中點擊右鍵,選擇添加模塊,並命名爲 vbreg.bas。雙擊reg.bas,輸入如下代碼:
Dim avntSettings As Variant
Dim intX As Integer
avntSettings = GetAllSettings(“VB 6 API 聲明加載器”, “File List”)
For intX = 0 To UBound(avntSettings, 1)
Debug.Print avntSettings(intX, 0), avntSettings(intX, 1)
Next intX
上面這段程序首先用 GetAllSettings 函數檢索“VB 6 API 聲明加載器”子鍵File List部分的兩個註冊表項的值,並將其結果顯示在立即窗口中。開始運行前請按+確保立即窗口顯示在屏幕上。同時請打開註冊表,以便將標準位置/VB 6 API 聲明加載器/File List的鍵值與結果進行對照。
下面這段程序用 SaveSetting 語句在標準位置下建立名爲“我的工程/我的子鍵”的子鍵,然後使用 GetSetting 函數來得到其中一項設置值並顯示出來。因爲有傳入參數default,GetSetting 函數一定會有返回值。
請注意,區域名稱不能用GetSetting 函數取得。最後,使用 DeleteSetting 語句將該子鍵刪除。
SaveSetting “我的工程”, “我的子鍵”, “Top”, 75
SaveSetting “我的工程”, “我的子鍵”, “Left”, 50
Debug.Print “Top”, GetSetting(“我的工程”, “我的子鍵”, “Top”, “25”)
Debug.Print “Left”, GetSetting(“我的工程”, “我的子鍵”, “Left”, “0”)
’爲了便於觀察,調試可以在此處設置斷點,同時切換到註冊表,按下鍵刷新,即可看到自己建立的子鍵及其鍵值
DeleteSetting “我的工程”, “我的子鍵”
’運行完畢後再次切換到註冊表並按下鍵刷新,觀察己建立的子鍵及其鍵值是否被刪除
說明: 運行本程序前,需先確保啓動VB時已自動加載“API文本瀏覽器”,且在API文本瀏覽器中的“文件”菜單下有打開過的“文本文件”列表。否則,請先打開“API文本瀏覽器”,並在“文件”菜單下選擇“打開文本文件”,打開至少一個文本文件或數據庫。
Windows API 的註冊表編程
VB自身雖提供了四個關於註冊表的函數,但是這些函數只能在“HKEY_CURRENT_USER/
Software/VB and VBA ProgramSettings”下讀取、刪除、修改鍵值。這對於一般的應用程序利用它們可以達到目的,如果想對其他的非“標準位置”的主鍵或子鍵進行訪問,該怎麼辦?此時,必須藉助Windows API的幫助。
在Windows內部, 每一個鍵都會對應到一個 Key Handle(等於一個長整數值,程序中通常以 hKey表示),Windows之所以要以hKey來代表鍵是爲了讓註冊表的存取更有效率,因爲整數的操作效能要優於字符串, 所以我們首先來了解如何取得鍵的 Key Handle(即hKey)。位於最上層的鍵,有HKEY_CLASSES_ROOT、HKEY_CURRENT
_USER、HKEY_LOCAL_MACHINE等,這些鍵的hKey值是固定不變的,其值見下表:
-----------------------
  Key      Key Handle
-----------------------
HKEY_CLASSES_ROOT    &H80000000
HKEY_CURRENT_CONFIG &H80000005  HKEY_CURRENT_USER &H80000001
HKEY_DYN_DATA &H80000006
HKEY_LOCAL_MACHINE &H80000002
HKEY_USERS         &H80000003
--------------------
但如果要取得這些鍵的Subkey Handle,則必須調用RegOpenKey API函數,RegOpenKey含有三個參數,用法如下:
Private Declare RegOpenKey Lib “advapi32.dll” Alias “RegOpenKeyA” (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
這裏hKey是Key Handle,lpSubkey是子鍵的字符串,PhkResult是函數返回值,若 RegOpenKey調用成功, 則此參數將傳回子鍵的hKey。
舉例來說,我們想取得HKEY_LOCAL_MA
CHINE之下的“SOFTWARE/Microsoft”子鍵, 則使用的聲明是:
Dim ret As Long,hKey As Long
ret=RegOpenKey(HKEY_LOCAL_
MACHINE, “SOFTWARE/Microsoft”, hKey)
If ret = 0 Then
’ret=0表示成功,hKey的值等於“SOFTWARE
/Microsoft”Subkey的Key Handle
End If
請注意調用註冊表API函數(例如以上的 RegOpenKey)之後,若成功將傳回0,否則傳回非0值,這一點與VB函數的慣例並不相同,請特別注意。
RegOpenKey 的第一個參數 hKey 除了可以指定最上層的Key Handle值(例如 HKEY_CLASSES
_ROOT、HKEY_LOCAL_MACHINE等)之外, 也可以是一個 Subkey Handle。如上例, hKey 等於“HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft” 的 Subkey Handle, 接着如果我們要取得 “HKEY_
LOCAL_MACHINE/SOFTWARE/Microsoft/
Windows/CurrentVersion” 的 Subkey Handle, 則程序如下:
Dim ret As Long, hKey As Long, hKey2 As Long
ret=RegOpenKey(hKey, “Windows/Current
Version”, hKey2)
’hKey2將等於“HKEY_LOCAL_MAC
HINE/SOFTWARE/Microsoft”的“Windows/
CurrentVersion”的Subkey Handle
在以上程序中,請注意不要在“Windows/
CurrentVersion”之前加上“/”,使之成爲“/Windows
/CurrentVersion”,這是錯誤的表示方法。
下面簡單地介紹一下其他幾個API(32位API):
● RegSetEx(): 在打開的註冊表關鍵字的值域中存儲數據;
● RegCloseKey(): 釋放指定的關鍵字的句柄;
● RegQueryEx(): 在註冊表中查找與您指定的鍵值相關的值;
● RegCreateKeyEx(): 建立並打開指定的關鍵字,若已存在則打開它;
● RegEnumKeyEx(): 枚舉指定的註冊表關鍵字的子關鍵字(32位);
● RegEnum(): 每次調用枚舉指定的註冊表關鍵字的值,複製一個帶索引的值的名稱和數據塊;
● RegDeletekey(): 刪除一個關鍵字以及它的子關鍵字;
● RegDelete(): 在指定的註冊表關鍵字中刪除一個帶名字的值。
結束語
通過調用這些API以及VB提供給我們的函數,我們可以輕鬆實現註冊表的任意關鍵字的讀取、查詢、建立和刪除,詳細的用法可查閱“API瀏覽器”,在這裏就不再進行討論了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章