返回狼盟编程首页
编程搜索 [狼盟旧档]
论坛统计


请输入搜索关键字:
├─◆ 狼盟首页 > 查看贴子 > 详细信息

楼主

用VB可以编辑注册表吗?


比如一个程序安装时会改写注册表里的RUN值让它自动运行,用VB能做到吗?怎么做?





lbskln [ 1 楼 ]
2004-11-02 17:15:00
我也没做过,但VB是可以做到的,我在一本相关注册表的书里看到的。用VB几乎可以对注册表做任何编辑。你可以查找一下有关注册表的书,看能不能找到答案。 

litchi8151 [ 2 楼 ]
2004-11-02 23:18:00
你查找一下API函数啊  肯定能实现啊~!~!!

但是稍微复杂一些啊   需要好多API函数才能实现的 

一江秋水 [ 3 楼 ]
2004-11-03 09:12:00
你的想法完全可以实现,而且不需要用API函数,用FSO对象即可,使用非常简单:

1.写入注册表:

Dim Ws
ST = "HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun"
Set Ws = CreateObject("wscript.shell")
Ws.regwrite ST & "XXX1", "YYYY1"
Ws.regwrite ST & "XXX2", "YYYY2"
...
Set Ws = Nothing


2.读入注册表:

Dim Ws
ST = "HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun"
Set Ws = CreateObject("wscript.shell")
ZZ1 = Ws.regread(ST & "XXX1")
ZZ2 = Ws.regread(ST & "XXX2")
...
Set Ws = Nothing

说明:
一、XXX是项值名称(如果是创建新值,可以自己命名),YYY是字符串型的数据(例如是某个全路径文件名),如果其中的某个子键或项值是注册表上没有的,将自动创建。ZZ是字符串型变量

二、如果是别的数据类型,例如双字节型,则要在regwrite或regread后加REG_DWORD参数,象下面的形式:

Ws.regwrite ST & "XXX3", "YYYY3", REG_DWORD

 

sunmoon1210 [ 4 楼 ]
2004-11-03 12:32:00
可以,这个东西我做过的.用API 实现的,写入注册表时要注意写入数据的长度,即中英文混合字符串的长度计算方法.
在VB中,通过四个注册表函数
。Visual Basic 提供了一个标准的注册位置(主键)以存储创建于 Visual Basic 的应用程序的程序信息:

   HKEY_CURRENT_USERSoftwareVB and VBA Program Settings

   下面的所有函数所读写的注册表路径都是以这个路径为根的相对位置。

   SaveSetting

   这个函数用来向注册表数据库写入一些数据

   SaveSetting appname, section, key, setting

   appname

   在向注册表写入数据之前,你必须计划好一个用在整个应用程序中的appname 。可以把注册表的内容比作一台计算机,那么appname就是驱动器。它必须是一个字符串,也可以用数字,不过要用CStr 函数把它转换成字符串格式。事实上它代表的是应用程序或工程的名称。一般来说,appname在整个应用程序中应该保持不便。

   Section

   section可以说是这个模型中的目录,就向一台计算机上的目录一样。它用来把设置分类,可以包含Key或者子section。如果给它传递vbNullChar 这个值的话,就表示要操作的键是在根目录下的,也就是在appname下面的。

   Key

   相当于一个文件名。

   Setting

   它代表文件中的信息,可以是一个数字或者字符串。

   执行完后,在注册表的HKEY_CURRENT_USERSoftwareVB and VBA Program Settingsappnamesection"主键下面的名为“key”的键将被赋值为“setting”,如果相应的主键或者键名不存在,将会被创建。

   GetSetting

   这个函数用来从注册表中提取数据。

   GetSetting(appname, section, key[, default])

   Appname,section和key的含义和上面的一样。

   Default

   如果Visual Basic没有找到指定的键,函数将返回参数default中得值。这个参数是可选的,但是对错误情况的处理很方便。如果没有选用这个参数,而指定的键的名称不存在,函数将返回一个长度为0的字符串。

   下面看看例子:
SaveSetting "Logon Master", "UsersUser0", _
"Name", "John"
注释:这将把数据"John"储存到注册表的 "Logon MasterUsersUser0Name"
注释:不过这是相对路径,相对于一个根

Debug.Print GetSetting("Logon Master", _
"UsersUser0", "Name", "Anonymous"
注释:这将显示"John"

Debug.Print GetSetting("Logon Master", _
"UsersUser1", "Name", "Anonymous"
注释:这次显示的将是"Anonymous",因为在
注释:"Logon MasterUsersUser1Name"没有预先储存值。
GetAllSettings



   这个函数用来提取某个目录(主键)下面的所有文件(子键)。

   GetAllSettings(appname, section)

   参数的含义和其他的函数都是一样的。但这个函数和其他几个比起来更为复杂。他返回的的是一个2维字符串数组,包含了所有的子键名称和乡音的子键值。看看下面这个例子,你很容易的就能搞清楚:
注释: 定义一个Variant类型的变量来保存GetAllSettings返回的二维数组

注释: Interger类型值用来计数
Dim MySettings As Variant, intSettings As Integer

注释:先在注册表中填入一些值
SaveSetting "Logon Master", "UsersUser0", _
"Name", "John"
SaveSetting "Logon Master", "UsersUser0", _
"Priviledges", "Supervisor"

注释:提取预先设定的数据
MySettings = GetAllSettings("Logon Master", _
"UsersUser0")

注释:显示出来
For intSettings = Lbound(MySettings, 1) _
To Ubound(MySettings, 1)

注释:MySettings(x,0)中包含的是键名,
注释:而MySettings(x,1) 中包含的是键值
Debug.Print MySettings(intSettings, 0), _
MySettings(intSettings, 1)
Next intSettings



   注意:GetAllSettings并不返回目录名,只是返回键名和相应的键值。

   DeleteSetting

   除了保存和提取数据,我们还要能够删除注册表中的注册项。这就要用到DeleteSetting函数了。

   DeleteSetting appname[, section[, key]]

   这个函数用来删除主键或者键。如果要删除的是键,要给出它所在的键名。如果要删除的是主键,这它下面所有的键和子主键都会被删除。如果你要删除应用程序所有的注册表信息,就只用指定appname就可以了。

   例如:
DeleteSetting "Logon Master", "UsersUser0", "Name"
注释:这将删除Name键。
DeleteSetting "Logon Master", "Users"
注释:这将删除"Logon MasterUsers"主键和其下的所有内容。
DeleteSetting "Logon Master"
注释:这将删除应用程序"Logon Master"下面的所有内容。