[转]Windows API 注册表函数

Windows API 注册表函数

所谓 API(Application Programing Interface) 是 Windows 提供的一个32位环境下的应用程序编程接口,其中包括了众多的函数,提供了相当丰富的功能。我们在编制应用程序时,可以调用其中的注册表函数来对注册表进行操作以实现我们需要的功能。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 定义包括空终止字符串的数组,数组被两个实际的空字符串结束 
REG_NONE 未定义值类型 
REG_RESOUSE_LIST 设备驱动程序列表 
REG_SZ 空字符串,是保存字符串的最通用格式 


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设置为""[空字符串]即可。
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
posted @ 2009-10-21 16:29  吴碧宇  阅读(1730)  评论(0编辑  收藏  举报