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", "Startup", "Times", 5
参数说明:和GetSetting差不多,但最后一个参数是被保存进去的键值。
功能简介:用来保存键值的,如果子项或值项不存在,键值不会被保存。

 

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

 

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

 

i = GetSetting("MyApp", "Startup", "Times", 5)
'如果Times值项,则创建,用于保存试用次数
'如果已存在,取得现有的值
If i = 0 Then '如果取出的值已经是0,则提示并退出应用程序
    MsgBox"已超出试用次数!"
    Exitsub
End If
SaveSetting "MyApp", "Startup", "Times", 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, ByVal lpSubKey As String,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, lpData As Any,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("确定去除宏安全警告吗?", 1 + 32, "提示!") = vbOK Then
       Fh = RegCreateKey(HKEY_CURRENT_USER,"Software\Microsoft\Office\11.0\Access\Security", Bjb)
       'Bjb是打开注册表的句柄。我自己将其理解为被打开的键的实例化
       Fh = RegQueryValueEx(Bjb, "Level", 0, REG_DWORD, Dv, 4)
       '取得宏安全性的值,赋予Dv变量
       If Dv <> 1 Then'如果宏安全性不是1(即“低”)
           Dv = 1 
           Fh = RegSetValueEx(Bjb, "Level", 0, REG_DWORD, Dv, 4) '设为“低”
           If Fh = 0 Then
               MsgBox "“去除宏安全警告”设置成功!重启该系统后将不会再出现宏安全警告!", 0 + 64, "成功!"
           Else
               MsgBox "“去除宏安全警告”没有设置成功,错误代码为“" & Fh& "”", 0 + 16, "错误!"
           End If
       Else
           MsgBox "原“宏安全警告”不存在,无须设置!", 0 + 16, "错误!"
       End If
       Fh = RegCloseKey(Bjb) '关闭该键
    End If
End Function

 

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

 

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

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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用微软提供的CReg类可以方便地读写注册表,具体用法如下: ```cpp #include <creg.hxx> // 读取注册表 CRegKey reg; if (reg.Open(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion"), KEY_READ) == ERROR_SUCCESS) { DWORD dwType = REG_SZ; TCHAR szValue[1024] = { 0 }; ULONG ulCount = 1024; if (reg.QueryStringValue(_T("ProgramFilesDir"), szValue, &ulCount) == ERROR_SUCCESS) { // 读取成功 // szValue中存储了ProgramFilesDir的值 } reg.Close(); } // 写入注册表 CRegKey reg; if (reg.Create(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\MyCompany\\MyApp")) == ERROR_SUCCESS) { if (reg.SetStringValue(_T("MyValue"), _T("Hello, World!")) == ERROR_SUCCESS) { // 写入成功 } reg.Close(); } ``` 另外,在VB中,可以使用自身的SaveSetting、GetSetting函数读写注册表,也可以使用API函数来实现注册表任意读写。具体用法可以参考以下代码: ```vb ' 读取注册表 Dim hKey As Long Dim dwType As Long Dim dwSize As Long Dim sValue As String hKey = OpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion", KEY_READ) If hKey <> 0 Then dwType = REG_SZ sValue = String$(1024, 0) dwSize = Len(sValue) If QueryValueEx(hKey, "ProgramFilesDir", 0, dwType, ByVal sValue, dwSize) = ERROR_SUCCESS Then ' 读取成功 ' sValue中存储了ProgramFilesDir的值 End If RegCloseKey hKey End If ' 写入注册表 hKey = CreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\MyCompany\MyApp") If hKey <> 0 Then If SetValueEx(hKey, "MyValue", 0, REG_SZ, "Hello, World!", Len("Hello, World!")) = ERROR_SUCCESS Then ' 写入成功 End If RegCloseKey hKey End If ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值