百度空间 | 百度首页 
 
查看文章
 
VB修改注册表
2007-06-25 09:24
在Windows出问题时,如果能够了解Windows系统的注册表,将更容易解决问题; 许多商品化的软件或专业化的软件在您的机器上首次安装的时候都会通过改写注册表来完成软件的正确安装运行,要成为编程高*当然需要掌握读写注册表这一技术。用好注册表将会为您的应用程序增色不少,下面笔者将具体介绍VB中与注册表有关的编程方法。 黑客X档案官方站 ['l)|:s7L J6o
注册表的组织结构
R s#| f I K R0存取注册表以前, 必须先了解注册表的组织结构, 而了解注册表的组织结构最简单的方法便是启动 Windows 提供的“注册表编辑器”, 启动的方法是单击“开始”菜单的“运行”命令,输入 RegEdit 之后确定,可看到“注册表编辑器”窗口(如图1所示)。 黑客X档案官方站 L.m ~ {$` _+W A
黑客X档案官方站 K:Z j*P d.q
图1 黑客X档案官方站(S {1a3{:L e l ~
● 键(Key) 与子键(Subkey)
r%^ D B.P Q0注册表编辑器的结构与资源管理器很类似, 左边窗口的每一个文件夹图标表示一个键,就像文件夹下还有子文件夹一样, 注册表的键下也有子键。为了完整地表示某一个子键,习惯上是采用文件夹的路径表示法。 举例来说, HKEY_LOCAL_MACHINE 之下的“Software”子键表示成 HKEY_LOCAL_ 黑客X档案官方站3b z y!O9a2x2n;J
MACHINE\Software,而“Software”之下的 “Microsoft”子键则表示成 HKEY_LOCAL_
R+S R*d |/S5@7`I0MACHINE\Software\Microsoft(如图2所示)。 黑客X档案官方站 v E8?k L.B
黑客X档案官方站 | p f%i Q+L B6\
图2
!Y2` q Q(A y1g0● 键值()、键名( Name)、数据( Data) 与默认键值(Default ) 黑客X档案官方站 V0e A7J s1Z
当我们在注册表编辑器左边窗口选取某一个键(或子键) 之后, 出现在右边窗口中的是这个键的键值(),键值可分成键名(Name)及数据(Data)两部分。对每一个键而言, 至少都含有一个默认键值(Default ) , 以 “HKEY_CLASSES_ROOT\
+L6V a3A$f0.bmp”子键为例, 其默认键值为 “ACDC_BMP”。 除了默认键值之外, 这个子键还含有名称 (Name)“Content Type”和数据 (Data)“image/bmp”(如图3所示)。
.O.Q&`8J!@0黑客X档案官方站%I F f A l ] \,`
图3
t ]&Jl R3j0VB 自身提供的 黑客X档案官方站B W5x X,?*J:M(}
关于注册表的函数 黑客X档案官方站,? X y3l7f
了解注册表的组织结构之后, 接下来讨论如何存取它。就像我们存取文件时必须指明文件所在文件夹(目录)一样, 存取注册表时, 则必须先指明键。键在注册表编辑器中所看到的是一长串的字符串,例如 “HKEY_LOCAL_MACHINE\SOFTWARE\
Q N { H8i0S0Microsoft\Windows\CurrentVersion”。在 Visual Basic 6.0 内部,已经提供了一个标准的注册位置,以存储创建于VB的应用程序的程序信息:HKEY_CURRENT_USER\Software\VB and VBA Program settings\(为了叙述简单,以下将这一位置简称“标准位置”)。VB 提供了两个语句和两个函数来处理存储在应用程序注册位置的程序设置值:
\ V%D0m B*D&J!p7b U0函数GetSetting(appname, section, key[, default]): 检索注册表设置值。 黑客X档案官方站,w o,z v8W \ M
语句SaveSetting appname,section,key,: 保存或创建注册表设置值。
g+w B~ N o0L4` F8R D0函数GetAllSettings(appname, section): 返回一个包含多项注册表设置值的数组。 黑客X档案官方站8O ~ [-N-R+q6{,c5c
语句DeleteSetting appname, section[, key]: 删除注册表设置值。 黑客X档案官方站2{2T+A$R3YD D K
以上所用参数的说明:
i"X E+XW.} l8B0[ ]: 表示可选项。 黑客X档案官方站.\ JU ?8X
appname:字符串表达式,包含应用程序或工程的名称,是标准位置下的一个子键。 黑客X档案官方站3a*A M.D p h%U B
section:字符串表达式,包含区域名称,是 appname 下的一个子键。 黑客X档案官方站 O L4B F*| m q l
key:字符串表达式,标准位置\appname\ 黑客X档案官方站6B"g O8S _ H T
section子键的键名( Name)。 黑客X档案官方站c a ^!c o9w3] T E
:字符串表达式,标准位置\appname\
3|7ay3j L G ~0section子键对应于键名( Name)的键值()。 黑客X档案官方站0X,l:?6c:\;w `
default:表达式,如果注册表项设置中没有设置值,则返回默认值。如果省略,则 default 取值为长度为零的字符串 (“”)。
Y,@7f P n C A h0GetAllSettings返回Variant,是内容为字符串的二维数组,该二维数组包含指定区域中的所有注册表项设置值及其对应值。 如果 appname 或 section 不存在,则GetAllSettings 返回未初始化的 Variant。 黑客X档案官方站 t W5V j9y y;r7O
实例之一
2Y x+A r3H h v%f a0在 VB6.0中新建一工程并命名为 vbreg.vbp,删去其中所有窗体,在工程资源管理器中点击右键,选择添加模块,并命名为 vbreg.bas。双击reg.bas,输入如下代码:
K2D9r D e0Dim avntSettings As Variant
+_7r b'X r E e E(c0Dim intX As Integer
_ x9I r9P r%d#a D H0avntSettings = GetAllSettings(“VB 6 API 声明加载器”, “File List”)
N;m"] [ P B"@0For intX = 0 To UBound(avntSettings, 1) 黑客X档案官方站 G L1Z U b6Y z
Debug.Print avntSettings(intX, 0), avntSettings(intX, 1)
-\ @*Q z;S9b,l0Next intX
Y"z'g X l {*j r0上面这段程序首先用 GetAllSettings 函数检索“VB 6 API 声明加载器”子键File List部分的两个注册表项的值,并将其结果显示在立即窗口中。开始运行前请按+确保立即窗口显示在屏幕上。同时请打开注册表,以便将标准位置\VB 6 API 声明加载器\File List的键值与结果进行对照。 黑客X档案官方站:t p v8^(C { ^%~
下面这段程序用 SaveSetting 语句在标准位置下建立名为“我的工程\我的子键”的子键,然后使用 GetSetting 函数来得到其中一项设置值并显示出来。因为有传入参数default,GetSetting 函数一定会有返回值。
g w B v c7g m0请注意,区域名称不能用GetSetting 函数取得。最后,使用 DeleteSetting 语句将该子键删除。 黑客X档案官方站-X,`'r z3T&w&^ m c8?/| Z
SaveSetting “我的工程”, “我的子键”, “Top”, 75 黑客X档案官方站 F8J)r t M6u&X t F
SaveSetting “我的工程”, “我的子键”, “Left”, 50
7^ @ G!?7c {'c V0Debug.Print “Top”, GetSetting(“我的工程”, “我的子键”, “Top”, “25”) 黑客X档案官方站 ?*d(l m q
Debug.Print “Left”, GetSetting(“我的工程”, “我的子键”, “Left”, “0”)
T W+\ d ]6X0’为了便于观察,调试可以在此处设置断点,同时切换到注册表,按下键刷新,即可看到自己建立的子键及其键值
N%q V9e:T ?%y:B,G K l+q0DeleteSetting “我的工程”, “我的子键” 黑客X档案官方站 G g%c y:f u
’运行完毕后再次切换到注册表并按下键刷新,观察己建立的子键及其键值是否被删除
_ e D&[ ^'e0说明: 运行本程序前,需先确保启动VB时已自动加载“API文本浏览器”,且在API文本浏览器中的“文件”菜单下有打开过的“文本文件”列表。否则,请先打开“API文本浏览器”,并在“文件”菜单下选择“打开文本文件”,打开至少一个文本文件或数据库。
,j ] C0X9k g ~ o b0Windows API 的注册表编程
X;\ z O D ` Q(V*R(i0VB自身虽提供了四个关于注册表的函数,但是这些函数只能在“HKEY_CURRENT_USER\
8v1K1c2e g k*E U e0Software\VB and VBA ProgramSettings”下读取、删除、修改键值。这对于一般的应用程序利用它们可以达到目的,如果想对其他的非“标准位置”的主键或子键进行访问,该怎么办?此时,必须借助Windows API的帮助。 黑客X档案官方站.E6v N8M g
在Windows内部, 每一个键都会对应到一个 Key Handle(等于一个长整数值,程序中通常以 hKey表示),Windows之所以要以hKey来代表键是为了让注册表的存取更有效率,因为整数的操作效能要优于字符串, 所以我们首先来了解如何取得键的 Key Handle(即hKey)。位于最上层的键,有HKEY_CLASSES_ROOT、HKEY_CURRENT 黑客X档案官方站 R8R/w a ~ P(v
_USER、HKEY_LOCAL_MACHINE等,这些键的hKey值是固定不变的,其值见下表: 黑客X档案官方站 |,x V f"X(X ^6N g!r }
-----------------------
!{ x M A4W%T |0  Key      Key Handle
w ^ \+\ _ d9p ` P0----------------------- 黑客X档案官方站#o)S)| p6g B T
HKEY_CLASSES_ROOT    &H80000000
"^)BC e1} l'k#s0HKEY_CURRENT_CONFIG &H80000005  HKEY_CURRENT_USER &H80000001 黑客X档案官方站 a,w3J B8d L
HKEY_DYN_DATA &H80000006 黑客X档案官方站 p B p3{ U"M
HKEY_LOCAL_MACHINE &H80000002
f \)U U(M1p0HKEY_USERS         &H80000003
%P.q$| q#o0--------------------
:y i c5Z6r8\ ] H0但如果要取得这些键的Subkey Handle,则必须调用RegOpenKey API函数,RegOpenKey含有三个参数,用法如下: 黑客X档案官方站&Z F9lK,Q3n v0^/` \
Private Declare RegOpenKey Lib “advapi32.dll” Alias “RegOpenKeyA” (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
/P&c P-v _ t!D8l$G(L0这里hKey是Key Handle,lpSubkey是子键的字符串,PhkResult是函数返回值,若 RegOpenKey调用成功, 则此参数将传回子键的hKey。 黑客X档案官方站,@-R c9I9V
举例来说,我们想取得HKEY_LOCAL_MA 黑客X档案官方站 b p i$Z j4\ c u M
CHINE之下的“SOFTWARE\Microsoft”子键, 则使用的声明是: 黑客X档案官方站 m2v A0l'X U F k(x9n
Dim ret As Long,hKey As Long 黑客X档案官方站 W1c0W [ a(l M
ret=RegOpenKey(HKEY_LOCAL_ 黑客X档案官方站/g8r s k7t
MACHINE, “SOFTWARE\Microsoft”, hKey) 黑客X档案官方站 { X;j(I h g t!j
If ret = 0 Then 黑客X档案官方站 \;} R;N ~
’ret=0表示成功,hKey的值等于“SOFTWARE 黑客X档案官方站)O-H9]*_&~ m.k,~
\Microsoft”Subkey的Key Handle
{&M zO l l-g'd Z L0End If
7Q&j!~ | a3j f;{0请注意调用注册表API函数(例如以上的 RegOpenKey)之后,若成功将传回0,否则传回非0值,这一点与VB函数的惯例并不相同,请特别注意。 黑客X档案官方站;O ] c/w#I V o
RegOpenKey 的第一个参数 hKey 除了可以指定最上层的Key Handle值(例如 HKEY_CLASSES
O v M4? b ~4Q ~0_ROOT、HKEY_LOCAL_MACHINE等)之外, 也可以是一个 Subkey Handle。如上例, hKey 等于“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft” 的 Subkey Handle, 接着如果我们要取得 “HKEY_
n!Q y Y C(h k O0LOCAL_MACHINE\SOFTWARE\Microsoft\ 黑客X档案官方站 v w2? e W r }+w
Windows\CurrentVersion” 的 Subkey Handle, 则程序如下: 黑客X档案官方站(k e+r/v.G&v:Y B D8V
Dim ret As Long, hKey As Long, hKey2 As Long 黑客X档案官方站 J0j W%R _ } Z @ h9V
ret=RegOpenKey(hKey, “Windows\Current 黑客X档案官方站 @*b ~1n J3Z h:M H
Version”, hKey2) 黑客X档案官方站,m Z } Y&l x5U O e5k/T
’hKey2将等于“HKEY_LOCAL_MAC 黑客X档案官方站p C f z ID c0w
HINE\SOFTWARE\Microsoft”的“Windows\ 黑客X档案官方站 f5N&E0d C8s l$F&F
CurrentVersion”的Subkey Handle 黑客X档案官方站 Z T e"i&}-V
在以上程序中,请注意不要在“Windows\
)e!H v G#Z }2y0CurrentVersion”之前加上“\”,使之成为“\Windows 黑客X档案官方站 M C6L ? r [ _ H*C3g
\CurrentVersion”,这是错误的表示方法。
C5T Y5{1w ^ ?$@ | s ~0下面简单地介绍一下其他几个API(32位API):
|9` H ?,{ @"O R z Z y&R0● RegSetEx(): 在打开的注册表关键字的值域中存储数据;
%Y4@ T i|'F0● RegCloseKey(): 释放指定的关键字的句柄;
m v n2i ~ D \0● RegQueryEx(): 在注册表中查找与您指定的键值相关的值;
%g*V V-r(H F$b0● RegCreateKeyEx(): 建立并打开指定的关键字,若已存在则打开它; 黑客X档案官方站 r2o y [0` L1D4R"\
● RegEnumKeyEx(): 枚举指定的注册表关键字的子关键字(32位); 黑客X档案官方站\"] A#J p%|9Z0B H
● RegEnum(): 每次调用枚举指定的注册表关键字的值,复制一个带索引的值的名称和数据块; 黑客X档案官方站 c z y f B S"H4`4n
● RegDeletekey(): 删除一个关键字以及它的子关键字;
6F V4m ^ A _~ P o2a0● RegDelete(): 在指定的注册表关键字中删除一个带名字的值。
}*R I ? c D'P2y7l%H0结束语 黑客X档案官方站8X z3d(P n(c/M8v w L v M
通过调用这些API以及VB提供给我们的函数,我们可以轻松实现注册表的任意关键字的读取、查询、建立和删除,详细的用法可查阅“API浏览器”,在这里就不再进行讨论了。

类别:操作系统 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu