|
|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
3 z# d$ C( m( D @
5 W6 H. a8 H8 BVB封装DLL实例讲解(一)
7 f8 N2 ^, Q" c) c* \/ K7 e9 I0 Y. u/ \/ a8 [5 {2 Z P8 j9 I
. m: G+ l2 o7 l% X% F一、 DLL基本概念
$ V5 B$ X- S/ k# z3 [8 n(一)概念( c! t+ J* z4 k8 i( Z+ d
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。
: I2 R( z5 T& G/ i(二)主要优点:0 c$ f* p7 R1 P7 a
1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
9 V6 K: a }8 H3 ]" s2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
2 \& Y4 g: H- o" l, ~% e0 l3、从ACCESS角度而言,还可以更好的确保核心代码的安全。
8 o9 h/ W# ?) Y* F; a/ x8 u4 H1 A, C8 }+ ~* h! s8 B" c
二、 用VB封装VBA代码,构建自定义的DLL动态链接库
9 o, S& U9 H) ]0 A) X(一)ACCESS中实例代码
! D2 U' f% e/ T L0 ^下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
" T( S' C3 A/ X1 c! D5 t, H$ e* W我将就这个实例演示如何将该实例VBA代码封装成为DLL。2 R# V) g, y; t* ]' ~- k6 l, i
6 U4 x! N" H4 y% y6 O4 d + \4 L ], Z& n, J" R. m) ~
$ {# m" [0 {. c, K1 r. T 按钮单击事件代码如下:
' F, t2 q5 ~9 F4 a- Y" DPrivate Sub CmdFindnumber_Click()
# ~2 Y7 E- \8 J( m I Dim strM As String '初始字符串
3 t; y" T! V* P+ N- r& U6 s, | Dim strOut As String '输出字符串变量! b7 c& X: V. Q
Dim I, ^# |- b I; G; y6 l2 {
/ t0 Y2 P. A) ~2 x3 N. |+ ? strM = Me.Text1
* V4 ^& M2 E# ['从第一个字符向最后一个字符循环,以提取每个字符
6 b! \6 E, J% ]% z; ~3 q4 i7 { x For I = 1 To Len(strM)
$ }* M0 n( W! G7 _ '判断是否为0到9字符,是则赋值输出
: i' V3 F" t# D9 q. V! H If Mid(strM, I, 1) Like "[0-9]" Then- k9 h# C& x9 u( T7 m9 C) f1 m
strOut = strOut & Mid(strM, I, 1)* U$ D, w1 u$ t h8 k) j0 R) k4 U
End If$ H) n# z" b9 q0 N1 h
Next I$ {& {+ H1 h" E
'用MsgBox函数进行输出测试
x$ r* P; ?- j" b* T2 |/ i3 } MsgBox strOut3 s/ o: ]# w: _4 c( [
End Sub
: k7 m0 N6 g7 m2 v- X+ h  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)' v9 i' g6 B) g$ Y
9 {2 M* R1 N+ S* U9 j, Z(二)VB封装实例中VBA代码9 t& Z* p( R$ u- A8 _! |
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
9 I/ p3 E+ L# F( v1 [( J4 x: O6 Z& [& z9 X: F4 {# A4 x
3 Z2 X# i3 h( H1 u0 a! p4 ~/ o5 a3 u f! g% h* n
# `% o$ _' s) _
8 k4 x2 o( a! O* ^
步骤二:修改工程名,这即生成的DLL库名
$ Y7 }. s8 j5 J6 f! Y$ V/ V4 H( Y! P {* `. ~
9 c( M/ o: n: w, v2 k
/ B9 K; b- r0 N1 i" C) R O% u. U3 n8 |$ M/ r. U4 I' V B" e
# i: m# t) v E+ E5 o( ?4 j步骤三:修改类名
6 S3 _$ {, C; S A3 D; B# K1 k, l2 f+ Z
% F! t3 O& K# C' B# K) M
( w' m3 K, V. Y6 j+ R8 S" Y- p4 N; [" _2 P5 p, t; T
步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
, z6 ?; d J9 y6 N! {8 Z" [+ X5 D+ s( m3 t4 S8 U, W) \0 G
- ~5 ~5 _! R9 Z8 g3 j6 ^
; I* V d" @/ @代码如下( z6 j; h1 h% X5 }+ P" @' z
'将这前的ACCESS代码改成一个公用函数& P" h0 g* M2 a. Q+ V& Q; G* L
'输入:strPutString 字符串变量,需分离数字的字符串
3 D ?" N5 W2 P* B! U/ _'输出: fFindNumber字符串变量,得到的数字字符 }7 ^' j1 X% u6 K( V# K
Public Function fFindNumber(strPutString As String) As String
. S3 X/ K" q/ f. U8 Y Dim strOut As String '输出字符串变量* L. v. M: g! W0 R( _
Dim I
0 d) N" Q& d7 A2 `3 K [) Y2 z" ?6 a
; U+ w# x H; w4 g/ I, ] '从第一个字符向最后一个字符循环,以提取每个字符, j" A2 R8 L# ]( K$ L! o
For I = 1 To Len(strPutString)9 V0 _/ [/ N) c& e5 J
'判断是否为0到9字符,是则赋值输出- J. Y9 }9 g2 c, o1 L$ {$ T
If Mid(strPutString, I, 1) Like "[0-9]" Then
7 B/ z M) ?3 q- Z strOut = strOut & Mid(strPutString, I, 1) H5 ^: Y! c2 V
End If
( g/ s9 k! N% J" S% |" ? Next I% e( y1 `2 Z; U4 V
'数字输出
3 I9 ?6 l% ]1 O) z fFindNumber = strOut- j, b! b V& s2 d, c9 b( h7 S
End Function1 C( R4 x6 Z& ]* m4 p. }
: d$ M9 [4 B0 u U1 X- [步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。
8 ^: }9 }0 k/ [' {
6 |* V+ k$ c7 N1 u三、 在mdb中调用自定义DLL动态链接库
; S- l k% @0 ]1 H R4 K% F( V8 J# B% A, m% K
(一)新建数据库及窗体
. a* `7 e. [ Q; N( n* S3 _* U" d新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
. Y" I8 M" z& O$ v4 j1 F: b* M: M
2 F! O* V. W! J% B) v5 w8 J7 a# x8 C0 c H) ~( l) g* n5 n7 E
(二)引用【我的动态库.dll】库( s8 x3 _, I% E- W
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。! M- z1 e( u1 G5 h% E4 d8 R
% V( D f) Z1 h! e( i1 Q- o4 W, P1 m; @4 l
3 J7 n2 T. |0 q( w
) Y" b: @4 v+ ?/ k. d
+ W4 L! v; _8 |% u4 x" @1 y& i) Z+ ]
8 d" T5 b1 W; _
, W* o( k3 ?6 F# s" \
; d, _ `/ \- D4 U' p
2 a9 t1 {. g r% k3 X/ v0 F(三)在【CmdFindNum】按钮单击事件中加入如下代码。. }8 Z+ X. M5 x# R- M; o6 y
Private Sub CmdFindNum_Click()
. @3 K0 Q/ r$ a! s. o '申明自定义类4 k5 B6 o1 Q' F: T" w
Dim MyFindNum As 提取数字
, @. \/ R. m; G; i+ a Dim strOut As String
3 L, d4 b# K7 t0 `3 Q ! i; X; j! |/ @7 g1 d2 U
'实例化"提取数字类"对象
+ x. L4 t& U6 h5 l" ?+ S1 N Set MyFindNum = New 提取数字: ~6 ?, M- V+ L8 A
'将函数输出结果赋值给自定义字符串变量
4 G7 G3 N, Z; |3 m; t0 {4 a8 { strOut = MyFindNum.fFindNumber(Text0)
! v: k$ Q7 B; p# R, F, F0 l0 f* a* t 5 \; z- \9 B' j6 t
'在消息框中显示7 c0 [: `( m Y, j! y: P
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
' J% E5 S- d2 ?2 e! vEnd Sub% H3 ?6 u- Y; R T8 X& }% D" ~- F
* q x' w* \ n Y1 O1 k8 e
点击保存后,你就可以运行一下窗体测试你的成果了
+ c7 {, D1 d5 f) R2 m1 D 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
$ u' E, F+ o+ ?0 L; E
% z) `1 u; l9 w, g* k, Z# p. ?$ {0 K+ {* ?3 j5 f$ q3 u
|
|