VB封装DLL实例讲解,access,excel,word,代码保护_第1页
VB封装DLL实例讲解,access,excel,word,代码保护_第2页
VB封装DLL实例讲解,access,excel,word,代码保护_第3页
VB封装DLL实例讲解,access,excel,word,代码保护_第4页
VB封装DLL实例讲解,access,excel,word,代码保护_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VBVB 封装封装 DLLDLL 实例讲解 一讲 实例讲解 一讲 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 Len strM 判断是否为 0 到 9 字符 是则赋值输出 If Mid strM I 1 Like 0 9 Then strOut strOut Mid strM I 1 End If Next I 用 MsgBox 函数进行输出测试 MsgBox strOut End Sub M以上代码还不能直接用于封装 须将其修改成为公用函数 过程 二 VB 封装实例中 VBA 代码 步骤一 步骤一 在 VB 编辑窗中 点菜单 文件 新建工程 打开新建工程窗口 步骤二 步骤二 修改工程名 这即生成的 DLL 库名 1 1 修改工程名为 我的动态库 步骤三 步骤三 修改类名 1 1 改类名为 提取数字 步骤四 步骤四 在代码窗口输入如下代码 将 ACCESS 中的单击事件代码 略做修改成为一个公用函数 然后复制到 VB 代码编辑窗口 代码如下 将这前的 ACCESS 代码改成一个公用函数 输入 strPutString 字符串变量 需分离数字的字符串 输出 fFindNumber 字符串变量 得到的数字字符 Public Function fFindNumber strPutString As String As String Dim strOut As String 输出字符串变量 Dim I 从第一个字符向最后一个字符循环 以提取每个字符 For I 1 To Len strPutString 判断是否为 0 到 9 字符 是则赋值输出 If Mid strPutString I 1 Like 0 9 Then strOut strOut Mid strPutString I 1 End If Next I 数字输出 fFindNumber strOut End Function 步骤五 步骤五 编译 DLL 点菜单 文件 生成我的动态库 dll VBA 代码封装 DLL 就完成 了 三 在 mdb 中调用自定义 DLL 动态链接库 一 新建数据库及窗体 新建 快速提取数字 DLL 实例 mdb 数据库 新建一个窗体 frmMain 在窗体添文本 框 text0 按钮 CmdFindNum Caption 属性 提取数字 见下图 二 引用 我的动态库 dll 库 按 Alt F11 打开 VBE 窗口 点菜单 工具 引用 打开引用对话框 完成对我们 自己编译的 DLL 的引用 三 在 CmdFindNum 按钮单击事件中加入如下代码 Private Sub CmdFindNum Click 申明自定义类 Dim MyFindNum As 提取数字 Dim strOut As String 实例化 提取数字类 对象 Set MyFindNum New 提取数字 将函数输出结果赋值给自定义字符串变量 strOut MyFindNum fFindNumber Text0 在消息框中显示 MsgBox 你提取的数字为 strOut vbInformation 江羽提示 End Sub 点击保存后 你就可以运行一下窗体测试你的成果了 M本文实例见实例包 下载测试如果提示错误 请重新对自定义类库进行引用 本 文只是通过一个简单的实例演示了 如何通过 VB 封装一般的 VBA 中代码 因为该代码 中并未涉及到 ACCESS 应用程序对象 所以在 VB 中没有对 ACCESS 对象类库进行引用 另外实 例中只是简单演示了 如何手动实现对 DLL 的注册引用 在后续文章中我将就如何实现 DLL 与 ACCESS 应用程序对 接及 DLL 的自动注册及引用结合实例进行讲解 VBVB 封装封装 DLLDLL 实例讲解 二讲 实例讲解 二讲 上文中我们已经就 DLLDLL 的基本概念 以及如何将 VBAVBA 代码封装为 DLLDLL 如何引用该生成的 DLLDLL 动态链接库 进行了初步的讲解 我想大家对于 VBVB 封装 DLLDLL 应该有了一个初步的了解 下面主要就 DLL 如何实现对 ACCESSACCESS 对象进行封装方法进行探讨 一 如何在 VBVB 中实现对 ACCESSACCESS 对象编程 一 在 VBVB 中引用 ACCESSACCESS 对象类库 我们要通过编译 DLLACCESSDLLACCESS 对象的封装 首先必须在对象的封装 首先必须在 VBVB 中引用中引用 ACCESSACCESS 对象类库 这样我对象类库 这样我 们就可以在们就可以在 VBVB 中 实现对中 实现对 ACCESSACCESS 应用程序中的对象进行编程 应用程序中的对象进行编程 来实现对 打开 VBVB 编辑窗口 点菜单 工程 引用 打开 引用对话框 点选 MicrosoftMicrosoft AccessAccess 11 011 0 ObjectObject LibraryLibrary 完成对当前版本 ACCESSACCESS 应用程序对象的引用 实例演示版本 为 ACCESSACCESS 20032003 M对 ACCESS 对象库的引用很关键 否则我们无法实现对 ACCESS 对象的编程 二 了解 ACCESSACCESS 对象模型 在 VB 中要对 ACCESSACCESS 对象进行编程 还必需对 ACCESSACCESS 所提供的各项对象有一定了解 因 为 VB 就是通过 ACCESSACCESS 对象的方法与属性 来完成各项操作与设置 下图为 ACCESSACCESS 20032003 的对 象部分模型图例 P P上图为 ACCESS 2003 对象模型 因为篇幅的问题 文中只显示模型中部分对象 要了解全部对象模型 请大家参阅帮助 三 VBVB 编程中 ACCESSACCESS VBAVBA 与 VBVB 对象表述区别 1 ACCESSACCESS VBAVBA 与 VBVB 的顶层对象都为 ApplicationApplication 但在编程中 ACCESSACCESS VBAVBA 顶层对象表 述为 ApplicationApplication 而在 VBVB 编程中顶层对象用简写 AppApp 表述 到 VB NETVB NET 又改回了 ApplicationApplication 例程 在 VBVB 编程中获得 VBVB 及 ACCESSACCESS VBAVBA 获取当前路径实例 在 VB 中获得当前路径 App Path 在 VB 中获得 ACCESS 的当前路径 Application CurrentProject Path P P在 office 各应用程序之间调用各组件时 通常在对象前加上库名 如 Access Application 来表述 但因为 VB 与 ACCESS 顶层对象原本表述就存在区别 在 VB 中可 以直接用 Application 表述 ACCESS 应用程序对象 并不会产生冲突的问题 2 ACCESSACCESS VBAVBA 和 VBVB 中部分预定义类对象 如 窗体 控件等 表述基本相同 以 标签 控件 为例 VBVB 与 ACCESSACCESS VBAVBA 均为 LabelLabel 在 VBVB 编程中为了与 ACCESSACCESS 预定义类对象加以区别 ACCESSACCESS 标签对象通常用 ACCESS LabelACCESS Label 表述 例程 在 VBVB 编程中定义 VBVB 及 ACCESSACCESS 标签控件对象实例 在 VB 中定义 VB 标签对象 Dim m Label As Label 在 VB 中定义 ACCESS 标签对象 Dim m Label As Access Label M在进行 DLL 编程时 特别需注意对象表述区别的问题 否则无法编译或是编译后在 ACCESS 调用中报错 四 VBVB 编程中关于 ACCESSACCESS VBAVBA 专属常量 ACCESSACCESS VBAVBA 专属常量以 acac 开头 如 控件类 AcControlTypeAcControlType 中的文本控件常量为 acTextBoxacTextBox 这些常量不一定能被 VBVB 所识别 解决办法通常不使用 常量名 而直接使用 常量值 或以输入参数方式传递的方法来解决 例程 实现隐藏所有文本控件 acTextBoxacTextBox 常量值为 109109 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 P 你可以通过帮助查阅 ACCESS 专属常量值 也可以在 ACCESS VBA 中通过程序方式获取 如 在立即窗口输入 acTextBox 回车 就可以 acTextBox 常量值为 109 二 DLLDLL 封装 ACCESSACCESS 对象实例演示 一 ACCESSACCESS 的 MDBMDB 实例 MDBMDB 实例演示获得 ACCESSACCESS 版本信息 并在标签 Label0Label0 中显示 见下图 具体参看实例 中 frmVer6frmVer6 窗体中的代码 及类模块 ClsVeresionClsVeresion 中代码 P Pmdb 实例中 frmVer1 frmVer6 各窗体中具体演示了 代码按 DLL 封装需要整理的思路 例程 frmVer6frmVer6 窗体加载事件代码 Private Sub Form Load 申明自定义类的实例 Dim m Ver As New ClsVeresion 调用自定义类的 objAddItem 方法 m Ver objAddItem Label0 End Sub 例程 ClsVeresionClsVeresion 类模块代码 程序功能 定义类接口 将版本信息输出并在标签中显示 Public Sub objAddItem m 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 8 0 AppVersion Access 97 Case 9 0 AppVersion Access 2000 Case 10 0 AppVersion Access 2002 Case 11 0 AppVersion Access 2003 Case 12 0 AppVersion Access 2007 End Select End Function 二 DLLDLL 的封装 ACCESSACCESS 对象实现 1 打开 VB6 0 编辑器 点菜单 新建工程 在 新建工程 对话框中 点选 ActiveXActiveX DLLDLL 点 确定 2 修改工程名及类名 实例中我定义的工程名 GetAccVerGetAccVer 类名 ClsAccVerClsAccVer 修 改完成以后点选菜单 保存 工程 见下图 P P工程名就是我们后面将引用的 DLL 库名 类模块名为代码中我们申明的类名 3 点菜单 工程 引用 打开 引用对话框 点选 MicrosoftMicrosoft AccessAccess 11 011 0 ObjectObject LibraryLibrary 完成对当前版本 ACCESSACCESS 应用程序对象的引用 4 将 MDBMDB 中类模块 ClsVeresionClsVeresion 代码复制到 VBVB 中 ClsAccVerClsAccVer 类模块中 按前面我们所述 的 VB 中实现 ACCESS 对象编程的注意要点略做修改 见下图划红线部分 P P1 因为 VB 与 ACCESS VBA 中标签类对象都为 Label 因此加上库名 Access Label 加以区别 2 因为 VB 与 ACCESS VBA 顶层应用程序对象 表述原本就有区别 所以无需特别区 分 例程 ClsAccVerClsAccVer 类模块代码 程序功能 定义 DLL 接口 将版本信息输出并在标签实例中显示 Public Sub objAddItem m 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 8 0 AppVersion Access 97 Case 9 0 AppVersion Access 2000 Case 10 0 AppVersion Access 2002 Case 11 0 AppVersion Access 2003 Case 12 0 AppVersion Access 2007 End Select End Function 4 编译 DLLDLL 点菜单 文件 GetAccVer dllGetAccVer dll 动态链接库 封装 DLL 就完成了 你现在可以在 ACCESSACCESS 中引用该 DLLDLL 测试一下看看成果了 参看实例中 frmVer7frmVer7 窗体 如 实例引用报错 请重新引用 GetAccVer dllGetAccVer dll 即可 因为受本人认知及文字水平所限 不免有错漏之处 还请大家斧正 本文的 WordWord 文 稿 VBVB 源码 MDBMDB 实例均在 实例包 中 在后文中我们主要就动态链接库引用的方法和技巧 结合实例进行探讨 VBVB 封装封装 DLLDLL 实例讲解 三讲 实例讲解 三讲 一 手动注册及引用一 手动注册及引用 一 手动注册及引用方法 参看实例 手动引用 一 手动注册及引用方法 参看实例 手动引用 mdb mdb 进入 VBAVBA 编辑窗口 点菜单 工具 引用 打开 引用 对话框 点 浏览 按钮 打开 添加引用 对话框 点选要引用的 DLLDLL 测试实例为 ClsFindStringClsFindString dlldll 点 打开 点 确定 我们完成动态链接库的手动注册及引用 二 手动注册及引用方法不足及问题 二 手动注册及引用方法不足及问题 手动注册引用优点是不言而喻的 方便简捷 易于操作 但在实际运用中 当我们在其他 电脑上发布应用程序 或运行我们测试好的应用程序时 却会出现错误提示 程序无法正常运 行 错误 一 错误 一 找不到工程或库 见下图 错误的主要原因 DLL 在当前运行的电脑系统中没有注册信息 而且引用不正确 错误 二 错误 二 引用的动态链接库 DLL 丢失 见下图 进入到 VBA 编辑窗口 点菜单 工具 引用 打开 引用 对话框 我们会看到之 前引用的 DLL 动态链接库丢失 错误的主要原因 系统无法找到原路径引用 DLL 错误 三 错误 三 自动化错误 见下图 错误的主要原因 我们在发布应用程序的电脑或系统中 虽然重新完成 DLL 手动注册和引 用 但如果 DLL 路径再次改变 运行程序时就会出现 自动化错误 提示 错误 四 错误 四 ActiveX 部件不能创建对象 见下图 错误的主要原因 应用程序已正常引用 DLL 动态链接库 但其册注信息丢失或者没有正常 注册 就会出现以下问题 三 解决上述错误方法 三 解决上述错误方法 1 解决错误方法 当然是重新进行 DLL 的手动注册及引用 具体步骤参下图 但这只是 治标不治本的办法 不利于对外发布我们的应用程序 最好的办法还是通过 VBA 自动完成 DLL 的注册及引用 二 自动注册及引用方法二 自动注册及引用方法 在探讨如何实现 DLLDLL 自动注册及引用之前 我们必须清楚一点 那就是 DLL 的注册与引用 并不是同一事件或行为的两种不同表述 而是两种不同的动作 DLLDLL 注册注册 是指将 DLL 的相关信息 如 DLL 唯一识标号 GUIDGUID 版本号 VersionVersion 及路径 PathPath 信息写入注册表中 以供系统对 DLL 进行识别调用 我们通过 VB 编译生成 DLL 时 VB 一般会自动完成对该 DLL 的注册 但如果要在其它电脑 上运行程序时 我们就必须重新对该 DLL 进行注册 DLLDLL 引用引用 是指将 DLL 类库对象集成到代码编辑环境中 以便编程时调用类库中的对象 属性及方法 我们通过手动方式完成 DLL 的引用时 系统会自动完成对该 DLL 的注册 所以我们无需另 行对 DLL 进行注册 但如果我们在其它电脑上运行程序时 还会出现我们在之前章节中所述的 错误 一 一 DLLDLL 自动注册方法自动注册方法 我们可以通过 Regsvr32 exeRegsvr32 exe 来进行 DLL 注册或反注册 具体的语法及参数 语法 语法 Regsvr32Regsvr32 u u n n i cmdline i cmdline dllnamedllname 说明 说明 其中 dllname 为 DLL 文件名 建议在发布时将 DLL 复制到 system 文件夹下 参数 参数 参数说明 u u 反注册 s s 指定 regsvr32 安静运行 且不显示任何消息框 n n 指定不调用 DllRegisterServer 此选项必须与 i 共同使用 i i c cm md dl li in ne e 调用 DllInstall 将它传递到可选的 cmdline 在与 u 共同使用时 它调用 dll 卸载 d dl ll ln na am me e 指定要注册的 dll 文件名 1 1 1 1 示示例例通通过过 S Sh he el ll l 运运行行 R Re eg gs sv vr r3 32 2 程程序序完完成成 D DL LL L 注注册册 Shell Regsvr32 S Chr 34 CurrentProject Path ClsFindString dll Chr 34 ShellShell 函数函数 用以运行 Regsver32 程序 Regsver32Regsver32 注册程序 S S 注册程序参数 书写时记得参数前后必须留空 Chr 34 Chr 34 Chr 函数 获指定代码字符 Chr 34 为引号 CurrentProject PathCurrentProject Path DLL 当前路径 ClsFindString dllClsFindString dll 演示实例 DLL 名 1 1 2 2 示示例例通通过过 S Sh he el ll l 运运行行 R Re eg gs sv vr r3 32 2 程程序序反反注注册册 Shell Regsvr32 U S Chr 34 CurrentProject Path ClsFindString dll Chr 34 我 们可以将注册语句放在窗体的加载事件 自动完成 DLL 的注册 具体可以参看实例 但如果我们有多个 DLL 需要批量注册时 可以考虑通过软件打包发布工具来 完成 DLL 的注册工 作 也可以事先编写 BAT 文件 在打包发布时将该 BAT 文件一并打包发布 安装时运行该 BAT 文件 来完成 N 个 DLL 的批量注册 在此 就不多着笔墨 大家可以参看实例包中的 BAT 文件实 例 二 二 DLLDLL 自动引用方法自动引用方法 2 2 1 1 通通过过 R Re ef fe er re en nc ce es s 对对象象的的 A Ad dd dF Fr ro om mF Fi il le e 方方法法实实现现自自动动引引用用 Dim ref As Reference 申明引用类对象 On Error Resume Next 避免因重复引用造成的错误提示 实例化引用对象 完成 DLL 的引用 Set ref References AddFromFile CurrentProject Path ClsFindString dll 为了避免因重复引用出现的错误 我们可以如上代码中加入 Error 语句 我们还可以在应 用程序退出时 通过对 ReferencesReferences 对象的 RemoveRemove 方法释放 DLL 或反引用 Dim ref As Reference 申明引用类对象 实例化反引用对象 Set ref References ClsFindString 移除引用指定类库 References Remove ref 说明 说明 根据本人实践 我个人倾向于使用 Error 语句 因为如果应用程序非正常退出 引 用对象没有反引用成功 启动时就难免出现重复引用的错误问题 2 2 2 2 通通过过 D DL LL L

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论