|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑 3 p: q8 g0 a) b3 C8 j# g; N+ E
7 D8 B" A* o) b% t$ _
VB封装DLL实例讲解(一)' ]& z; V: x P' O F) ]
5 T; R# R. {% ?9 x0 [# V
- W$ @) p& t( N' F: j
一、 DLL基本概念1 ~1 K5 A/ g$ ~/ T9 I
(一)概念( `! L0 x) [6 P# g* R
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。6 [- R0 C( L6 L
(二)主要优点:* [* {3 s; R! K+ ~
1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;6 D; `; D) C: f7 O
2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;" x) X/ Z+ X( U: a
3、从ACCESS角度而言,还可以更好的确保核心代码的安全。) \ `& B* G0 X% k% Z
5 O/ a, k9 e- e* P/ x二、 用VB封装VBA代码,构建自定义的DLL动态链接库+ O% T$ A0 @! c/ ^% A8 u
(一)ACCESS中实例代码
( x2 w8 h4 |0 P; n下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
% G0 B4 s: `6 \* |9 g4 c6 Y我将就这个实例演示如何将该实例VBA代码封装成为DLL。3 A4 s" ?9 F7 J7 Y
& p( Y1 ~9 g( t3 a1 ]% v
/ H4 @" V7 M( p5 X# f
, x$ Q" `/ V3 N$ t% x, H 按钮单击事件代码如下:
' A9 k5 J9 i0 g5 I0 S7 X. V' hPrivate Sub CmdFindnumber_Click()
) Z5 f; x: X; D6 x Dim strM As String '初始字符串$ V) g4 {, q7 t1 q/ N2 e
Dim strOut As String '输出字符串变量" ^: c, V. A \9 l6 [1 O9 _
Dim I
) ?* x; F: Y, U& K8 y
/ q: F1 Y. b6 U& O3 _ strM = Me.Text1, W2 x9 B0 h' p" j, P
'从第一个字符向最后一个字符循环,以提取每个字符
0 Q: n( ~4 |6 a For I = 1 To Len(strM)
2 J; c+ m- o2 w+ o4 {) s '判断是否为0到9字符,是则赋值输出# T; @% u& O6 g
If Mid(strM, I, 1) Like "[0-9]" Then) _# H0 X; }' Z% g& i
strOut = strOut & Mid(strM, I, 1)
' d C, F5 |/ g End If
$ ~5 E$ h- z! t# M Next I7 M* ^- C0 C% @8 w# w
'用MsgBox函数进行输出测试
4 w7 f. B8 ^. S L MsgBox strOut5 h6 c$ X1 K+ b8 y( y
End Sub
O/ F7 l( Y+ C; t/ x$ V  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)! v+ G% k% b4 h& d! ]- ^
' k! o+ @4 C: Q/ W8 E, A(二)VB封装实例中VBA代码
( D; l n: H1 V8 O4 a/ e步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
9 F1 K# }! _. f8 ^( `% N' \% R/ }6 H) W% o
, M1 L% z7 u/ W- y
% L* ^ R J% A. X
- o3 B m, F# p5 N3 y- |
" Y1 W' I3 L u! ^, t5 N4 V& _步骤二:修改工程名,这即生成的DLL库名: j+ y5 x! D$ d, p
0 b v5 f1 O" P# F
/ \, V% L) `' R4 B8 v! @' \: L" O/ G
1 O5 H1 K5 p' A2 V) q2 N) i5 F
" }0 g% n7 |9 `& ^' g, d/ S; b步骤三:修改类名
5 _' L8 G* a4 ^" A' _4 `/ I' Q8 j5 L( o0 e* P7 W. T
3 q% j3 i h9 k5 ~2 {( P9 Z& Y
- s& ~5 a# ?$ ^, V- I$ c" Q
+ c/ |/ @6 j* g步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
& `6 A8 g$ U: W# e# v! f( ^8 P" u0 g2 O) D
! i$ \. X7 k: B5 }6 t* M8 r* d& j& D- v; z1 U+ X+ p6 V
代码如下
/ B- G9 s. N: g/ W0 ~: ^'将这前的ACCESS代码改成一个公用函数+ L, N" W7 C/ }: A
'输入:strPutString 字符串变量,需分离数字的字符串
' O8 G5 j# N8 q'输出: fFindNumber字符串变量,得到的数字字符
5 _9 V! F8 A/ W& }2 dPublic Function fFindNumber(strPutString As String) As String2 o% U( H" Q5 T Z4 G
Dim strOut As String '输出字符串变量$ e" M0 \2 c" o- s1 p
Dim I
. H1 n$ R% f' f1 Y, O6 g0 H
) O8 A3 y, C: @ '从第一个字符向最后一个字符循环,以提取每个字符
4 e. p' v& Y$ F( w9 E For I = 1 To Len(strPutString)2 S6 N: P$ {' x5 \8 S1 c( u5 B
'判断是否为0到9字符,是则赋值输出! }5 s) T" }1 n) ?8 h6 o9 E1 C$ J# T
If Mid(strPutString, I, 1) Like "[0-9]" Then
; Z4 J& A9 D# p% I9 |1 }5 m strOut = strOut & Mid(strPutString, I, 1)$ {- Y9 K6 I) `& ~6 y
End If
5 C) w2 Y' K" x- O: d9 | Next I+ N) i6 n( k/ m( P
'数字输出1 I1 a" [8 s) ]6 h/ g. `
fFindNumber = strOut$ z+ w: f" S. @( y' @
End Function
0 B9 v* N+ f- i5 e' n- W
& t. v7 h) u2 @7 D6 D步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。 I" C8 G q1 p4 A( ^- r
5 o9 B) v# @8 H8 H- W
三、 在mdb中调用自定义DLL动态链接库
. S$ [6 {8 q' d5 o! M, h
6 ^+ D/ [6 l5 A# @$ N! C(一)新建数据库及窗体+ e& k$ l7 n, Y4 S9 T- P! Y1 v3 z* _
新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)% w, D" g% L9 }7 `) F7 o
- _- @. s5 ^' i: q/ G, G4 u0 D- i; Q: P0 F" l/ i3 n" @
(二)引用【我的动态库.dll】库* I3 T! [+ n9 Z
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
0 ~$ e2 o( G$ y& C2 ^
! ]; N" X+ R* d0 q z3 g( v; Q: V% K t/ J9 x+ Y% h2 f( u
# E5 @( y9 V& s6 ?- H' x
& ^# Y9 D' M3 k, l, w: t
& m$ Q$ Q# V4 Q5 ^
3 X( X" P6 N, A. Q, y6 F! O
0 \9 p* p. u: W
$ e8 I! L: V7 Y5 X6 F. f( w# s7 `" k; m7 Q
. _4 x8 ?) F: s% c& g0 e4 N
(三)在【CmdFindNum】按钮单击事件中加入如下代码。
- t j& S+ x% r: z- `) `7 n. HPrivate Sub CmdFindNum_Click()
& j; P& O8 V ^! e, {, ^& X '申明自定义类
% y. @& N0 l2 p5 @ Dim MyFindNum As 提取数字
$ d0 q; E& @3 H: D# q' d# Z+ A Dim strOut As String
( k, o+ V& x2 H. A1 |# n
' m, q5 l: W# T7 P& X/ a '实例化"提取数字类"对象' c& Y& Q( B" W( P3 m
Set MyFindNum = New 提取数字4 C5 I) x i+ I l2 v
'将函数输出结果赋值给自定义字符串变量* H8 v+ P& P2 y
strOut = MyFindNum.fFindNumber(Text0)
& d1 h# M( e- C9 p& F 6 w9 r' K% ~- t+ u9 \2 k
'在消息框中显示) P% M8 j6 Y4 Q% S$ E
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
5 p% O- ?. `, b+ j+ w U6 K. F' v7 iEnd Sub
5 e& z- F$ z9 k
L. X. t" u% {, y/ j# e点击保存后,你就可以运行一下窗体测试你的成果了: Y1 J# E c' J* c2 j# l
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
4 h$ ^6 O1 u7 x3 Z* i4 @" K5 O5 B+ w+ c1 T
* M" T" F- O/ D$ L" W, h, W |
|