请登录[¤ 阳光论坛 ¤]参与讨论


阳光宝宝
90

 □ 主题: 修改ACCESS宏安全设置的键值,将宏安全设为“低”
 □ 内容: 1楼

      之前我在博客里写过一篇《不写注册表的注册程序》,那是我在三年前应一个《EXCEL+ACCESS+SQL SVR》QQ群(3014560)里的一个群友要求写的习作,利用“Scripting.FileSystemObject”对象创建一个文本文件,然后往里面写入和读出注册信息。这种方法安全性不高,实用性也不强,只是免去了读写注册表的麻烦。 
       
        
       
      不过后来发现,读写注册表并不会比使用“Scripting.FileSystemObject”对象麻烦,而且方法很多。我这里列举三种: 
       
        
       
      一.用VB自带的函数读写 
       
        
       
      VB中有三个函数,用于操作注册表,分别是“GetSetting”、“SaveSetting”、“DeleteSetting”。我想从字面上应该也可以猜出它们的大致功能。 
       
        
       
      教科书似的使用说明我就不写了,我只用我自己的理解简单介绍一下: 
       
        
       
      1.这几个函数操作的注册表范围是有限的,只能在“[HKEY_CURRENT_USER\Software\VB and VBA Program Settings]”下创建“子键”、“值项”和“键值”。 
       
        
       
      2.GetSetting 
      语法示例:GetSetting "MyApp", "Startup", "Times", 5 
      参数说明:第一个参数是[HKEY_CURRENT_USER\Software\VB and VBA Program Settings]”下的子键,第二个参数是第一个参数的子键,第三个参数是第二个参数的“值项”,最后一个参数是创建值项时的默认键值(可以省略)。 
      功能简介:如果子键、值项不存在时,就创建,并赋予默认键值。如果已经存在,则取得并返回键值,默认键值参数被忽略。 
       
        
       
      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 "已超出试用次数!" 
       Exit sub 
      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, ByVal cbData As Long) As Long 
      ''设置键值用的。参数有点多,就不说了,自己看英文猜意思应该也八九不离十了。 
      Private 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 
      ''查键值用的。参数跟前面那个差不多。 
      Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long 
      ''一看就知道用来关闭已打开的键的。 
       
       
      ''下面定义一个函数,调用时可以将宏安全性设为“低” 
      Function SetSafe() 
      On Error Resume Next 
      Dim Bjb As Long 
      Dim Dv As Long 
      Dim Fh As Long 
       
       Const HKEY_CURRENT_USER = &H80000001 
       Const REG_DWORD = 4 '' 32-bit number 
       If MsgBox("确定去除宏安全警告吗?", 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 
       
      
——
      
争分夺秒背单词 → strain  vt.拉紧 vi.尽力
 □ 发帖时间:2014-8-11|23:59:55 |回复|返回|

 页次:1/1页 每页10  本主题贴数0 分页: 1


你还没有登录论坛,所以不能发表你的意见。你可以选择:

1、我已注册,我要

2、我还没注册,我要

3、太麻烦了,我还是

Go Top

Copyright by(C)2003-2015 http://abc.sy578.cn