當前位置:編程學習大全網 - 編程語言 - 關於vb編程修改註冊表的問題

關於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(): 在指定的註冊表關鍵字中刪除壹個帶名字的值。

結束語

  • 上一篇:求壹篇以論文形式書寫的5000字左右工廠金工車間實習報告
  • 下一篇:編程與制作相關書籍推薦
  • copyright 2024編程學習大全網