将VBA代码编译封装成为DLL动态链接库方法.doc
文本预览下载声明
将VBA代码编译封装成为DLL动态链接库方法?
在OFFICE中使用VBA虽然方便,并且功能强大,但是VBA在代码的保护上却存在着缺陷。如果不对VBA工程设置密码保护,代码很容易被人浏览乃至窃取。而且即使设置了密码保护,也很容易被人破解。
因此,要想真正保护VBA代码,要想让别人无法或难于破解您的VBA代码,那么,我们可以将VBA代码编译成为DLL动态链接库,也就是封装成为DLL的意思,下面是与此相关的方法,希望对您有所帮助。
一、为什么要编译成为DLL
我们知道,Visual C++、Visual Basic和C++ Builder以及Delphi等编译器所编译出来的程序不容易被人破解(相对来说),这是因为代码被编译成了可执行文件或者动态链接库文件。那么,我们是否可以将VBA代码封装到动态链接库文件中,然后用Word调用呢?回答是肯定的。而且这样做还有一个好处,即可以加快代码的运行速度。
二、将VBA代码封装成动态链接库
假如我们已经写好了一个VBA工程,而且运行无误。
①建立VB工程及一般性操作
首先,我们需要两种工具,其中当然包括Microsoft Word,另外一种是Microsoft Basic 6.0。
打开Microsoft Basic 6.0,在“新建工程”中选取“ActiveX DLL”,新建一个工程。在属性窗口中将工程名改为VBAPrj,类模块名改为VBACls。然后在“工程”菜单下打开“引用”,选取“Microsoft Office 11.0 Object Library”——这一步很是关键,切不可遗漏,然后保存工程。下面我们所做的是向工程内添加代码。
将VBA工程中的一个名为Test过程的代码选定后复制,然后切换到VB编辑器,选中VB的工程管理器中的类模块VBACls,将代码粘贴至代码编辑窗口中,于是这段代码便成了类模块VBACls一个方法,然后将工程编译生成dll文件(如果编译成功的话)。在Word中,我们就可以通过类模块VBACls建立的对象来调用此方法(具体怎么调用,我们将后面介绍)。当然,我们可以继续向工程里添加代码。
②修改代码
虽然VBA源于VB,但是两者毕竟存在着一些差异。因此,需要对转移到VB中的VBA代码做一些必要的修改。
A、修改VBA代码中所特有类型的对象
如果我们所添加的代码里有VBA所特有类型——如Document???Rang、BookMark等所建立的对象,编译时会提示错误,因为VB不能够识别这些对象。此时修改的方法是,将这些对象作为过程或函数的参数进行传递。需要注意的是,这些参数的类型都一律设为Object。
例如,我们在过程Test中要访问对象ThisDocument,但是VB无法识别ThisDocument,于是我们就为过程test添加一个参数Doc来传递ThisDocument,即Test可定义为Test(Doc As Object)。
B、修改VBA所特有一般变量
VB也无法识别VBA特有的一般变量,如ProtectType,同样,我们也将其作为过程后函数的参数进行传递,不过其类型名都一律设为Variant。
C、修改VBA所特有常量
如果在VBA代码中出现了这样的语句:
ProtectionType = wdNoProtection
很明显,wdNoProtection是Word所独有的常量,不为VB所能识别,因而无法通过编译。怎样解决这个问题呢?当然,我们可以用修改变量的方法予以修改。但是聪明的读者会想到:如果我们知道了wdNoProtection的值,就可以直接将值赋给ProtectionType。但是接下来的一个问题是:我们怎样才能获得wdNoProtection的值呢?方法很简单,就是让Word“开口”告诉我们。
在Word一个事件中添加以下语句:
MsgBox CStr (wdNoProtection)
其中CStr是类型转换函数,返回参数相应的字符串。只要在Word中触发此事件,会弹出一个对话窗,显示“-1”,这就是Word所告诉我们的:wdNoProtection 的值是-1。于是我们就可以将语句 ProtectionType = wdNoProtection 改为 ProtectionType = -1,问题到此就迎刃而解了。
三、封装用户窗体
我们也可以将用户窗体封装到动态链接库文件里。首先打开Word的VBA编辑器,选中工程资源管理器中的用户窗体,点击右键,选择“导出文件”,选定路径后,将窗体文件保存。然后切换到VB编辑器,在“工程”菜单中选择“添加文件”命令,添加保存的窗体文件。添加结束后,我们会发现VB编辑器中的工程资源管理器中的设计器
显示全部