Windows API 註冊表函數

來源:互聯網
上載者:User
Windows API 註冊表函數

所謂 API(Application Programing Interface) 是 Windows 提供的一個32位環境下的API,其中包括了眾多的函數,提供了相當豐富的功能。我們在編製應用程式時,可以調用其中的註冊表函數來對註冊表進行操作以實現我們需要的功能。Windows API 中可用於註冊表的函數一共有二十多個,根據其功能不同可以分為如下幾類:

鍵管理類 RegCloseKey() RegCreateKey() RegCreateKeyEx() RegDeleteKey() 
  RegDeleteKeyEx() RegOpenKey() RegOpenKeyEx()   
值管理類 RegDeleteValue() RegQueryValue() RegQueryValueEx() RegSetValue() 
  RegSetValueEx()       
查詢計數類 RegQueryInfoKey() RegEnumKey() RegEnumKeyEx() RegEnumValue() 
備份/恢複類 RegLoadKey() RegReplaceKey() RegRestoreKey() RegSaveKey() 
實用類 RegConnectRegistry() RegNotifyChangeKeyValue()  RegUnloadKey() 
安全類
(僅適用於NT) RegGetKeySecurity() RegSetKeySecurity() 

API註冊表函數細節->>>鍵管理類:

1、RegCloseKey():關閉註冊表鍵釋放控制代碼。
    RegCloseKey(ByVal hKey As Long)
    參數:hKey--根鍵(或子鍵)控制代碼
    傳回值:=0 成功     ≠0 失敗

2、RegCreateKey():開啟指定的註冊表鍵,如果該鍵不存在則試圖建立。
    RegCreateKey(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long)
    參數:hKey--根鍵控制代碼    lpSubKey--子鍵的名稱或路徑     
         phkResult--若執行成功則該參數返回子鍵的控制代碼
    傳回值:=0 成功     ≠0 失敗

3、RegCreateKeyEx():同RegCreateKey()。

    RegCreateKeyEx(ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long)

4、RegDeleteKey():刪除註冊表鍵,但不能刪除根鍵。      
    RegDeleteKey(ByVal hKey As Long, ByVal lpSubKey As String)
    參數:hKey--鍵控制代碼     lpSubKey--子鍵名稱或路徑,如為""則刪除hKey鍵
    傳回值:=0 成功     ≠0 失敗

5、RegDeleteKeyEx():同RegDeleteKeyEx()

6、RegOpenKey():獲得註冊表根鍵下子鍵的控制代碼。
    RegOpenKey(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long)
    參數:hKey--根鍵控制代碼    lpSubKey--子鍵的名稱或路徑
         phkResult--若執行成功則該參數返回子鍵的控制代碼
    傳回值:=0 成功     ≠0 失敗

7、RegOpenKeyEx():同RegOpenKey()

        RegOpenKeyEx(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long)

註冊表根鍵控制代碼

   MicroSoft Windows 系列作業系統的使用,進一步標準化了每個應用程式管理其自己的資料及配置資訊,進一步標準化了與系統裝置通訊及支援多使用者環境的方法。
    我們知道,在 Windows 95 以前,應用程式都將自己的設定資訊儲存在 *.INI 檔案中。現在 Windows 系統下的應用程式幾乎無一例外的都將自己的設定資訊、使用者資訊、註冊資訊、程式資料等在安裝初始化時寫入註冊表,並且在應用程式運行時修改。
    當我們編製了一個應用程式時,如何將應用程式的設定資訊及相關資料在安裝程式時寫入註冊表中呢?這就需要我們理解如何通過程式來操作註冊表並且寫入或刪除相關的資訊。
    以下將為你詳細介紹如何通過程式來操作註冊表。
    首先讓我們來看看註冊表編程的一些基本知識:

    註冊表的每個根鍵控制代碼都是固定不變的,如下所示:

Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006

註冊表資料類型
    程式中要用到的註冊表資料類型如下表所示:

REG_BINARY 位元據 
REG_DWORD 32位雙字 
REG_DWORD_LITTLE_ENDIAN 大計數法格式32位元字,一個字的有效位元組是高端字 
REG_DWORD_BIG_ENDIAN 大計數法格式32位元字,一個字的有效位元組是低端字 
REG_EXPAND_SZ 空終止字串,包括對"&TEMP&"之類環境變數的引用 
REG_LINK 單一代碼符號鏈 
REG_MULTI_SZ 定義包括空終止字串的數組,數組被兩個實際的Null 字元串結束 
REG_NONE 未定義實值型別 
REG_RESOUSE_LIST 裝置驅動程式列表 
REG_SZ Null 字元串,是儲存字串的最通用格式 

Public Const REG_NONE = 0             '
Public Const REG_SZ = 1               '字串
Public Const REG_EXPAND_SZ = 2        '可展開式字串
Public Const REG_BINARY = 3           'Binary資料
Public Const REG_DWORD = 4            '長整數
Public Const REG_DWORD_BIG_ENDIAN = 5 'BIG_ENDIAN長整數
Public Const REG_MULTI_SZ = 7         '多重字串

使用 Visual Basic 來操作註冊表
     MicroSoft Visual Basic 中對於註冊表的操作函數共有4個,它們是 SaveSetting, GetSetting, GetAllSettings, DeleteSettings等。

SaveSetting   在 Windows 註冊表中儲存或建立應用程式項目 
文法   SaveSetting appname, section, key, setting 
參數   appname:字串運算式,應用程式或工程的名稱。 
            section:字串運算式,包含地區名稱,在該地區儲存登錄機碼設定。 
            key:字串運算式,包含將要儲存的登錄機碼設定的名稱。 
            setting:字串運算式,包含 key 的設定值。  
函數樣本   使用 SaveSetting 語句來建立"MyApp"應用程式的項目,然後使用DeleteSetting 語句將之刪除。
    1、在註冊區中添加一些設定值。
    SaveSetting appname := "MyApp", section := "Startup", key := "Top", setting := 75 
    SaveSetting "MyApp","Startup", "Left", 50 
    2、刪除區段及所有的設定值。
    DeleteSetting "MyApp", "Startup"  
GetSetting   從 Windows 註冊表中的應用程式項目返回登錄機碼設定值 
文法   GetSetting appname, section, key[, default] 
參數   appname:字串運算式,包含應用程式或工程的名稱。
            section:字串運算式,包含地區名稱,要求該地區有登錄機碼設定。 
            key:字串運算式,返回登錄機碼設定的名稱。 
            default:可選。運算式,如果登錄機碼設定中沒有設定值,則返回預設值。如果省略,則 default 取值為長度為零的字串 ("")。 
說明   如果 GetSetting 無參數,則 GetSetting 返回 default 的值 
函數樣本   使用 SaveSetting 語句建立 appname 應用程式的項目,然後使用 GetSetting 函數得到其中一項設定並顯示出來。因為有傳入參數 default,GetSetting 函數一定會有傳回值。請注意,section 名稱不能用 GetSetting 函數取得。最後,使用 DeleteSetting 語句將該應用程式項刪除。
    1、定義儲存 GetSetting 函數返回之二維數組資料的變數
    Dim MySettings As Variant
    2、在註冊表中添加項目
    SaveSetting "MyApp","Startup", "Top", 75
    SaveSetting "MyApp","Startup", "Left", 50
    Debug.Print GetSetting(appname := "MyApp", section := "Startup", key := "Left", default := "25")
    3、刪除註冊表中項目
DeleteSetting "MyApp", "Startup" 
GetAllSettings   從 Windows 註冊表中返回應用程式項目的所有登錄機碼設定及其相應值 
文法   GetAllSettings(appname, section) 
參數   appname 必要。字串運算式,應用程式或工程的名稱。
            section 必要。字串運算式,包含地區名稱,並要求該地區有登錄機碼設定。GetAllSettings 返回 Variant,其內容為字串的二維數組,該二維數組包含指定地區中的所有登錄機碼設定及其對應值。 
說明   如果 appname 或 section 不存在,則 GetAllSettings 返回未初始化的 Varian 
函數樣本   本樣本首先使用 SaveSetting 語句來建立 Windows註冊區裡 appname 應用程式的項目,然後再使用 GetAllSettings 函數來取得設定值並顯示出來。請注意,應用程式名稱和 section 名稱不能用 GetAllSettings 函數取得。最後,使用 DeleteSetting 語句將該應用程式項刪除。
    ' 用來儲存 GetAllSettings 函數所返回之二維數組資料的變數
    ' 整型數是用來計數用。
    Dim MySettings As Variant, intSettings As Integer
    ' 在註冊區中添加設定值。
    SaveSetting appname := "MyApp", section := "Startup", key := "Top", setting := 75
    SaveSetting "MyApp","Startup", "Left", 50
    ' 取得輸入項的設定值。
    MySettings = GetAllSettings(appname := "MyApp", section := "Startup")
    For intSettings = LBound(MySettings, 1) To UBound(MySettings, 1)
        Debug.Print MySettings(intSettings, 0), MySettings(intSettings, 1)
    Next intSettings
    DeleteSetting "MyApp", "Startup" 
DeleteSetting   從應用程式項目裡刪除地區或登錄機碼設定 
文法   DeleteSetting appname, section[, key] 
參數   appname 必需的。字串運算式,應用程式或工程的名稱。 
            section 必要。字串運算式,包含要刪除登錄機碼設定的地區名稱。如果只有 appname 和 section,則將指定的地區連同所有有關的登錄機碼設定都刪除。 
            key 可選。字串運算式,包含要刪除的登錄機碼設定。  
說明   如果提供了所有參數,則刪除指定的登錄機碼設定。如果試圖使用不存在的地區或登錄機碼設定上的 DeleteSetting 語句,則發生一個執行階段錯誤。 
函數樣本   下列樣本先使用 SaveSetting 語句,來建立Windows註冊區(或 16位 Windows 平台的 ini 檔案)裡 MyApp應用程式的項目,然後使用 DeleteSetting 語句將之刪除。因為沒有指定 key參數,整個區段都會被刪除掉,包括區段名稱及其所有的機碼(key)。
    ' 在註冊區中添加一些設定值。
    SaveSetting appname := "MyApp", section := "Startup", key := "Top", setting := 75 
    SaveSetting "MyApp","Startup", "Left", 50 
    ' 刪除區段及所有的設定值。
    DeleteSetting "MyApp", "Startup"  
      

    在 Visual Basic 中除了使用這四個內部語句或函數外,還可以調用 Windows API 函數來操作註冊表。

登入資料庫Registry的Value的存取--讀取某個Key指定名稱的值

我們在這篇文章中將講述利用RegQueryValueEx函數來讀取某個Key的指定名稱的值(value)
RegQueryValueEx的Vb函式宣告和參數解釋:
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long 
hkey:Key Handle
lpValueName:Value Name
lpReserved:保留參數,調用時設定為0即可
lpType:返回讀取的資料類型
lpData:返回讀取的資料
lpcbData:傳入lpData資料的長度,若成功讀取資料,則返回所讀取的資料的長度。
傳回值: =0,表示成功;≠0,表示失敗。
說明:
1、 這一函數除了可讀取指定名稱的值之外,也可以讀取default value。如果要讀取default value,只需要將
參數lpValueName設定為""[Null 字元串]即可。
2、lpType 的可能取值,我們在第二篇文章中曾經提到過它的。
Enum ValueType 
REG_NONE = 0 
REG_SZ = 1 -->字串
REG_EXPAND_SZ = 2 -->可展開式字串
REG_BINARY = 3 -->Binary資料
REG_DWORD = 4 -->長整數
REG_DWORD_BIG_ENDIAN = 5 -->BIG_ENDIAN長整數
REG_MULTI_SZ = 7 -->多重字串
End Enum 

先利用RegQueryValueEx函數獲得某個value的資料類型和資料的長度,只需要將參數lpData設定為vbNullString[表示暫時不讀取資料],然後由參數lpType獲得資料類型,lpcbData獲得資料長度。調用例子如下:
Dim hKey As Long, ret As Long, lenData As Long, typeData As Long 
Dim Name As String
'讀取HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run的internat.exe的value.
Name="internat.exe"
ret=RegOpenKey(HKEY_LOCAL_MACHINE,"Software\Microsoft\Windows\CurrentVersion\Run", hKey) 
if ret=0 then
ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData)'注意ByVal千萬別忘了
end if
在得到某個value的資料類型和資料長度後,我們將根據不同的資料類型進行不同的處理。下面分別敘述之。

a-->資料類型為REG_SZ
這種方式最簡單,只需要在上面的語句結束之後使用以下語句就可以得到正確的字串。eg:
ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData)
S=String(lenData,Chr(0))
RegQueryValueEx hKey, Name, 0, typeData, ByVal S, lenData '注意ByVal千萬別忘了
S=Left(S,InStr(S,Chr(0))-1) 

b-->資料類型為REG_EXPAND_SZ
所謂REG_EXPAND_SZ類型的字串是指字串中可能含有%WinDir%之類的字串[%WinDir%表示Windows所在目錄我們可以在Ms-Dos方式下使用set命令來看看這類字串,我們也許還會看到諸如TMP,PATH,WINBOOTDIR這些和WinDir類似的具有特殊意義的字串。],遇到這類字串,我們還必須調用另一個API函數ExpandEnvironmentStrings來將它展開[比如%WinDir%就展開為C:\WINDOWS]。以下是ExpandEnvironmentStrings的描述和用法:
Declare Function ExpandEnvironmentStrings Lib "kernel32" Alias "ExpandEnvironmentStringsA" (ByVal lpSrc As String, ByVal lpDst As String, ByVal nSize As Long) As Long 
參數 類型及說明 
lpSrc String,欲擴充的字串 
lpDst String,擴充過後的字串 
nSize Long,lpDst的長度。
注意預先對lpDst進行初始化,使其與這個長度相符
函數調用例:
Dim S2 As String
'先利用RegQueryValueEx函數獲得某個value的資料類型和資料的長度
ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData) 
S = String(lenData, Chr(0)) 
RegQueryValueEx hKey, Name, 0, typeData, ByVal S, lenData 
S = Left(S, InStr(S, Chr(0)) - 1) 'S為讀取出來的字串
S2 = String(Len(S) + 256, Chr(0))'S2為擴充之後的字串 
ExpandEnvironmentStrings S, S2, Len(S2) 
S2= Left(S2, InStr(S2, Chr(0)) - 1)

c-->資料類型為REG_MULTI_SZ
REG_MULTI_SZ為多重字串,其結構如下: 

字串1  chr(0) 字串2  chr(0) ... 字串N  chr(0) chr(0) 

下面的自訂子程式的功能是取得多重字串中每一個字串。
Sub MultiStringToStringArray(S As String, S2() As String)
'S為我們讀取出來的多重字串
'S2為轉換後的字串數組
Dim count As Integer, pos As Integer, pos2 As Integer, idx As Integer 
pos = InStr(S, Chr(0))

While pos > 0 count = count + 1 
pos = InStr(pos + 1, S, Chr(0)) 
Wend 
'取得多重字串中的字串個數
count = count - 1 

ReDim S2(0 To count - 1) 
pos = 1 
For idx = 0 To count - 1 
pos2 = InStr(pos, S, Chr(0)) 
S2(idx) = Mid(S, pos, pos2 - pos) 
pos = pos2 + 1 
Next 
End Sub
在調用MultiStringToStringArray之前,要先定義一個不含任何元素的字串數組。子程式調用例子如下:
S= "WGL"+chr(0)+"LOVE"+chr(0)+"MEISHAN"+chr(0)+chr(0)
Dim S2() As String
MultiStringToStringArray S,S2
那麼執行之後,S2(0)="WGL",S2(1)="LOVE",S2(2)="MEISHAN"

d-->資料類型為REG_DWORD,REG_DWORD_BIG_ENDIAN
'先利用RegQueryValueEx函數獲得某個value的資料類型和資料的長度
Dim L As Long
ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData) 
RegQueryValueEx hKey, Name, 0, typeData, L, lenData

e-->資料類型為REG_BINARY
'先利用RegQueryValueEx函數獲得某個value的資料類型和資料的長度
ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData) 
ReDim bArr(0 To lenData - 1) As Byte 
RegQueryValueEx hKey, Name, 0, typeData, bArr(0), lenData

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.