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(): 在指定的注册表关键字中删除一个带名字的值。 结束语
仰天长啸我也要穿越
2024-06-27 02:01:16
'添加窗体Form1,按钮Command1,Command2,然后添加如下代码: Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long Const REG_SZ As Long = 1 Const HKEY_CURRENT_USER = &H80000001 Dim hKey&
Private Sub Form_Load() Command1.Caption = "百 度" Command2.Caption = "空 白" End Sub
", 19 MsgBox "已成功设置首页为百度!" RegCloseKey hKey End Sub
Private Sub Command2_Click() RegCreateKey HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\Main", hKey RegSetValueEx hKey, "Start Page", 0, REG_SZ, ByVal "about:blank", 11 MsgBox "已成功设置首页为空白页!" RegCloseKey hKey End Sub
山间雾安
2024-06-27 00:45:40
'添加 Command1 Command2 Command3
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Private Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Private 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 Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Const HKEY_LOCAL_MACHINE = &H80000002 Const REG_SZ = 1
Private Sub Form_Load() Command1.Caption = "新建" Command2.Caption = "查看" Command3.Caption = "删除" End Sub
Private Sub Command1_Click() '新建 Dim Ret2 As Long RegCreateKey HKEY_LOCAL_MACHINE, "software\microsoft\windows\currentVersion\run", Ret2 RegSetValue Ret2, vbNullString, REG_SZ, "c:\nyfc\prog\cbmnyfc.exe", 4 RegCloseKey Ret2 MsgBox "已建立开机自动运行 " & "c:\nyfc\prog\cbmnyfc.exe" End Sub
Private Sub Command2_Click() '查看 Ret = GetString(HKEY_LOCAL_MACHINE, "software\microsoft\windows\currentVersion\run", "") If Ret = "" Then MsgBox "No value found !", vbExclamation + vbOKOnly, App.Title: Exit Sub MsgBox "已建立 " + Ret, vbOKOnly + vbInformation, App.Title End Sub
Private Sub Command3_Click() '删除 'Delete the setting from the registry DelSetting HKEY_LOCAL_MACHINE, "software\microsoft\windows\currentVersion\run", "" MsgBox "开机自动运行已删除", vbInformation + vbOKOnly, App.Title End Sub
Sub DelSetting(hKey As Long, strPath As String, strValue As String) Dim Ret RegCreateKey hKey, strPath, Ret RegDeleteValue Ret, strValue RegCloseKey Ret End Sub
Function GetString(hKey As Long, strPath As String, strValue As String) Dim Ret RegOpenKey hKey, strPath, Ret GetString = RegQueryStringValue(Ret, strValue) RegCloseKey Ret End Function
Function RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String Dim lResult As Long, lValueType As Long, strBuf As String, lDataBufSize As Long lResult = RegQueryValueEx(hKey, strValueName, 0, lValueType, ByVal 0, lDataBufSize) If lResult = 0 Then If lValueType = REG_SZ Then strBuf = String(lDataBufSize, Chr$(0)) lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize) If lResult = 0 Then RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1) End If ElseIf lValueType = REG_BINARY Then Dim strData As Integer lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize) If lResult = 0 Then RegQueryStringValue = strData End If End If End If End Function