VB读写注册表的三种方法

读写注册表并不会比使用“Scripting.FileSystemObject”对象读写文件麻烦,而且方法很多。我这里列举三种:

一.用VB自带函数读写

VB中有三个函数,用于操作注册表,分别是“GetSetting”、“SaveSetting”、“DeleteSetting”。我想从字面上应该也可以猜出它们的大致功能

教科书似的使用说明我就不写了,我只用我自己的理解简单介绍一下:

1.这几个函数操作的注册表范围是有限的,只能在“[HKEY_CURRENT_USER\Software\VB and VBAProgram Settings]”下创建“子键”、“值项”和“键值”。

2.GetSetting
语法示例:GetSetting "MyApp","Startup","Times",5
参数说明:第一个参数是[HKEY_CURRENT_USER\Software\VB and VBA ProgramSettings]”下的子键,第二个参数是第一个参数的子键,第三个参数是第二个参数的“值项”,最后一个参数是创建值项时的认键值(可以省略)。
功能简介:如果子键、值项不存在时,就创建,并赋予认键值。如果已经存在,则取得并返回键值,认键值参数被忽略。

3.SaveSetting
语法示例:SaveSetting "MyApp",5
参数说明:和GetSetting差不多,但最后一个参数是被保存进去的键值。
功能简介:用来保存键值的,如果子项或值项不存在,键值不会被保存。

4.DeleteSetting
语法示例:DeleteSetting "MyApp","Startup"
参数说明:跟前两个函数的前两个参数一样。
功能简介:用来删除子键的。

5.程序实例
'下面的程序用于在注册表中创建一个键值,以限制应用程序被试用的次数
'如果你用的是VB用户窗体,就把以下代码复制到“UserForm_Initialize()”过程中
'如果你用的是ACCESS窗体,就把以下代码复制到“Form_open()”过程中

i = GetSetting("MyApp",5)
'如果Times值项,则创建,用于保存试用次数
'如果已存在,取得现有的值
If i = 0 Then '如果取出的值已经是0,则提示退出应用程序
MsgBox"已超出试用次数!"
Exitsub
End If
SaveSetting "MyApp",i - 1
'注册项值减1后保存,以递减使用次数,直到使用次数变0
'至于打开时需要注册的程序,可以参考“用Wscript.Shell对象读写”中的例子改写

6.优缺点
优点:VB自带,不需另外引用;语法简单,使用方便。
缺点:就是第1点提到的了。

二.用Wscript.Shell对象读写

Wscript.Shell有三个方法,分别是RegWrite、RegRead、RegDelete,简介如下:

1.RegWrite
语法示例:RegWrite "HKCU\Software\oldghost\test","abc","REG_SZ"
参数说明:第一个参数中,"HKCU\Software\oldghost\",这是个主键及子键,"test"是值项。第二个参数就是值项的键值。第三个参数是键值的类型。注册表值的类型我就不说了,有疑问自己查。
功能简介:在注册表中设置指定的键或值。

2.RegRead
语法示例:RegRead "HKCU\Software\oldghost\test"
参数说明:同RegWrite的第一个参数。
功能简介:从注册表中返回指定的键或值。

3.RegDelete
语法示例:同RegRead。
参数说明:同RegRead。
功能简介:从注册表中删除指定的键或值。

4.程序实例
'下面的程序用于判断软件是否已经注册
'实现方法:在注册表中创建一个子键,保存注册信息
'如果你用的是VB用户窗体,就把以下代码复制到“UserForm_Initialize()”过程中
'如果你用的是ACCESS窗体,就把以下代码复制到“Form_open()”过程中

On Error Resume Next
Dim wss As Object,msw As Object
Set wss =CreateObject("WScript.Shell")
codetest =wss.RegRead("HKCU\Software\oldghost\test")
'读取注册信息
If codetest= "" Then '如果注册信息为空
MsgBox "你尚未注册,无法使用该系统!"
GoTo regit '转至regit子过程
Else
Exit Sub
End If

regit:
codereg =InputBox("请输入注册号")
If codereg ="abcde" Then
wss.RegWrite "HKCU\Software\oldghost\test",codereg,"REG_SZ"
MsgBox "注册成功"
Else
If MsgBox("注册号有误,是否退出?",1 + 32,"提示") = 2 Then
GoTo regit
Else
Application.Quit '不想注册退出
End If
End If

5.优缺点:
优点:比VB自带函数灵活,键值存放的根键、子键可自己选。
缺点:Wscript.Shell对象是VBS对象,非WINDOWS必带,有的电脑可能不能用。不过我在好几台电脑上试过,都行得通,可见多数电脑都会带。

三.用API函数读取

API函数可以说是WINDOWS里最通用的方法了,其适用范围广,不只VB用它,其他的程序语言也经常用到。但是API函数长长的定义、一大堆的参数,让我这个懒人实在是懒得学,往往是需要的时候才去查一下。用它来读写注册表也不例外。

具体的语法、参数说明、功能等我就不一一简介了。事实上我也没有深入研究,怕写错了反而误人子弟,那就不好了。我还是直接用例子来说明吧。

1.程序实例:
'下面的例子用API函数读写注册表,修改ACCESS宏安全设置的键值,将宏安全设为“低”
'将以下的代码复制到VB的标准模块中
'须先引用API函数,放在模块的顶端


Public Declare Function RegOpenKey Lib "advapi32.dll" Alias"RegOpenKeyA" (ByVal hKey As Long,ByVal lpSubKey As String,phkResult As Long) As Long
'看那名字就知道了,打开注册表的某个键用的,几个参数分别是主键、子键、操作的句柄
Declare Function RegCreateKey Lib "advapi32.dll" Alias"RegCreateKeyA" (ByVal hKey As Long,phkResult As Long) As Long
'看名字也知道,创建某个键用的。但如果某键不存在,则创建并打开;已经存在的话,则直接打开。所以可以替代上面那个使用,参数也一样。
Public 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,ByValcbData As Long) As Long
'设置键值用的。参数有点多,就不说了,自己看英文猜意思应该也八九不离十了。
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias"RegQueryValueExA" (ByVal hKey As Long,ByVal lpValueName Asstring,ByVal lpReserved As Long,lpType As Long,lpcbData As Long) As Long
'查键值用的。参数跟前面那个差不多。
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKeyAs Long) As Long
'一看就知道用来关闭已打开的键的。


'下面定义一个函数调用时可以将宏安全性设为“低”
Function SetSafe()
On Error Resume Next
Dim Bjb As Long
Dim Dv As Long
Dim Fh As Long

ConstHKEY_CURRENT_USER = &H80000001
ConstREG_DWORD = 4 ' 32-bit number
IfMsgBox("确定去除宏安全警告吗?","提示!") = vbOK Then
Fh = RegCreateKey(HKEY_CURRENT_USER,"Software\Microsoft\Office\11.0\Access\Security",Bjb)
'Bjb是打开注册表的句柄。我自己将其理解为被打开的键的实例化
Fh = RegQueryValueEx(Bjb,"Level",REG_DWORD,Dv,4)
'取得宏安全性的值,赋予Dv变量
If Dv <> 1 Then'如果宏安全性不是1(即“低”)
Dv = 1
Fh = RegSetValueEx(Bjb,4) '设为“低”
If Fh = 0 Then
MsgBox "“去除宏安全警告”设置成功!重启该系统后将不会再出现宏安全警告!",0 + 64,"成功!"
Else
MsgBox "“去除宏安全警告”没有设置成功,错误代码为“" & Fh& "”",0 + 16,"错误!"
End If
Else
MsgBox "原“宏安全警告”不存在,无须设置!","错误!"
End If
Fh = RegCloseKey(Bjb) '关闭该键
End If
End Function

2.优缺点:
优点:通用性强,功能强大,适用范围广。
缺点:对非专业的编程人员是繁琐了点。

四.总结:三种方法都说了,各有利弊。我想编程的东西,没有好不好用,只有适不适用。人觉得很臭的东西,狗不照样吃得挺香么?

引用:http://blog.sina.com.cn/s/blog_5479e1ae0100eh9h.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")