|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑 9 x: J: i7 s/ ?, y8 r8 r
( H& p8 A" R6 |$ L; jVB封装DLL实例讲解(一)
u( H# `+ K6 a# l+ ^ n
5 a% f9 |3 s7 C9 M- M
. f! b. ~4 d% h: `/ S7 j% }" E9 r% T1 t一、 DLL基本概念+ L$ ]3 V0 F$ c: `
(一)概念; X8 Y, d" B5 l+ H* D" _. W
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。8 Q- e4 M' m4 z+ `& g8 p' R/ m
(二)主要优点:5 N+ h" E: ]) u, l, d. G, L: c1 P
1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;& {0 g: c% J N) W2 N# M1 |
2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;5 c" r) A5 C2 q2 l
3、从ACCESS角度而言,还可以更好的确保核心代码的安全。3 j) i& w3 v2 }
: d! v- H; x8 J: i |8 t
二、 用VB封装VBA代码,构建自定义的DLL动态链接库, H) y# D+ T+ k# c
(一)ACCESS中实例代码
3 E$ x: J( p/ _5 c下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。% ^4 T7 J. k1 o/ j6 {, l
我将就这个实例演示如何将该实例VBA代码封装成为DLL。
) ]; G0 }: S. |$ C$ j0 b 3 @" e8 P8 Y/ R9 K7 U
4 _& g: \% ]3 [1 E
" \- b1 X) A4 I9 W- [
 按钮单击事件代码如下:
v# W" t* i6 T% `3 Q) i( X0 h9 yPrivate Sub CmdFindnumber_Click()2 s9 D, P$ @/ u; Z
Dim strM As String '初始字符串8 ^3 x% g* C" D; t( ? c
Dim strOut As String '输出字符串变量
: S; {7 Q7 u' \. p Dim I) K- n4 T" ?9 p$ g$ l
- c f% V0 k% T" n0 D/ Q# }
strM = Me.Text1
% Y3 w" [8 N5 |5 w# T/ Z'从第一个字符向最后一个字符循环,以提取每个字符
* @& X5 ]& K5 S+ V& M7 s q For I = 1 To Len(strM)
1 @# [) x4 ^$ N4 ~ '判断是否为0到9字符,是则赋值输出
7 o- j& F" H3 m/ X If Mid(strM, I, 1) Like "[0-9]" Then. e; R; I% F9 R# Z8 l) T, Y2 E% T
strOut = strOut & Mid(strM, I, 1)
: C. U3 x d7 }( T, ?$ h End If5 B& e1 C7 x- P6 W6 H9 Z2 z2 L8 ^
Next I
' P5 h0 U3 @6 V/ Q: Q" I '用MsgBox函数进行输出测试
K5 q! |$ W9 o3 D/ s( f% B MsgBox strOut/ A, k: q; _/ m! ~: M6 s
End Sub
6 Q/ d) ^* h: Q  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)' h* S7 M, A0 n( f3 ^3 Y
( Z) Z/ @9 e m& p& h: c7 ?(二)VB封装实例中VBA代码, }+ u; ?) k8 j! W6 n d
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口! D9 X: a8 `: s/ l1 p+ A( [( t9 o
! ~5 K! ^3 V/ ~# J
% L6 i& w8 N: e8 y; Y ^* G. c% H* N
- a" o: J I' M% {' {# h& k/ m4 z! ^/ L
7 Y/ E. \% U* x. ^- I" B9 L步骤二:修改工程名,这即生成的DLL库名1 W; b& f7 _# c
! R: s- s8 N4 `; o/ T6 |+ M* \9 D. L) o1 i- K
4 a; r: L: R6 U8 o
9 M. T7 W$ w9 i8 k* i7 V' I
/ R1 ~: e" c1 o g( R
步骤三:修改类名
+ F# d1 \5 ~. @( b2 K9 U" U4 T& s& Y1 M! f& z
, I% ~" e/ j. p+ y/ I: d* T% l9 Q: s3 C3 a) b4 f* V
- M! `. m9 `: Y1 |; W, b2 _
步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口# o: B5 N- w0 E
* {$ a ` \$ g( b* ~
, j; ?0 f0 K4 @1 d( T, c( g( s+ y U7 d$ F1 j: F
代码如下
5 U# z7 b% v& U* R S'将这前的ACCESS代码改成一个公用函数+ z. p5 P. w, ?( b1 V. T/ E6 K" P
'输入:strPutString 字符串变量,需分离数字的字符串8 m N. ~8 t. i* x) Q. P
'输出: fFindNumber字符串变量,得到的数字字符
3 T$ k- |( B6 | r1 S& hPublic Function fFindNumber(strPutString As String) As String
3 T/ h& A1 E& C5 }; o+ K( p$ f' K Dim strOut As String '输出字符串变量
0 m/ [8 z/ ]; y% Y Dim I
5 _ n7 v4 O* s, u
: M+ T1 t, ^0 N '从第一个字符向最后一个字符循环,以提取每个字符
3 f( I5 P! M5 M, H For I = 1 To Len(strPutString)
* }" ~: a0 T6 Z+ z. p$ z5 K '判断是否为0到9字符,是则赋值输出
4 Y+ X7 c5 l" e0 L If Mid(strPutString, I, 1) Like "[0-9]" Then6 X6 |& `$ G# b8 w, w
strOut = strOut & Mid(strPutString, I, 1)
. Y* H$ v+ e2 i: ?8 ~! ] End If
7 n$ G$ n: v- r* y) X% n. b- k Next I0 w7 [& F- ]4 z4 S& P4 d/ y
'数字输出
$ d+ k: A, @" r& k1 o fFindNumber = strOut
4 |) o0 U% D( [End Function
3 s" y3 a/ T/ y+ K3 k( C; r; y: V
( U1 ?6 j q4 {* [- J2 \步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。, \& J5 y8 p$ M& k8 S5 e( Y. J
) V- a' Q5 F0 J: `' B
三、 在mdb中调用自定义DLL动态链接库( A7 A/ m+ S; B6 F+ V4 d4 w
8 O1 j' c7 S6 ^4 K+ q5 x1 k
(一)新建数据库及窗体
! }- f# F6 U8 B9 I9 v新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)0 i! j& f! q0 @- u) G% T
; x" A) ^7 U0 Z$ B
' k7 }6 _) S0 U(二)引用【我的动态库.dll】库
6 h/ \5 \- |. c4 ~: Q. Y, C按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
1 W5 o, Z; }3 j7 ^3 f' r9 A6 x0 b
, G7 ^1 {- L! x0 \* X/ K% v
. p i/ H# {- n# ^$ D o
1 Z h C8 D) n; Q2 D: j6 p* B8 u9 A1 D- r" O; Y. F
' i2 D5 Z) y' c: q5 b$ P6 G1 Z/ U! o/ e1 R2 J% f: j: b
0 c: O. ]4 n& a! q; f. N/ [
5 o; a3 q6 I$ I3 g8 {
; D3 @$ D0 a( q1 Q; \! @
9 @: ]$ |8 U+ o0 B(三)在【CmdFindNum】按钮单击事件中加入如下代码。" T: d5 m& X! r5 f7 V. z: R5 u
Private Sub CmdFindNum_Click()6 q5 p1 _ N. h8 T3 i" F
'申明自定义类
# |) e7 M. ?% o* l" {+ | Dim MyFindNum As 提取数字
& c, Q; c. N# V& B: Q. H/ z Dim strOut As String
4 k* C5 b+ K! ~ 6 x: k7 b7 T8 E4 }$ L. n e
'实例化"提取数字类"对象* d3 i" H6 j/ f
Set MyFindNum = New 提取数字/ p; W3 c( Y* n6 W; \
'将函数输出结果赋值给自定义字符串变量% b9 C" X/ e3 v S
strOut = MyFindNum.fFindNumber(Text0)2 X @ T3 ]+ p; W) q
( k/ P9 L, ]0 M( Q& }7 ?" E '在消息框中显示
& }0 z/ X# s! i% t! U! A9 J MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"+ U" @1 M: `/ i+ c
End Sub
$ }! \8 b5 B$ ?7 t5 Z2 E; T$ c
; W; `% D% Q! k3 ?点击保存后,你就可以运行一下窗体测试你的成果了* Z! [% c% R; U' n" A" N5 U3 v
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
; f1 B+ X5 V, V& f- u: k$ e$ s7 B" ~2 s" u% G i. I) N
. f3 z) W9 c4 t: y5 T. V |
|