VB中使用API操作注册表
来源:互联网 发布:centos7 3306端口打开 编辑:程序博客网 时间:2024/05/03 12:24
使用 Windows API 注册表函数
所谓 API(Application Programing Interface) 是 Windows 提供的一个32位环境下的应用程序编程接口,其中包括了众多的函数,提供了相当丰富的功能。我们在编制应用程序时,可以调用其中的注册表函数来对注册表进行操作以实现我们需要的功能。Windows API 中可用于注册表的函数一共有二十多个,根据其功能不同可以分为如下几类:
(仅适用于NT)
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
注册表数据类型
程序中要用到的注册表数据类型如下表所示:
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等。
section:字符串表达式,包含区域名称,在该区域保存注册表项设置。
key:字符串表达式,包含将要保存的注册表项设置的名称。
setting:字符串表达式,包含 key 的设置值。
1、在注册区中添加一些设置值。
SaveSetting appname := "MyApp", section := "Startup", key := "Top", setting := 75
SaveSetting "MyApp","Startup", "Left", 50
2、删除区段及所有的设置值。
DeleteSetting "MyApp", "Startup" GetSetting 从 Windows 注册表中的应用程序项目返回注册表项设置值
section:字符串表达式,包含区域名称,要求该区域有注册表项设置。
key:字符串表达式,返回注册表项设置的名称。
default:可选。表达式,如果注册表项设置中没有设置值,则返回缺省值。如果省略,则 default 取值为长度为零的字符串 ("")。
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 注册表中返回应用程序项目的所有注册表项设置及其相应值
section 必要。字符串表达式,包含区域名称,并要求该区域有注册表项设置。GetAllSettings 返回 Variant,其内容为字符串的二维数组,该二维数组包含指定区域中的所有注册表项设置及其对应值。
' 用来保存 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 从应用程序项目里删除区域或注册表项设置
section 必要。字符串表达式,包含要删除注册表项设置的区域名称。如果只有 appname 和 section,则将指定的区域连同所有有关的注册表项设置都删除。
key 可选。字符串表达式,包含要删除的注册表项设置。
' 在注册区中添加一些设置值。
SaveSetting appname := "MyApp", section := "Startup", key := "Top", setting := 75
SaveSetting "MyApp","Startup", "Left", 50
' 删除区段及所有的设置值。
DeleteSetting "MyApp", "Startup"
在 Visual Basic 中除了使用这四个内部语句或函数外,还可以调用 Windows API 函数来操作注册表。
注:以上内容来源于http://zxwzk.diy.myrice.com/regBC/regBC_API.htm网站
登录数据库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
注:以上内容来源于http://community.csdn.net/Expert/topic/4348/4348553.xml?temp=.7931787
作者BLOG地址http://blog.csdn.net/goodname008/archive/2004/07/12/39451.aspx
- VB中使用API操作注册表
- VC VB 操作注册表API
- VB.net 注册表操作API
- 在VB中使用注册表
- 使用Windows API操作注册表
- 使用Windows API操作注册表
- 注册表操作常用API使用
- 在VB中怎样操作注册表.
- VB.NET中注册表常用操作
- VB.NET 操作注册表
- vb 对注册表操作
- 用VB操作注册表
- vb.net操作注册表
- VB注册表操作
- VB注册表操作
- VB注册表操作函数
- 用VB操作注册表
- 用VB操作注册表
- 正则文法和上下文无关文法
- OS还是像耶稣祈祷吧~~
- ★用5 1对一款微型步进电机的驱动★
- 百年老店“新掌门”的创新攻略
- 同一数据库中复制数据表。未测试完成
- VB中使用API操作注册表
- FreeBSD 的 VPN 札記
- 编译器的整体构架
- 好Cool的相册!不知道大家有没有看到左侧的相片夹呢
- 面试技巧汇总:16个经典面试问题回答思路
- 面试官最爱提的15个问题
- 面试:“十大必考题”揭幕
- 内部线程
- Weblogic startAP-cluster-01.sh