分享

教程 | 初识封装:从VBA到DLL

 asaser 2022-04-03

写在前面

先介绍一下vb6.0,即Visual Basic 6.0,是微软公司开发的编程设计软件,基于Windows操作系统可视化编程环境。Visual Basic 6.0还提供了窗口编辑,可直接对窗口进行编辑和预览。

Visual Basic 6.0由标题栏、菜单栏、工具栏、工具箱、窗体窗口、工程窗口、属性窗口、窗体布局窗口等构成。

Visual Basic 6.0的组件有很多,比如编辑器、设计器、属性等开发组件。Visual Basic 6.0的工具箱由指针、图片框、标签、文本框、框架、命令按钮、复选框、单选按钮、组合框、列表框、水平滚动条、垂直滚动条、定时器、驱动器列表框、目录列表框、文件列表、形状控件、直线、图像控件、数据控件、OLE容器构成。

再说一下什么是DLL,即动态链接库,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序同时使用的代码和数据的库。

相对于VBA,封装后的DLL的源码是不可见的,这在一定程度上避免了源码泄露的风险,当然,对于擅长破解的人来说,这也几乎没什么卵用,不过至少能够起到八成的作用,因为安全本身也是相对的。

本文中的封装DLL工具用的就是VB6.0。


准备工作

从下图可以看出VB6.0编辑器的风格和vba很相似,或者说VBA的编辑器就是vb6.0的简版而已,这样熟悉VBA的同学几乎可以零成本的迁移过来。
图片

创建工程是第一步,同本文主题,自然是创建DLL工程了。

图片

因为要和excel交互,所以要引用excel的lib库,这样的话定义Excel对象的时候才可以成功。

图片

再引用excel的时候可能会发现引用完保存工程以后发现Excel lib就不见了,这可能是软件冲突导致的,可以手动引入来解决

图片

图片

可以看到和原来的版本不一致了,这证明了版本冲突导致了上述问题。


开始编程

当上述准备工作做完以后,就可以像在VBA编辑器窗口一样进行编码工作了。
不过有一点需要注意,因为VBA是内置在Excel中的,所以,编程的时候可以直接引用Excel的所有对象,比如workbook,worksheet,range,cell等等,但在VB6.0里却是行不通的,因为它并不是天然的就知道这些对象是excel对象,需要先定义,前面引用lib就是为定义相关变量做准备的。

所有的Excel对象其实都来自于一个大类Excel.Application,将其定义为顶级对象,其它属性或方法直接调用即可,也就是说在VB6.0的所有类模块中都需要有以下几行代码:
    Set VBApp = GetObject(, "Excel.Application")    Set wk = VBApp.ThisWorkbook    Set ws = wk.ActiveSheet
并且,在后续所有涉及到Excel对象操作的地方都需要加上ws(对象名字可以自定义),例如
    Set VBApp = GetObject(, "Excel.Application")    Set wk = VBApp.ThisWorkbook    Set ws = wk.ActiveSheet
'变量初始化区域 substrSQL = "" jSum = ws.Range("AZ3").End(xlToLeft).Column iSum = ws.Range("A65535").End(xlUp).Row    VBApp.application.screenUpdating=false

开始封装

当编程完毕以后就可以封装DLL了,先设置DLL文件的属性,可以根据需要设置相关信息。

图片

文件菜单直接生成即可,会同时生成派生的一些其它文件暂时先不用管。

图片

使用DLL

定义的过程、函数或者属性都被封装到了DLL中,成为了对象的一部分,在VBA编程的时候可以直接引用相关对象的过程、方法或者属性,用之前需要在VBA中引用生成的dll文件,见下图:

图片

图片

这个时候我们在VBA中就可以直接调用相关内容了。这些内容对于使用者来说就是在一个黑盒子中,源码是看不到的,这是与VBA中的那些代码最大的区别。

图片

注意,这里New的一个对象应该是类模块的名称,而不是工程名称,否则就会出错。

另外,还需要注册生成的DLL,使用如下命令:

cmdregsvr32 myVBAdll.dll

如果弹出如下窗口说明注册成功了。

图片

如果发生错误,大概率会使注册表权限不够所致,可以通过下面的方法重置权限:打开注册表找到下面的路径,右键打开权限设置窗口,将“完全控制”权限赋予当前计算机用户。

图片

写在最后

封装过程虽然简单,但是调试可没那么简单,因为没修改一个代码都需要重新封装、注册,所以建议现在VBA上把相关功能开发完成后再移植到VB6.0进行封装处理。
祝你早日也做一个自己的DLL程序。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多