问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

将VBA代码编译封装成为DLL动态链接库的方法

发布网友 发布时间:2024-10-02 13:26

我来回答

1个回答

热心网友 时间:2024-10-21 10:17

一、为什么要编译成为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编辑器中的工程资源管理器中的设计器出现了刚添加的窗体名,选中后双击,在窗体编辑器中就会显现所添加的用户窗体。
到了这里,读者会问:窗体还有代码呢,怎么办?先别急,试一试下面的操作,你就会明白,问题早已不再是问题了。选中工程资源管理器中的用户窗体,点击右键,选择“查看代码”,你就会高兴发现,在代码编辑框中出现了窗体所对应的代码。原来,在我们导入窗体文件的同时也导入了窗体的代码!当然高兴之余,不要忘了还要对这些代码按照我们上述的方法进行必要修改,以保证代码顺利地通过编译。这样Word就可以通过类模块VBACls间接地调用窗体。
四、在Word中引用动态链接库
假如经过我们编译已生成了一个动态链接库文件VBAPrj.dll,其中有一类模块VBACls,此类模块有一个方法Test(Doc As Object)。
接下来我们所要做的是用Word调用Test,有三种方法可供选择:
1.打开Word的VBA编辑器中ThisDocument代码窗口,点"工具"菜单下的"引用"命令,在引用对话框中引用该动态链接库。
调用代码如下:
Dim VBACls As New VBAPrj.VBACls
VBACls.Test(ThisDocument)
2.如果知道该动态链接库文件的位置,可以在ThisDocument代码窗口以代码形式引用, 代码如下:
Private Sub Document_Open()
On Error Resume Next
Me.VBProject.References.AddFromFile "D:VBAPrj.dll"
End Sub
3.将动态链接库文件拷贝到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
然后以以下代码形式调用Test:
Dim objPrjDoc As Object
Set objPrjDoc = GetProjectDoc
Call objPrjDoc.Test(ThisDocument)
Set objPrjDoc = Nothing
推荐您使用第三种方法,虽然这种方法相对麻烦,但是只要动态链接库与Word文档处于同一目录下,可保证程序的可移植性。
到目前为止,我们已完成了我们所要达的目的。此时,即便我们不对VBA工程设置密码保护,别人也将很难窥视到我们的代码。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
cad里面打完字怎么还原十字架 财务建帐需要什么 建账建账的基本要求 当爱情与亲情需要丢弃一样时,你会选择丢弃哪一方 当爱情和亲情有冲突时你会怎样决择?你会为你所爱的人不顾一切吗? 剑网三 查看余额 因为某些特殊原因不好登陆游戏查看,求其他方式_百度知 ... 右肺上叶中叶结节灶怎么回事 节能门窗有哪些标准 节能门窗有哪些 节能门窗具有哪些特征 有没有人帮我看一下劲浪汽车音响怎么样? 北京轩翔思悦传媒广告有限公司怎么样? 北京树美教育咨询有限公司怎么样? 北京福元生产的文思悦是正品吗 思悦智能家居怎么样 思悦教育短视频教育怎么退款 发现老公不爱了,想离婚时怎么挽回老公? 老公坚决要离婚最有效的挽回方法挽回死心老公的最佳时期 老公要离婚该怎么挽回他? 如何挽回死心要离婚的老公 老公要离婚挽回最后一招 什么是导致低血压的原因 什么能引起血压低 四川教师招聘笔试用什么教材好? 永久影院是不是都是免费的电影? 身份证丢了,必须要本人亲自去补办吗,家人能否代办 身份证补办为什么非要自己去办理 北京社保离职后自己交可以吗? 在北京怎么自己交社保吗 西梅和李子有什么区别?几招教你轻松区别西梅和李子! 汕头市金平区有哪个学校的校服裤是黑色的而且有俩条白色的直线? 在电脑怎么上泡吧社区?还能跟手机一样的使用,该进什么网址好··_百... 国家助学贷款年利率怎么会到12%的???本金5850竟然要还7250啊?谁来解答... 电脑上乐讯怎么发表图片 乐讯社区论坛简介 乐讯社区主要分类 ps cc 用数位板画画时有时候想甩线之类的就会出现 向下拖动之类的(如 ... ...智能通话里把所有的都关闭了,但是按拨号键,还是智能拨号,怎么... PSCS3时间轴动画功能消失如何解决ps时间轴打开动画祯不显示 倒睫怎么治疗 眼睫毛倒长怎么处理? 比喻糟蹋美好的事物的成语,首字是“焚” 瘦身效果好的水果有哪些 大清盐商每个人的结局 夏季吃什么水果对身体好 夏季养颜瘦身的水果 五种瘦身水果 怀孕25周胎盘2级吃猪肚鸡和艾叶吗 龙泉驿区大面街道好日子社区卫生服务站国庆放假期间还能做包皮手术吗... 求100首好听新歌(男.女.合唱都可以),10首DJ摇滚。5部最好体的电影... ...再改。为什么一直提示我必须先用ALTER USER 修改密码。