登記處的組織結構
在訪問註冊表之前,首先要了解註冊表的組織結構,而了解註冊表組織結構最簡單的方法就是啟動Windows提供的註冊表編輯器。啟動方法是在開始菜單中點擊運行命令,進入RegEdit並確認,看到註冊表編輯器窗口(如圖1)。
密鑰和子密鑰。
註冊表編輯器的結構與資源管理器非常相似。左側窗口中的每個文件夾圖標都代表壹個鍵,就像文件夾下有子文件夾壹樣,註冊表的鍵下也有子項。為了完整地表示壹個子項,習慣上使用文件夾的路徑表示。例如,HKEY_LOCAL_MACHINE下的“Software”子項表示為HKEY_LOCAL_。
MACHINE\Software,而“Software”下的“Microsoft”子項表示為HKEY _本地_。
機器\軟件\微軟
鍵值(),鍵名(Name),數據(Data)和默認鍵值(Default)
當我們在註冊表編輯器的左窗口中選擇壹個註冊表項(或子項)時,該項的鍵值()出現在右窗口中,分為兩部分:鍵名和數據。對於每個鍵,至少有壹個默認鍵值(默認值),即“h key類根”
。bmp "子項,例如,它的默認鍵值是“ACDC_BMP”。除了默認的鍵值,該子項還包含名稱)“內容類型”和數據“圖像/BMP”。
VB本身提供。
論登記處的職能
理解了註冊表的組織結構之後,讓我們來討論如何訪問它。就像我們在訪問文件時必須指明文件所在的文件夾(目錄)壹樣,我們在訪問註冊表時也必須首先指明key。註冊表項在註冊表編輯器中看到的是壹個長字符串,如“HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft \ Windows \ current version .在Visual Basic 6.0中,提供了壹個標準的註冊位置來存儲在VB中創建的應用程序的程序信息:HKEY _當前_用戶\軟件\ VB和VBA程序設置\(為了描述的簡單,下面將該位置稱為“標準位置”)。VB提供了兩個語句和兩個函數來處理存儲在應用程序註冊位置的程序設置:
Function getsetting (appname,section,key [,default]):檢索註冊表設置值。
語句SaveSetting appname,section,key,:保存或創建註冊表設置值。
函數GetAllSettings(appname,section):返回包含多個註冊表設置的數組。
語句delete setting appname,section [,key]:刪除註冊表設置值。
上面使用的參數描述:
[]:表示可選。
Appname:字符串表達式,包含應用程序或項目的名稱,是標準位置的子項。
Section: string表達式,包含區域的名稱,是appname下的子項。
關鍵字:字符串表達式,標準位置\appname\
section子項的鍵名。
:字符串表達式,標準位置\appname\
section子項對應於項名(Name)的鍵值()。
Default: expression,如果註冊表項設置中沒有設置值,則返回默認值。如果省略,默認值是零長度字符串(" ")。
GetAllSettings返回壹個變量,它是壹個包含字符串內容的二維數組。二維數組包含所有註冊表項設置值及其在指定區域中的對應值。如果appname或section不存在,GetAllSettings將返回壹個未初始化的變量。
壹個例子
在VB6.0中創建新項目,命名為vbreg.vbp,刪除其中的所有表單,在項目資源管理器中右鍵單擊,選擇添加模塊,命名為vbreg.bas,雙擊reg.bas,輸入以下代碼:
Dim avntSettings作為變體
Dim intX為整數
avntsettings = getallsettings(" VB 6 API聲明加載器","文件列表")
對於intX = 0至UBound(avntSettings,1)
調試。打印avntSettings(intX,0),avntSettings(intX,1)
下壹個intX
上面的程序首先使用GetAllSettings函數檢索“VB 6 API declaration loader”子鍵的文件列表部分中兩個註冊表項的值,並在即時窗口中顯示結果。請在開始之前按+以確保立即窗口顯示在屏幕上。同時請打開註冊表將標準位置\VB 6 API聲明加載器\文件列表的鍵值與結果進行對比。
下面的程序使用SaveSetting語句在標準位置創建壹個名為“My Project \ My Subkey”的子項,然後使用GetSetting函數獲取壹個設置值並顯示它。由於傳入的參數默認值,GetSetting函數必須有返回值。
請註意,不能使用GetSetting函數獲取區域名稱。最後,使用DeleteSetting語句刪除該子項。
保存設置“我的項目”,“我的子項”,“頂部”,75
保存設置“我的項目”,“我的子項”,“左”,50
調試。打印“top”,獲取設置(“我的項目”、“我的子項”、“top”、“25”)
調試。打印“左”,獲取設置(“我的項目”、“我的子項”、“左”、“0”)
為了方便觀察,調試可以在這裏設置斷點,同時切換到註冊表,按鍵刷新,就可以看到自己創建的子項及其鍵值。
刪除設置“我的項目”、“我的子項”
運行後,再次切換到註冊表並按鍵刷新,觀察已建立的子項及其鍵值是否被刪除。
註意:在運行這個程序之前,請確保在啟動VB時自動加載API文本瀏覽器,並且在API文本瀏覽器的文件菜單下有壹個打開的文本文件列表。否則,請打開API文本瀏覽器並選擇“文件”菜單下的“打開文本文件”,以打開至少壹個文本文件或數據庫。
Windows API的註冊表編程
雖然VB本身提供了四個關於註冊表的函數,但是這些函數只能在“HKEY當前用戶”中使用
軟件\ VB和VBA程序設置”。這可以通過將它們用於壹般應用來實現。如果我想訪問其他不在“標準位置”的主鍵或子項,該怎麽辦?此時,必須借助Windows API。
在Windows中,每個鍵都會對應壹個鍵句柄(等於壹個長整型值,在程序中通常用h key表示)。Windows之所以用hKey來表示Key,是為了讓對註冊表的訪問更加高效,因為整數的運算效率要比字符串好,所以我們先來了解壹下如何獲取Key的Key句柄(也就是hKey)。頂層的關鍵字包括Keys類_根和Keys當前。
_USER、hKey_LOCAL_MACHINE等。這些鍵的HKEY值是固定的,它們的值如下表所示:
-
鑰匙把手
-
HKEY _類_根& ampH80000000
HKEY當前配置& ampHKEY _當前_用戶& ampH80000001
HKEY _ DYN _ DATA & ampH80000006
HKEY _本地_機器& ampH80000002
HKEY _用戶& ampH80000003
-
但是如果妳想得到這些鍵的子鍵句柄,妳必須調用RegOpenKey API函數。Regopenkey包含三個參數,用法如下:
Private將RegOpenKey Lib " advapi32.dll "別名" RegOpenKeyA" (ByVal hKey為Long,ByVal lpSubKey為String,phkResult為Long)聲明為Long
這裏hKey是鍵句柄,lpSubkey是子鍵的字符串,PhkResult是函數返回值。如果RegOpenKey調用成功,此參數將返回子項的hKey。
例如,我們想去馬薩諸塞州HKEY本地。
CHINE下的“SOFTWARE\Microsoft”子項,使用的語句是:
Dim ret壹樣長,hKey壹樣長
ret = RegOpenKey(HKEY _本地_
機,“軟件\微軟”,hKey)
如果ret = 0,則
Ret = 0表示成功,hKey的值等於“軟件”
\ Microsoft "子項的密鑰句柄
如果…就會結束
請註意,調用註冊表API函數(如上面的RegOpenKey)後,成功則返回0,否則返回非零值,這與VB函數的約定不同。請特別註意。
RegOpenKey的第壹個參數hKey可以指定頂級鍵句柄值(例如,HKEY _類
_ROOT、HKEY_LOCAL_MACHINE等。),也可以是子項句柄。在上面的例子中,hKey等於“HKEY_本地_機器\軟件\微軟”的子鍵句柄,然後如果我們想得到“HKEY _
本地機器\軟件\微軟\
Windows\CurrentVersion ",程序如下:
Dim ret壹樣長,hKey壹樣長,hKey2壹樣長
ret=RegOpenKey(hKey," Windows\Current
版本",hKey2)
HKEY 2將等於HKEY本地MAC。
HINE \軟件\微軟“視窗”
CurrentVersion的子項句柄
在以上程序中,請註意不要進入" Windows\
在“CurrentVersion”前添加“\”,使其成為“\Windows”
\CurrentVersion ",這是不正確的表示。
以下是其他壹些API(32位API):
● RegSetEx():在打開的註冊表項範圍內存儲數據;
● RegCloseKey():釋放指定關鍵字的句柄;
● RegQueryEx():查找與您在註冊表中指定的鍵值相關的值;
● RegCreateKeyEx():創建並打開指定的關鍵字,如果已經存在則打開;
● RegEnumKeyEx():枚舉指定註冊表項的子項(32位);
● RegEnum():每次調用枚舉指定註冊表項的值時,復制壹個索引值的名稱和數據塊;
● RegDeletekey():刪除壹個關鍵字及其子關鍵字;
● RegDelete():刪除指定註冊表關鍵字中的命名值。
結束語