|
|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑 / J/ ]7 l- s2 Q! V4 {! D
& V4 y6 U+ m9 v- @# S' _
VB封装DLL实例讲解(一)8 P# m% [! i' Q
/ l* `+ O* h6 r9 c2 e) v! w9 z5 N' P% u3 C% q; z6 }- k5 u: @
一、 DLL基本概念
6 W& @9 s* C& I5 o- F* i(一)概念
( @7 |, y' a* d" ]& T4 G' X' ?DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。
) k$ N. p3 v( P }1 h(二)主要优点:: H: v- t7 O3 k8 D
1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
* R8 A Z9 J" o: Y2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;5 a& c* K, `! Y! w4 H
3、从ACCESS角度而言,还可以更好的确保核心代码的安全。# M$ X7 U! Z6 p4 o4 C
, N* i8 a4 d4 m$ z( ~0 I. t0 U' f
二、 用VB封装VBA代码,构建自定义的DLL动态链接库
# a+ j5 z& J( Y+ @+ @0 s2 u8 \$ E(一)ACCESS中实例代码
7 Z+ u7 E4 _* A4 E- n下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。( B% |6 H( z: N1 R4 i L# B
我将就这个实例演示如何将该实例VBA代码封装成为DLL。, B& A, z) N9 a) j
1 M5 L! D( a5 Q6 M* y
0 V$ }/ @1 m9 V" g# w1 u4 }# f
0 e$ z9 l" Q/ Y2 J7 p o 按钮单击事件代码如下:
, l0 y' L4 D- v- ePrivate Sub CmdFindnumber_Click()8 p$ j6 l) [+ ?; y
Dim strM As String '初始字符串
' }/ a$ q3 R& h8 c5 z, q0 o' A! H Dim strOut As String '输出字符串变量 V4 w6 m3 S" N6 o7 f
Dim I
8 J) v5 J5 D8 W# J7 b+ Y , ?9 {6 [) z0 L# Z' w7 x
strM = Me.Text1
1 C- F, g9 r2 y2 J'从第一个字符向最后一个字符循环,以提取每个字符
. I3 }9 G$ w2 M2 {9 V# h For I = 1 To Len(strM). L1 c; y3 d. o" N) |' C0 k
'判断是否为0到9字符,是则赋值输出
" |( Q* \; A$ M, z9 P If Mid(strM, I, 1) Like "[0-9]" Then* P* Q; h0 i& Q) v# O- V
strOut = strOut & Mid(strM, I, 1); z3 B: C6 q; ], ~
End If! m7 D5 a, A; e# Z {
Next I* w. c, R- J( a1 ~! `
'用MsgBox函数进行输出测试
- I- e; p* h! o( Y+ i3 m" x MsgBox strOut
7 @0 g9 ?% m# X! sEnd Sub5 D0 `. F. |! [3 e' v
 以上代码还不能直接用于封装,须将其修改成为公用函数(过程)
3 q5 U/ q, X- T: D! w; e- K4 |7 R: B( G9 N: |% H
(二)VB封装实例中VBA代码! T7 ?, U$ }! Y2 f& ^9 E; N
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口. o. O# m7 \ r. G; L
9 P& t8 Z0 i) j5 T
3 x3 ?! _- Y! B) {0 g) F
8 ]0 _* ^/ B1 j6 g. V! y: e" H* b J5 o* \; H: \
$ {( F0 T( G+ S/ v, N2 | t步骤二:修改工程名,这即生成的DLL库名
% ~" b8 @5 m5 [
; X! V* y, N. b) d q7 d: ?% d
5 m, I' M* V- S
m8 J Y0 [+ g* x6 j* y; ^: x) C# S1 l
6 R/ J0 F! G7 f2 U步骤三:修改类名( p: U5 L, F9 ?& K
! v- p" t& ~1 p0 x* u; @8 F) u$ @6 p6 h
8 u! Q3 ~- ?, R# [
2 K" |, L r' k, E' a0 b* b- ~8 K步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
& @+ q1 o$ `; s5 l6 W g( F2 P5 n1 f' @ S
7 A9 p/ n; ]; y8 |; S
# m9 D' c- V1 [8 S4 c+ z# e/ V代码如下* x; q! Z1 Q" u# b3 e
'将这前的ACCESS代码改成一个公用函数
6 j- _/ P$ ]8 m+ A'输入:strPutString 字符串变量,需分离数字的字符串
5 A; ~5 b- b3 @" r'输出: fFindNumber字符串变量,得到的数字字符
/ V- y1 g! @+ f' |% c) vPublic Function fFindNumber(strPutString As String) As String
6 N6 x' i) L- g* D! v Dim strOut As String '输出字符串变量
8 Y* ^! z- V: r# s9 W+ O+ G0 W Dim I2 `" W8 D" ^' y0 q$ Y# T" c
A( W: Q$ r8 N( j '从第一个字符向最后一个字符循环,以提取每个字符% V1 D% Z( j( H0 o7 p
For I = 1 To Len(strPutString), x7 O0 z* y! }9 v
'判断是否为0到9字符,是则赋值输出
! Q/ f$ A+ A) a6 x1 j! u If Mid(strPutString, I, 1) Like "[0-9]" Then
6 T6 C, V) Z! Z# X. _) r strOut = strOut & Mid(strPutString, I, 1)
* U% a3 `* ?) q End If
7 U" l. E9 P2 r Next I
( ?/ L, w% T6 i' J6 i: y0 w '数字输出
" a# S1 F5 [+ Q3 D fFindNumber = strOut7 b) U: w3 d9 `4 c: ~8 A' _1 Y2 X3 j' B
End Function
7 R1 {7 e0 @4 z: z5 C5 c. G6 E. _
步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。
9 Q: h7 P3 y4 h8 V3 P
% o" O' e7 m2 f n1 n三、 在mdb中调用自定义DLL动态链接库
) ~) B* ?$ l, h) s
, U2 G$ u0 n% j& g2 T$ O(一)新建数据库及窗体
4 E! o. z7 Y0 g4 U新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)# |' @) r; K9 m X" D+ W3 C, y
/ z5 g3 E+ F. K3 D8 k
8 I' m9 _: v2 f9 t9 c# U' Z9 i(二)引用【我的动态库.dll】库
+ t1 k1 l' q/ w按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
: W( [; Q# N, U& I+ @: I1 Q6 j9 y; o8 Y7 p
; ]4 u6 r2 ~8 S, E* x# ^
a7 m9 q& C/ k. w$ E
) }% p( c! J- ?
! t5 X1 {' `" L' U% W1 H
% E" u5 I# B: Q6 T/ k
6 ^2 e" }; {1 \! w% [1 D, G3 P# M% \, X! M- }1 y
1 @* X0 s, \9 A' \% ?* z# ? m( F$ S7 ]
(三)在【CmdFindNum】按钮单击事件中加入如下代码。
( o. w! q7 q' b# p# }0 I% SPrivate Sub CmdFindNum_Click()* [2 ^) ] q; q* A3 _! O# R
'申明自定义类
- F. W" R( x N Dim MyFindNum As 提取数字
6 @! P# P2 b+ A& m2 Y Dim strOut As String$ E- @# [& F L y9 o# D$ I
7 j2 a% z1 b6 P6 F$ h E
'实例化"提取数字类"对象; {) N/ H( B7 r7 c# B1 b
Set MyFindNum = New 提取数字
8 r2 d0 e. _) Z '将函数输出结果赋值给自定义字符串变量
0 K' C0 E4 x" a# T" U2 y strOut = MyFindNum.fFindNumber(Text0)
4 ?" R; v/ V2 O1 L- u- i. _7 y
0 I" V1 m9 S7 L( ]! n '在消息框中显示9 \9 z$ C, n6 \, K5 I& {1 z' {
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
* U5 ~* l1 v: X) T" s; l+ IEnd Sub
- ~/ S8 ^+ k- _2 R" _9 W2 F3 G) h6 D9 i( s/ q! S1 m
点击保存后,你就可以运行一下窗体测试你的成果了9 g- C5 w$ Q7 m& D9 r* g
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。8 L2 J' M' x9 O; q% u
7 F) \" A8 V5 _* r& [3 B+ Q8 C( O
1 U& r3 W) j# G: @% F* R6 z( i, z |
|