|
发表于 2014-5-25 11:37:42
|
显示全部楼层
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
& c: g4 Q: k+ ^5 f& R% Z- V- l5 F' r; _
VB封装DLL实例讲解(一)
1 V3 { V Y5 `, W6 w# }/ I$ a
' [6 X; o- {5 j: p& n3 ~9 G, M9 r+ @4 c# A1 a) O! M5 x& w
一、 DLL基本概念
6 Z6 L1 [) z' j) |4 h(一)概念
$ `% i3 a* s/ j! }DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。
m" |: S% o# l(二)主要优点:
! \* j1 [+ N) _6 M# H1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
+ W9 Y: o% o" p3 i0 r2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
j; E, }7 Q8 O" ?3、从ACCESS角度而言,还可以更好的确保核心代码的安全。; g1 J6 q8 z" t: w! w. D
2 k# X# V2 D7 U I
二、 用VB封装VBA代码,构建自定义的DLL动态链接库
" u) ~( Q. x+ S7 C; P) d(一)ACCESS中实例代码
* D4 C4 z! a0 n2 B& a$ w- o下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。- ^! g3 n4 ? D/ [
我将就这个实例演示如何将该实例VBA代码封装成为DLL。
' t9 l/ L: ^, @7 L" c, g& i1 O0 [ " \) F6 N. v6 N/ e X0 k3 M, _
( \5 V R% d" Q4 H/ `. I
+ R, y8 r3 ~6 ?0 d7 ~ A* n! | 按钮单击事件代码如下:* { t6 p2 Y T; e/ e1 m* r6 x, k
Private Sub CmdFindnumber_Click()3 v( F) E: Y" M9 s7 _2 I, i9 K
Dim strM As String '初始字符串
0 w! q7 N1 ^. S' d' Y Dim strOut As String '输出字符串变量
1 h ]4 g. w0 q Dim I
' X$ f0 t+ v" t' w+ s6 k9 S ( x% O, r) t7 W/ S+ t; S
strM = Me.Text1
; s% o- T+ p1 V- a# N; m'从第一个字符向最后一个字符循环,以提取每个字符9 [, X$ [' B M n
For I = 1 To Len(strM)
$ f/ v9 g4 } J" ^4 Y& k '判断是否为0到9字符,是则赋值输出4 t. v/ I2 U& V6 }
If Mid(strM, I, 1) Like "[0-9]" Then
% N4 G, [! n& O- y$ I! q2 b% u strOut = strOut & Mid(strM, I, 1)1 f5 J# V. p; k0 O
End If. t8 {. L8 ?! K! }/ n
Next I
; T$ L3 o' P' Z( j5 Z '用MsgBox函数进行输出测试
. U4 _, f$ c; k8 c MsgBox strOut6 C' B7 s; Q$ ]( d
End Sub
% T# m" ^ T& k; }6 L  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)6 I# G% i! `6 H. v) S0 M6 y) ?3 _4 {
( c9 j8 M4 i3 |: L5 P R9 Q(二)VB封装实例中VBA代码
( E5 a" B$ d, d& r0 B7 g步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
) d6 q/ P8 T) _
; ~$ P- a& p. U5 g! s- H5 c: [! n/ c* R! Q* ^, |# W0 w
% y" L* _' ?8 ^( b% P8 ?5 I6 f9 k/ y$ b- `) }5 @
$ q5 O1 Y; L3 S步骤二:修改工程名,这即生成的DLL库名
) d! w5 e3 G" q" d J
0 [/ ~7 k+ T# x2 ?5 G5 k7 p- W$ _0 c- x) L# [& a8 ^/ \; u% @" X
2 b1 R1 @' `: V1 ~& E
s5 i& r* @3 u- I
& T: p2 }' I+ N9 J7 _
步骤三:修改类名" O; a \- }' ~( o J
, [# @3 B5 J: a# D9 S( [2 b0 \" K6 \1 I w1 k! ~
$ Q4 ^0 ^1 P2 R: D( W8 r9 o+ O! z5 ]6 z0 L
步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
: ?/ t: |4 k; i0 p* c
1 H, ^9 \4 t% Z. |: c9 Z) k, `
( e. s( d' P2 E' N
$ r, m) s/ `3 H- V9 K( Q9 I& n) w代码如下2 ?+ _& |9 \" i( ?' e+ ]9 u
'将这前的ACCESS代码改成一个公用函数
6 [' z( r3 g/ h* D v+ M2 g! Q- M5 `; k'输入:strPutString 字符串变量,需分离数字的字符串& z! f2 U; |( n$ n, f5 i$ a1 ]0 p
'输出: fFindNumber字符串变量,得到的数字字符
' b4 A/ {0 a8 l8 | cPublic Function fFindNumber(strPutString As String) As String' L8 O+ y6 V' L3 H- b0 z7 c1 j" o
Dim strOut As String '输出字符串变量
1 Y% E9 w+ O3 Z& M4 b; H m5 z- { Dim I
2 c* r0 m: \. q" d# F0 ?& L+ x- T ! \ b' k$ b- E* z9 L0 Q9 s* i
'从第一个字符向最后一个字符循环,以提取每个字符. {* x7 b6 y6 W# x
For I = 1 To Len(strPutString)
& [" ~: }) W( y$ m- u0 E8 y4 l3 S6 }) t '判断是否为0到9字符,是则赋值输出
1 B+ i9 W$ _% k. R; V5 N( O4 ~% S If Mid(strPutString, I, 1) Like "[0-9]" Then
9 }2 s; \, ^5 m& n& z: d strOut = strOut & Mid(strPutString, I, 1)3 n4 c4 u4 d9 p# t1 f4 }
End If6 d6 R& e$ T" w6 l! w! y) [2 o
Next I. Z6 F. r. t& |0 t6 K
'数字输出& S' L# O4 |, }* i0 h2 L. I
fFindNumber = strOut
; l0 ?1 q+ j. M# P3 I' C+ ZEnd Function8 m4 ~* J3 g) {4 ?3 V
3 R, u; j) V$ d
步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。) ^; `8 I Z9 ^
, l: y6 w5 w: [1 e/ u O3 y. Z
三、 在mdb中调用自定义DLL动态链接库) h% A9 k) V3 @3 `% k
" P0 Z& m/ m2 }0 U4 W: m: l: |
(一)新建数据库及窗体1 p5 f9 U/ Q8 `1 m: t
新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
/ T4 o1 F5 \- k+ O* Q
* i9 R. L2 _: v6 R# l6 P& t) z
/ [% b1 u) p" I4 i0 `(二)引用【我的动态库.dll】库: D; ?( K8 U1 u! g& P
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
: D7 y& k! a9 O# d$ J, t6 [' d3 [ ]. w
' [5 K1 J0 e X- z- W G }# a
, r$ ]. a$ a( h% W
# t/ a2 p3 P3 e: W+ Z7 |0 n# a* {& ~ Q. m& ]9 I
- m. i4 V' P5 f: O; m
2 @3 c7 O. |) A8 `% G6 ^3 q" X6 W
, m4 o, j. H' U$ f/ n1 {
$ O, F2 n6 J1 ]5 v0 p* |4 F5 Q(三)在【CmdFindNum】按钮单击事件中加入如下代码。
# j+ \, ]% J+ }7 X. ]( g% D+ vPrivate Sub CmdFindNum_Click(), `3 A2 h, g/ k2 r/ j; `
'申明自定义类
f7 V# \6 N9 d" y2 j3 [ Dim MyFindNum As 提取数字
" D4 _( n; Y% D5 \ Dim strOut As String
1 `' Z6 x' C+ S9 T3 C X# g3 G
+ K1 U6 K4 @- N- A/ S( H '实例化"提取数字类"对象9 X e7 ?) X1 Y$ A9 e
Set MyFindNum = New 提取数字& n9 v; \, \9 m
'将函数输出结果赋值给自定义字符串变量
, Q7 ]& ^- i4 {: q/ x strOut = MyFindNum.fFindNumber(Text0)
* n- a. I9 ]# H# s
! r; S* Y3 _1 `; x7 B '在消息框中显示
' g$ h% {' q3 u1 o3 S, ~' u MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"# w( ~! e, t) E: q1 n0 _
End Sub; z* H" a: ^ @! s9 |
7 @( k3 M4 s. v) g8 u" R' q点击保存后,你就可以运行一下窗体测试你的成果了. a4 K n5 F8 z n4 X2 v' p
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。! t+ u# @; d1 P5 g5 c
. @, B/ e4 t: x
/ S" I+ n6 h' c0 s4 Z3 F
|
|