《2022年2022年将VBA代码编译封装成为DLL动态链接库方法》由会员分享,可在线阅读,更多相关《2022年2022年将VBA代码编译封装成为DLL动态链接库方法(4页珍藏版)》请在金锄头文库上搜索。
1、将 VBA 代码编译封装成为DLL 动态链接库方法在 OFFICE中使用 VBA虽然方便,并且功能强大,但是VBA在代码的保护上却存在着缺陷。如果不对 VBA工程设置密码保护,代码很容易被人浏览乃至窃取。而且即使设置了密码保护,也很容易被人破解。因此,要想真正保护VBA代码,要想让别人无法或难于破解您的VBA代码,那么,我们可以将 VBA代码编译成为 DLL动态链接库,也就是封装成为DLL的意思,下面是与此相关的方法,希望对您有所帮助。一、为什么要编译成为DLL 我们知道, Visual C+ 、Visual Basic和 C+ Builder以及 Delphi 等编译器所编译出来的程序不容易
2、被人破解(相对来说), 这是因为代码被编译成了可执行文件或者动态链接库文件。 那么,我们是否可以将VBA代码封装到动态链接库文件中,然后用Word调用呢?回答是肯定的。而且这样做还有一个好处,即可以加快代码的运行速度。二、将 VBA代码封装成动态链接库假如我们已经写好了一个VBA工程,而且运行无误。建立 VB工程及一般性操作首先,我们需要两种工具,其中当然包括Microsoft Word ,另外一种是Microsoft Basic 6.0。打开 Microsoft Basic 6.0,在“新建工程”中选取“ActiveX DLL ”,新建一个工程。在属性窗口中将工程名改为VBAPrj,类模块名
3、改为VBACls 。然后在“工程”菜单下打开“引用”,选取“Microsoft Office 11.0 Object Library ”这一步很是关键,切不可遗漏,然后保存工程。下面我们所做的是向工程内添加代码。将 VBA工程中的一个名为Test 过程的代码选定后复制, 然后切换到 VB编辑器,选中 VB的工程管理器中的类模块VBACls ,将代码粘贴至代码编辑窗口中,于是这段代码便成了类模块VBACls一个方法,然后将工程编译生成dll文件 (如果编译成功的话) 。在 Word中,我们就可以通过类模块VBACls建立的对象来调名师资料总结 - - -精品资料欢迎下载 - - - - - -
4、- - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 4 页 - - - - - - - - - 用此方法(具体怎么调用,我们将后面介绍)。当然,我们可以继续向工程里添加代码。修改代码虽然 VBA源于 VB ,但是两者毕竟存在着一些差异。因此,需要对转移到VB中的 VBA代码做一些必要的修改。、修改 VBA代码中所特有类型的对象如果我们所添加的代码里有VBA所特有类型如Document 、Rang 、BookMark等所建立的对象,编译时会提示错误,因为VB不能够识别这些对象。此时修改的方法是,将这些对象作为过程或函数的参数进行传递。需要注意
5、的是,这些参数的类型都一律设为Object 。例如,我们在过程Test 中要访问对象 ThisDocument,但是 VB无法识别ThisDocument, 于是我们就为过程test 添加一个参数 Doc来传递 ThisDocument,即 Test 可定义为 Test(Doc As Object)。、修改 VBA所特有一般变量VB也无法识别 VBA特有的一般变量, 如 ProtectType ,同样,我们也将其作为过程后函数的参数进行传递,不过其类型名都一律设为Variant 。、修改 VBA所特有常量如果在 VBA代码中出现了这样的语句 : ProtectionType = wdNoPro
6、tection 很明显, wdNoProtection 是 Word所独有的常量,不为VB所能识别,因而无法通过编译。 怎样解决这个问题呢?当然, 我们可以用修改变量的方法予以修改。但是聪明的读者会想到:如果我们知道了wdNoProtection 的值,就可以直接将值赋给 ProtectionType 。但是接下来的一个问题是:我们怎样才能获得wdNoProtection 的值呢?方法很简单,就是让Word “开口”告诉我们。在 Word一个事件中添加以下语句:MsgBox CStr (wdNoProtection) 其中 CStr 是类型转换函数, 返回参数相应的字符串。 只要在 Word中
7、触发此事件,会弹出一个对话窗,显示“- 1”,这就是 Word所告诉我们的:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 4 页 - - - - - - - - - wdNoProtection 的值是 -1。于是我们就可以将语句 ProtectionType = wdNoProtection 改为 ProtectionType = -1,问题到此就迎刃而解了。三、封装用户窗体我们也可以将用户窗体封装到动态链接库文件里。首先打开Word的 VBA编辑器,选中工程资源管理
8、器中的用户窗体,点击右键,选择“导出文件”,选定路径后,将窗体文件保存。然后切换到VB编辑器,在“工程”菜单中选择“添加文件”命令,添加保存的窗体文件。添加结束后,我们会发现VB编辑器中的工程资源管理器中的设计器出现了刚添加的窗体名,选中后双击, 在窗体编辑器中就会显现所添加的用户窗体。到了这里,读者会问:窗体还有代码呢,怎么办?先别急,试一试下面的操作,你就会明白,问题早已不再是问题了。选中工程资源管理器中的用户窗体,点击右键, 选择“查看代码”, 你就会高兴发现, 在代码编辑框中出现了窗体所对应的代码。 原来,在我们导入窗体文件的同时也导入了窗体的代码!当然高兴之余,不要忘了还要对这些代码
9、按照我们上述的方法进行必要修改,以保证代码顺利地通过编译。这样Word就可以通过类模块 VBACls间接地调用窗体。四、在 Word中引用动态链接库假如经过我们编译已生成了一个动态链接库文件VBAPrj.dll,其中有一类模块 VBACls ,此类模块有一个方法Test(Doc As Object)。接下来我们所要做的是用Word调用 Test,有三种方法可供选择:1. 打开 Word的 VBA编辑器中 ThisDocument 代码窗口,点 工具 菜单下的 引用 命令,在引用对话框中引用该动态链接库。调用代码如下 : Dim VBACls As New VBAPrj.VBACls VBACl
10、s.Test(ThisDocument) 2. 如果知道该动态链接库文件的位置,可以在ThisDocument 代码窗口以代码形式引用 , 代码如下 : Private Sub Document_Open() On Error Resume Next 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 4 页 - - - - - - - - - Me.VBProject.References.AddFromFile D:VBAPrj.dll End Sub 3. 将动态链接库
11、文件拷贝到Word文档同一目录下,可在 ThisDocument 代码窗口中建立如下引用函数:Private Function GetProjectDoc() As Object On Error Resume Next Dim VBACls As Object Set VBACls = CreateObject(VBAPrj.VBACls) If VBACls Is Nothing Then MsgBox VBAPrj.dll必须和文档在同一目录下! Exit Function End If Set GetProjectDoc = VBACls End Function 然后以以下代码形式调
12、用Test:Dim objPrjDoc As Object Set objPrjDoc = GetProjectDoc Call objPrjDoc.Test(ThisDocument) Set objPrjDoc = Nothing 推荐您使用第三种方法,虽然这种方法相对麻烦,但是只要动态链接库与Word文档处于同一目录下,可保证程序的可移植性。到目前为止,我们已完成了我们所要达的目的。此时,即便我们不对VBA工程设置密码保护,别人也将很难窥视到我们的代码。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 4 页 - - - - - - - - -