【ACCESS精品源码栏目提醒】:网学会员--在 ACCESS精品源码编辑为广大网友搜集整理了:【精品】VB封装DLL实例讲解,access,excel,word,代码保护 - 其它资料绩等信息,祝愿广大网友取得需要的信息,参考学习。
VB 封装 DLL 实例讲解(一讲) http://blog.77a7.com/post/107.html DLL 基本概念 (一)概念 DLL 即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可 执行文件模块。
DLL 不是应用程序的组成部分,而是运行时链接到应用程序中。
(二)主要优点: 1、多个应用程序可以共享一个 DLL,而且当多个应用程序调用库的同一个函数时,可执行 文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间; 2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程 序; 3、从
ACCESS 角度而言,还可以更好的确保核心代码的安全。
二、 用 VB 封装 VBA 代码,构建自定义的 DLL 动态链接库 (一)
ACCESS 中实例代码 下面是一个“快速获取数字Acc.mdb”实例(该实例在文件包中),单击“提取结果”按 钮,将文本框中的数字在弹出消息显示出来。
我将就这个实例演示如何将该实例 VBA 代码封装成为 DLL。
按钮单击事件代码如下: Private Sub CmdFindnumber_Click Dim strM As String 初始字符串 Dim strOut As String 输出字符串变量 Dim I strM Me.Text1 从第一个字符向最后一个字符循环以提取每个字符 For I 1 To LenstrM 判断是否为 0 到 9 字符是则赋值输出 If MidstrM I 1 Like quot0-9quot Then strOut strOut amp MidstrM I 1 End If Next I 用 MsgBox 函数进行输出测试 MsgBox strOutEnd Sub M 以上代码还不能直接用于封装,须将其修改成为公用函数过程 (二)VB 封装实例中 VBA 代码 步骤一:在 VB 编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口 步骤二:修改工程名,这即生成的 DLL 库名1、修改工程名为:我的动态库步骤三:修改类名1、改类名为:提取数字步骤四:在代码窗口输入如下代码。
将
ACCESS 中的单击事件代码,略做修改成为一个公用函数,然后复制到 VB 代码编辑窗口代码如下 将这前的
ACCESS 代码改成一个公用函数 输入:strPutString 字符串变量需分离数字的字符串 输出: fFindNumber 字符串变量得到的数字字符 Public Function fFindNumberstrPutString As String As String Dim strOut As String 输出字符串变量 Dim I 从第一个字符向最后一个字符循环以提取每个字符 For I 1 To LenstrPutString 判断是否为 0 到 9 字符是则赋值输出 If MidstrPutString I 1 Like quot0-9quot Then strOut strOut amp MidstrPutString I 1 End If Next I 数字输出 fFindNumber strOut End Function 步骤五:编译 DLL,点菜单【文件】-【生成我的动态库.dll】,VBA 代码封装 DLL 就完成了。
三、 在 mdb 中调用自定义 DLL 动态链接库 (一)新建数据库及窗体 新建【快速提取数字DLL实例.mdb】数据库,新建一个窗体【frmMain】在窗体添文本框 【text0】按钮【CmdFindNum】Caption 属性:“提取数字”见下图 (二)引用【我的动态库.dll】库 按【AltF11】打开 VBE 窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们 自己编译的 DLL 的引用。
(三)在【CmdFindNum】按钮单击事件中加入如下代码。
Private Sub CmdFindNum_Click 申明自定义类 Dim MyFindNum As 提取数字 Dim strOut As String 实例化quot提取数字类quot对象 Set MyFindNum New 提取数字 将函数输出结果赋值给自定义字符串变量 strOut MyFindNum.fFindNumberText0 在消息框中显示 MsgBox quot你提取的数字为:quot amp strOut vbInformation quot江羽提示:quot End Sub 点击保存后,你就可以运行一下窗体测试你的成果了 M 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
本 文只是通过一个简单的实例演示了,如何通过 VB 封装一般的 VBA 中代码,因为该代码中并未涉及到
ACCESS 应用程序对象,所以在 VB 中没有对
ACCESS 对象类库进行引用,另外实例中只是简单演示了,如何手动实现对 DLL 的注册引用,在后续文章中我将就如何实现 DLL 与
ACCESS 应用程序对 接及 DLL 的自动注册及引用结合实例进行讲解。
VB 封装 DLL 实例讲解(二讲)http://blog.77a7.com/post/106.html上文中我们已经就 DLL 的基本概念,以及如何将 VBA 代码封装为 DLL,如何引用该生成的 DLL 动态链接库,进行了初步的讲解,我想大家对于 VB 封装 DLL 应该有了一个初步的了解。
下面主要就 DLL 如何实现对
ACCESS 对象进行封装方法进行探讨。
一、如何在 VB 中实现对
ACCESS 对象编程 (一)在 VB 中引用
ACCESS 对象类库 我们要通过编译 DLLACCESS 对象的封装,首先必须在 VB 中引用
ACCESS 对象类库,这样我们就可以在 VB 中,实现对
ACCESS 应用程序中的对象进行编程。
来实现对 打开 VB 编辑窗口,点菜单 - , 【引用对话框】 点选“Microsoft
Access 【工程】【引用】 打开 ,11.0 Object Library”完成对当前版本
ACCESS 应用程序对象的引用。
实例演示版本为
ACCESS2003 M 对
ACCESS 对象库的引用很关键,否则我们无法实现对
ACCESS 对象的编程 (二)了解
ACCESS 对象模型 在 VB 中要对
ACCESS 对象进行编程,还必需对
ACCESS 所提供的各项对象有一定了解,因为VB 就是通过
ACCESS 对象的方法与属性,来完成各项操作与设置,下图为
ACCESS 2003 的对象部分模型图例。
P 上图为
ACCESS 2003 对象模型,因为篇幅的问题,文中只显示模型中部分对象,要了解全部对象模型,请大家参阅帮助。
(三)VB 编程中
ACCESS VBA 与 VB 对象表述区别 1、
ACCESS VBA 与 VB 的顶层对象都为 Application ,但在编程中
ACCESS VBA 顶层对象表 Application,在 VB 编程中顶层对象用简写: 表述述为: 而 App 。
(到 VB.NET 又改回了 Application) 例程:在 VB 编程中获得 VB 及
ACCESS VBA 获取当前路径实例: 在 VB 中获得当前路径: App.Path 在 VB 中获得
ACCESS 的当前路径: Application.CurrentProject.Path P 在 office 各应用程序之间调用各组件时通常在对象前加上库名,如:
Access.Application 来表述,但因为 VB 与
ACCESS 顶层对象原本表述就存在区别,在 VB 中可以直接用 Application 表述
ACCESS 应用程序对象,并不会产生冲突的问题。
2、
ACCESS VBA 和 VB 中部分预定义类对象(如:窗体、控件等)表述基本相同,以“标签控件”为例,VB 与
ACCESS VBA 均为 Label,在 VB 编程中为了与
ACCESS 预定义类对象加以区别,
ACCESS 标签对象通常用
ACCESS.Label 表述。
例程:在 VB 编程中定义 VB 及
ACCESS 标签控件对象实例: 在 VB 中定义 VB 标签对象: Dim m_Label As Label 在 VB 中定义
ACCESS 标签对象: Dim m_Label As
Access.Label M 在进行 DLL 编程时,特别需注意对象表述区别的问题,否则无法编译或是编译后在
ACCESS 调用中报错。
(四)VB 编程中关于
ACCESS VBA 专属常量
ACCESS VBA 专属常量以“ac”开头,如:控件类(AcControlType)中的文本控件常量为acTextBox,这些常量不一定能被 VB 所识别,解决办法通常不使用“常量名”,而直接使用“常量值”,或以输入参数方式传递的方法来解决。
例程:实现隐藏所有文本控件。
acTextBox 常量值为 109。
Dim ctl As
Access.Control 申明
ACCESS 控件对象 Dim frmClt As
Access.Controls 申明
ACCESS 控件集合 遍历所有
ACCESS 控件集合,如为文本控件,则不显示该控件 For Each ctl In frmClt.Controls 文本控件类常量值为 109,以常量值替代 acTextBox 常量名 If ctl.ControlType 109 Then ctl.Visible False Next P 你可以通过帮助查阅
ACCESS 专属常量值,也可以在
ACCESS VBA 中通过程序方式获取,如:在立即窗口输入:acTextBox 回车,就可以 acTextBox 常量值为:109。
二、DLL 封装
ACCESS 对象实例演示 (一)
ACCESS 的 MDB 实例 MDB 实例演示获得
ACCESS 版本信息,并在标签 Label0 中显示(见下图),具体参看实例中frmVer6 窗体中的代码,及类模块 ClsVeresion 中代码。
Pmdb 实例中 frmVer1-frmVer6 各窗体中具体演示了,代码按 DLL 封装需要整理的思路。
例程:frmVer6 窗体加载事件代码 Private Sub Form_Load 申明自定义类的实例 Dim m_Ver As New ClsVeresion 调用自定义类的 objAddItem 方法 m_Ver.objAddItem Label0 End Sub 例程:ClsVeresion 类模块代码 程序功能:定义类接口,将版本信息输出并在标签中显示 Public Sub objAddItemm_label As Label m_label.Caption AppVersion End Sub 函数功能:输出
ACCESS 版本信息 Private Function AppVersion As String Dim strVer As String 定义字符串变量 将版本号赋值给字符串变量 strVer Application.Version 根据版号输出对应版本信息 Select Case strVer Case quot8.0quot AppVersion quotAccess 97quot Case quot9.0quot AppVersion quotAccess 2000quot Case quot10.0quot AppVersion quotAccess 2002quot Case quot11.0quot AppVersion quotAccess 2003quot Case quot12.0quot AppVersion quotAccess 2007quot End Select End Function (二)DLL 的封装
ACCESS 对象实现 1、打开 VB6.0 编辑器,点菜单 , 【新建工程】 【新建工程】 在 点选 对话框中, 【ActiveX DLL】,点【确定】。
修 2、 改 工程名及类名,实例中我定义的工程名: 类名 GetAccVer , :ClsAccVer ,修改完成以后点选菜单【保存】工程 (见下图。
P 工程名就是我们后面将引用的 DLL 库名,类模块名为代码中我们申明的类名。
3、点菜单【工程】-【引用】,打开【引用对话框】,点选“Microsoft
Access 11.0 ObjectLibrary”完成对当前版本
ACCESS 应用程序对象的引用。
4、将 MDB 中类模块 ClsVeresion 代码复制到 VB 中 ClsAccVer 类模块中,按前面我们所述的 VB 中实现
ACCESS 对象编程的注意要点略做修改。
(见下图划红线部分) P1、因为 VB 与
ACCESS VBA 中标签类对象都为 Label,因此加上库名(
Access.Label)加以区别; 2、因为 VB 与
ACCESS VBA 顶层应用程序对象,表述原本就有区别,所以无需特别区分。
例程:ClsAccVer 类模块代码 程序功能:定义 DLL 接口,将版本信息输出并在标签实例中显示 Public Sub objAddItemm_label As
Access.Label m_label.Caption AppVersion End Sub 函数功能:输出
ACCESS 版本信息 Private Function AppVersion As String Dim strVer As String 定义字符串变量 将版本号赋值给字符串变量 strVer Application.Version 根据版号输出对应版本信息 Select Case strVer Case quot8.0quot AppVersion quotAccess 97quot Case quot9.0quot AppVersion quotAccess 2000quot Case quot10.0quot AppVersion quotAccess 2002quot Case quot11.0quot AppVersion quotAccess 2003quot Case quot12.0quot AppVersion quotAccess 2007quot End Select End Function 4、编译 DLL,点菜单【文件】-【GetAccVer.dll】动态链接库,封装 DLL 就完成了。
你现在可以在
ACCESS 中引用该 DLL 测试一下看看成果了。
参看实例中 frmVer7 窗体,如实例引用报错,请重新引用 GetAccVer.dll 即可。
因为受本人认知及文字水平所限,不免有错漏之处还请大家斧正。
本文的Word 文稿、VB
源码、MDB 实例均在“实例包”中。
在后文中我们主要就动态链接库引用的方法和技巧结合实例进行探讨。
VB 封装 DLL 实例讲解(三讲)http://blog.77a7.com/post/105.html 一、手动注册及引用 (一)手动注册及引用方法(参看实例:手动引用.mdb) 进入 VBA 编辑窗口,点菜单【工具】—【引用】,打开【引用】对话框,点【浏览】按钮,打开【添加引用】对话框,点选要引用的 DLL(测试实例为:ClsFindString.dll),点【打开】—点【确定】,我们完成动态链接库的手动注册及引用。
(二)手动注册及引用方法不足及问题 手动注册引用优点是不言而喻的,方便简捷,易于操作。
但在实际运用中,当我们在其他电脑上发布应用程序,或运行我们测试好的应用程序时,却会出现错误提示,程序无法正常运行。
错误(一):找不到工程或库(见下图) 错误的主要原因:DLL 在当前运行的电脑系统中没有注册信息,而且引用不正确。
错误(二):引用的动态链接库(DLL)丢失(见下图) 进入到 VBA 编辑窗口,点菜单【工具】—【引用】,打开【引用】对话框,我们会看到之前引用的 DLL 动态链接库丢失。
错误的主要原因:系统无法找到原路径引用 DLL。
错误(三):自动化错误(见下图) 错误的主要原因:我们在发布应用程序的电脑或系统中,虽然重新完成 DLL 手动注册和引用,但如果 DLL 路径再次改变,运行程序时就会出现“自动化错误”提示。
错误(四):ActiveX 部件不能创建对象(见下图) 错误的主要原因:应用程序已正常引用 DLL 动态链接库,但其册注信息丢失或者没有正常注册,就会出现以下问题。
(三)解决上述错误方法 1、解决错误方法,当然是重新进行 DLL 的手动注册及引用,具体步骤参下图。
但这只是治标不治本的办法,不利于对外发布我们的应用程序,最好的办法还是通过 VBA 自动完成 DLL 的注册及引用。
二、自动注册及引用方法 在探讨如何实现 DLL 自动注册及引用之前,我们必须清楚一点,那就是 DLL 的注册与引用并不是同一事件或行为的两种不同表述,而是两种不同的动作。
DLL 注册 是指将 DLL 的相关信息,如:DLL 唯一识标号(GUID),版本号(Version)及路径(Path) 信息写入注册表中,以供系统对 DLL 进行识别调用。
我们通过 VB 编译生成 DLL 时,VB 一般会自动完成对该 DLL 的注册,但如果要在其它电脑上 运行程序时,我们就必须重新对该 DLL 进行注册。
DLL 引用 是指将 DLL 类库对象集成到代码编辑环境中,以便编程时调用类库中的对象、属性及方法。
我们通过手动方式完成 DLL 的引用时,系统会自动完成对该 DLL 的注册,所以我们无需另行 对 DLL 进行注册,但如果我们在其它电脑上运行程序时,还会出现我们在之前章节中所述的错误。
(一)DLL 自动注册方法 我们可以通过 Regsvr32.exe 来进行 DLL 注册或反注册,具体的语法及参数: 语法: Regsvr32 /u /n /i:cmdline dllname 说明:其中 dllname 为 DLL 文件名,建议在发布时将 DLL 复制到 system 文件夹下。
参数: 参数 说明 /u 反注册 /s 指定 regsvr32 安静运行,且不显示任何消息框。
/n 指定不调用 DllRegisterServer。
此选项必须与/i 共同使用。
调用 DllInstall 将它传递到可选的 cmdline。
在与/u 共同使用时,它调用 dll /i:cmdline 卸载。
dllname 指定要注册的 dll 文件名。
1.1 示例通过 Shell 运行 Regsvr32 程序完成 DLL 注册 Shell quotRegsvr32 /S quot amp Chr34 amp CurrentProject.Path amp quotClsFindString.dllquot amp Chr34 Shell 函数 用以运行 Regsver32 程序 Regsver32 注册程序 /S 注册程序 参数,书写时记得参数前后必须留空 Chr34 Chr 函数,获指定代码字 符,Chr34为引号 CurrentProject.Path DLL 当前路径 ClsFindString.dll 演示实例 DLL 名 1.2 示例通过 Shell 运行 Regsvr32 程序反注册 Shell quotRegsvr32 /U /S quot amp Chr34 amp CurrentProject.Path amp quotClsFindString.dllquot ampChr34 我 们可以将注册语句放在窗体的加载事件,自动完成 DLL 的注册,具体可以参看实例。
但如果我们有多个 DLL 需要批量注册时,可以考虑通过软件打包发布工具来 完成 DLL 的注册工作;也可以事先编写 BAT 文件,在打包发布时将该 BAT 文件一并打包发布,安装时运行该 BAT 文件,来完成 N 个 DLL 的批量注册,在此 就不多着笔墨,大家可以参看实例包中的 BAT 文件实例。
(二)DLL 自动引用方法 2.1 通过 References 对象的 AddFromFile 方法实现自动引用 Dim ref As Reference 申明引用类对象 On Error Resume Next 避免因重复引用造成的错误提示 实例化引用对象,完成 DLL 的引用 Set ref References.AddFromFileCurrentProject.Path amp quotClsFindString.dllquot 为了避免因重复引用出现的错误,我们可以如上代码中加入 Error 语句,我们还可以在应用程序退出时,通过对 References 对象的 Remove 方法释放 DLL 或反引用。
Dim ref As Reference 申明引用类对象 实例化反引用对象 Set ref ReferencesquotClsFindStringquot 移除引用指定类库 References.Remove ref 说明:根据本人实践,我个人倾向于使用 Error 语句,因为如果应用程序非正常退出,引用对象没有反引用成功,启动时就难免出现重复引用的错误问题。
2.2 通过 DLL 唯一标识号实现自动引用 Dim ref As Reference 申明引用类对象 On Error Resume Next 避免因重复引用造成的错误提示 唯一标识号完成注册,需要 DLL 标识号,主版本号,次版本 Set ref References.AddFromGuidquotC5E340E2-C557-4852-AE83-5A0578B6863Bquot 1 0 DLL 的标识号是编译生成时就确定了的,这个标识号就是 DLL 的终生制身份证号,我们可以通过这个唯一标识号来完成 DLL 自动引用。
但此种方法必须具备两个条件,一是 DLL 已经成功注册,二是我们知道了该 DLL 的标识号、主版本号、次版本号。
2.2.1 获取 DLL 标识号、主版本号、次版本号方法 Dim ref As Reference 申明引用类对象 实例化引用类库对象 Set ref References.AddFromFileCurrentProject.Path amp quotClsFindString.dllquot Debug.Print ref.GUID 获得 DLL 唯一标识号 Debug.Print ref.Major 获得主版本号 Debug.Print ref.Minor 获得次版本号 2.3 通过 CreateObject 方法实现自动引用 Dim DllFindStr As Object 申明对象 实例化对象为创建的 DLL 类库对象 ClsFindstring 为 DLL 库名,cls.