|
发表于 2014-5-25 11:37:42
|
显示全部楼层
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
) B7 J) l& U& i' R* s: y# L4 B% Q9 g& ~' X
VB封装DLL实例讲解(一)* t: a$ J2 w- o# G6 D) t/ Q
3 W1 b8 f3 Q, _( V0 `& ^+ p) E
3 K. F, `8 I8 h) P+ A8 F一、 DLL基本概念8 [ a( b7 U# R# _* b8 y" o
(一)概念, A) d! ?- b4 k" h5 @/ C
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。+ R* t" P. L# t, M
(二)主要优点:' @) ^& r, i8 }) F" d0 q
1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
! j2 ^% z: Q/ W- q4 J2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
+ M+ m( e. |. u, c1 j3、从ACCESS角度而言,还可以更好的确保核心代码的安全。
) w" |( R2 m# G, K$ [. l3 ?3 x
* k1 v7 Q! O' L* g" m. Q4 l二、 用VB封装VBA代码,构建自定义的DLL动态链接库
9 C3 v! H* Z6 r* ?9 g. D6 {(一)ACCESS中实例代码- P3 K( E5 V0 g& c* V! V
下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
* X. k% W* J s0 v; I$ o/ ~8 N我将就这个实例演示如何将该实例VBA代码封装成为DLL。7 k n9 I# Q& ]& J1 f5 P
# n* |8 S- ~) T& Z/ M5 D
* b* i9 T8 q* W8 O
4 j' u: M" I2 P; ? 按钮单击事件代码如下:
8 ?, x5 M% k+ Y4 W6 W) bPrivate Sub CmdFindnumber_Click()- s5 d2 a& W$ }7 R4 e
Dim strM As String '初始字符串
* I( @8 ^! ^, h& k( ` H" ^ Dim strOut As String '输出字符串变量
9 Z+ b k3 B- I5 k2 w Dim I7 Y. [$ ~- ~8 S a
# F! a7 ~) Q5 j
strM = Me.Text1- p2 }( c. m: z( N
'从第一个字符向最后一个字符循环,以提取每个字符
1 x6 g7 i$ h$ j- p' `5 q' }! H For I = 1 To Len(strM)3 m; x" K2 [. h$ ~, B+ d6 n1 [ v Y
'判断是否为0到9字符,是则赋值输出
0 M* x: j5 X) ~* V5 V If Mid(strM, I, 1) Like "[0-9]" Then$ g; N( z0 a# Z( M8 S. G5 l
strOut = strOut & Mid(strM, I, 1)
; S, g% K9 ~; h' `1 R6 Z7 G End If
4 J! G7 ?/ B' W9 q: c& a: O0 V6 i Next I C3 f6 P/ h: s1 x% f; Z
'用MsgBox函数进行输出测试
8 {' y9 s; y; Q) V8 n0 f4 n) O MsgBox strOut% ?0 z) k% X! L: A5 r- J/ Y
End Sub
( c. D. ^) z d' g8 n5 m& v- W# W  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)
$ D. F/ x# ?3 V9 H1 G4 c! H+ a$ h- T
(二)VB封装实例中VBA代码
( Z1 | X: ^" Z# _% p步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
, ~, h- f+ ?/ O. y5 z q) x3 S% X) f! T
9 k' Z- X3 A2 @3 n' e$ `' g& g d5 ]$ y6 k8 V# J
1 K( F R0 k, [, l0 J( d5 M8 K' b8 i# B- ]6 p R4 @+ Z1 l3 ~
步骤二:修改工程名,这即生成的DLL库名0 ^! ]' A# o& R+ U2 L* e
- j& f; Q9 ]; F; C+ k7 `
, _. U) Q& Q' L: O) v2 O+ C5 R k [5 ?6 H* R
8 y( ]/ v: _5 a+ W3 _6 D9 X
' w; O% v1 E4 [& Y* L5 n: ~步骤三:修改类名" Q% g/ M( w$ S- U3 k) c( L
, |4 r/ T& a. r! V1 ~3 |2 t
! H* g" h+ j* D# c, {+ ^& e
6 ^* ^8 y* g5 l/ M+ U/ e& f* u, B) k$ e) c; j5 \% }1 a
步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口" J( L& Z" [: y" v; o% [: w
) L9 R5 Q" `) N. \3 s+ o! n) Y5 F
! d. }" D7 e1 Q) r9 V. x+ t; c
( w0 S4 G* c, O' a代码如下( t5 t$ C' u0 v, q) u5 e0 R- ]
'将这前的ACCESS代码改成一个公用函数
. M0 X3 r+ e( O'输入:strPutString 字符串变量,需分离数字的字符串
( A: M; e& l$ U0 ]- F- F5 ~8 i'输出: fFindNumber字符串变量,得到的数字字符& L" [$ N4 V2 ]! E* h
Public Function fFindNumber(strPutString As String) As String# j& b; d& Q. j9 m9 |: S; b
Dim strOut As String '输出字符串变量
( J0 O$ o% Z* k. d Dim I
1 v; f* z2 i% {2 U ; l5 e; r% w. w# [! \; Q
'从第一个字符向最后一个字符循环,以提取每个字符- P+ S2 _' g' V
For I = 1 To Len(strPutString)
3 N) f$ `0 i% n5 n '判断是否为0到9字符,是则赋值输出4 i( ^" B( J! F3 [/ a
If Mid(strPutString, I, 1) Like "[0-9]" Then
! {# l% ~* M1 K) F% V9 g strOut = strOut & Mid(strPutString, I, 1)' S# n& ?3 x! R7 X
End If
% k) C. J7 [& Y Next I
: W% z7 g! N: K& S8 T '数字输出
1 v8 S' Y9 K& o2 f, R fFindNumber = strOut
2 _1 H) i2 g R wEnd Function
: D- ~# P+ y/ @$ q) w5 C: ^# P3 j! w) F/ y: H5 X1 V
步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。. z& o, h7 U' V
+ A% C9 w8 ?# v- Y0 r: v3 X
三、 在mdb中调用自定义DLL动态链接库' a) k/ d3 m" H' U% }8 d+ f
! Y! c7 V$ `3 n(一)新建数据库及窗体1 T$ \, T7 R1 N1 k( |
新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
( x1 p& v. v$ K1 W! g r0 d0 _/ _+ l" j
' e5 Z9 g9 {" B5 b2 C& p8 y" [, s(二)引用【我的动态库.dll】库1 L4 n5 h+ T8 x' `
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。/ q- C% P" ~2 g. C: N* |/ K, U2 o9 h
: b- c1 a9 H. E- I8 t
- T# @- E9 z7 ^& v
3 ^8 c; K. m- U, e+ j* u2 A
9 Y6 H+ |9 \$ p2 \2 P6 s; o$ }4 E# g1 j/ Z! p
: Q( J5 m$ X+ g* z& C# t4 ]% {2 X
9 C& u3 n0 W, `3 k/ R0 [4 ]6 J& B# ~0 V
" Q; X! k: E6 h) Q H0 g5 N9 b+ I6 a) k9 I# u3 R
9 v& o: l2 v' u(三)在【CmdFindNum】按钮单击事件中加入如下代码。
& K" n2 h3 J2 V6 S- l c9 QPrivate Sub CmdFindNum_Click()
2 y1 J' g% z1 b' b) h! }" R% } '申明自定义类
0 s' u: R* g( \" Z, w1 p% a) F, ^ Dim MyFindNum As 提取数字
, F% k* P) x, G1 ` Dim strOut As String _; X8 `/ O+ t }" }& k
; n* Y* n9 C" r; t' x
'实例化"提取数字类"对象
4 W& _, \" Y, k5 z% J' w. N Set MyFindNum = New 提取数字2 }) N. P5 L, W5 J
'将函数输出结果赋值给自定义字符串变量
G2 n8 G" J$ D8 q; [* @- c strOut = MyFindNum.fFindNumber(Text0)1 `* X4 I7 l, d" b C( O1 Z3 d2 w, `
5 j) q: @; h$ r. q7 R- S. O
'在消息框中显示% _# F* B+ w* I5 v
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"$ I+ a3 d5 r! F; [
End Sub
3 G: `' u8 a0 v' x. X( M0 r& _7 W/ _5 i) C$ A: P& G
点击保存后,你就可以运行一下窗体测试你的成果了$ Y, y0 c) j( |1 H. f4 n
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。- F( I* r0 H2 y, p
. t4 A) }9 P+ T1 d/ M
2 P! X% p* J+ ]% K |
|