|
|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑 , c2 V' @/ H* @7 Y' r' }2 u) ^* G
7 @7 W& N0 J Q0 i' p, y! FVB封装DLL实例讲解(一)
1 _% |5 j2 \: `/ |+ u3 i$ a2 e0 i0 Q$ F
+ }# _) J8 o2 A. P5 [ Z M" ~/ l% m' |
一、 DLL基本概念
R% c6 x' p$ D5 g7 \(一)概念5 a- N+ A4 ?# e
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。
% s; j+ j% u( O$ w# |/ X" l(二)主要优点:
$ e' J' X) v8 {0 k! @1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;. i# H0 Q7 j8 C6 G
2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
" M3 h: }/ T3 P- X( P6 M5 k3、从ACCESS角度而言,还可以更好的确保核心代码的安全。% E% ]' p4 I! N- i5 q2 m; _; k
5 |0 @; h4 c X8 l* t. @
二、 用VB封装VBA代码,构建自定义的DLL动态链接库
" J/ r7 F" H2 p- s(一)ACCESS中实例代码5 O" Z" g3 o, @% D# C
下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。0 O2 x$ K) t) z: Q6 h0 T
我将就这个实例演示如何将该实例VBA代码封装成为DLL。
# N3 i6 y0 i* }
5 `, E4 i, \2 a; J& { r
( U! I# ]$ F' s% |" k0 j
. Y' h& k4 I; I1 C5 p0 Q l8 d 按钮单击事件代码如下:
/ p& w: ^6 L) u1 b) c6 Y/ E" b8 R0 b4 IPrivate Sub CmdFindnumber_Click()
0 |: r! X% a! V; f- B/ |' g Dim strM As String '初始字符串' J$ ~5 F+ l+ X! f9 ]. l6 C' E
Dim strOut As String '输出字符串变量
0 O; f2 [# G7 w" a1 R- b Dim I
+ X! F m4 _6 F) | 8 p3 n7 ~5 U0 ^2 l* l1 X
strM = Me.Text1: ^4 J. {* r: u' H8 w5 R9 M$ Z9 U
'从第一个字符向最后一个字符循环,以提取每个字符
: l3 Q4 ^2 p3 f/ @; Q% P$ a1 M For I = 1 To Len(strM)
1 p$ _( ^2 f8 ^* Z '判断是否为0到9字符,是则赋值输出4 c* a+ U- I4 _ p2 p8 t2 E9 Q! j( p
If Mid(strM, I, 1) Like "[0-9]" Then
! }6 x" j4 |0 m! p& T r strOut = strOut & Mid(strM, I, 1)
0 B' f9 s" q$ R8 X3 U2 m8 [! l End If
5 }) q% [6 u: @. x8 M& r% k Next I
# a3 D" n0 l. G9 Z& \4 i7 m '用MsgBox函数进行输出测试$ f$ \, ?! P* b8 p9 p/ a
MsgBox strOut/ X+ ~4 I2 e$ \1 ]0 z! q% O6 O- e
End Sub
9 S; b+ v9 T/ r2 C" L5 E ?3 i$ r  以上代码还不能直接用于封装,须将其修改成为公用函数(过程): {0 n, ~$ w0 m! K& L3 S% s" o" Y. c3 j
S1 t6 i% j( N+ U% M
(二)VB封装实例中VBA代码$ j9 K. N! E( L/ Y* j
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
. @# F: Z; A* b" y- _3 d5 d ~
7 h8 ?% N3 {/ t2 z+ B1 ~0 T- `" C
* _% Q! S' m* Z: Z8 U! K8 G, h! `+ [' v. g5 N4 ]! R* ]9 w; a8 P
Z$ I& u9 J* {/ O" [ T
: O; h$ I" E* ?: W步骤二:修改工程名,这即生成的DLL库名
( ]/ `7 [5 \, `' i, @9 n, [1 }6 W) V- f4 _; O5 ?/ i" S( T
6 {% \0 Q {9 C/ q7 E; Q3 ?( O
1 X# z( ?+ i/ q |6 F5 @) c
! T) f1 Z$ Z( V4 B1 P0 `) w) J: C- O8 P9 j |/ a
步骤三:修改类名
8 `% {% u" d! a* y2 b: d7 o$ u2 V$ f, D% A+ K. [
! p* J) W; E7 n
6 H0 x+ L0 j3 ` g
' ?$ `3 j% \% A% t0 A2 |" ^步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口5 ?* G' z7 c9 r# ]. u
8 d* h! y( ~' ^7 K6 m* X
- ^4 V* O5 z j& ~: j; S' \
4 ^" |2 @1 ^) V* H, ]& R
代码如下( N( F8 n N- K' K& q0 \& w) x4 c! L& U
'将这前的ACCESS代码改成一个公用函数2 F, |5 e, y8 S- |; f" V/ Q. P
'输入:strPutString 字符串变量,需分离数字的字符串
# T. k9 K y, B5 T$ h'输出: fFindNumber字符串变量,得到的数字字符
! A( A; D2 B7 [! mPublic Function fFindNumber(strPutString As String) As String2 x$ W/ b" k8 E4 G7 J7 E
Dim strOut As String '输出字符串变量
M# n8 C0 Z- U- n/ m Dim I
! q7 P9 Z0 B% W
. e# [/ f1 b4 b- ?* { '从第一个字符向最后一个字符循环,以提取每个字符0 v" x- K/ E% O; C# B
For I = 1 To Len(strPutString)
/ V% b4 r1 k v' w7 D '判断是否为0到9字符,是则赋值输出
2 a) @/ P3 A- w0 _; ]* t If Mid(strPutString, I, 1) Like "[0-9]" Then- Q+ U/ o+ g4 a+ g% s0 I, {
strOut = strOut & Mid(strPutString, I, 1)4 ]0 u6 t( V3 Z( N' T
End If
5 f6 O1 L0 d, e; X4 v' \ Next I
4 y- m+ Z+ ~; e. D, z1 Y: F '数字输出
7 E$ r9 u o% L! k1 Y fFindNumber = strOut0 h% T) f( d! F+ b' D
End Function5 j$ [) {+ A, g( Z9 N* A
: c% t7 ]# R3 F/ b3 l; \5 M. K
步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。
# U8 d* ~% |9 _( l. }" |: a; X. m( O u1 g) i. v M' K
三、 在mdb中调用自定义DLL动态链接库: H! \# J7 G$ M6 R2 C. ]) v3 n
* g; g: @8 B; S8 |2 u" }(一)新建数据库及窗体6 A0 H3 M5 ], K: T1 _
新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
9 \+ w. ^2 X7 @ x) k$ t/ t9 m7 w0 f3 S
; L7 c- o7 ^) l2 x
(二)引用【我的动态库.dll】库
8 |3 u0 R, Z6 e5 m. T按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。 _0 c+ t9 i' I1 L1 ?
6 `- r4 E4 p& Z: e" J
* e1 j+ S: Y7 W/ g
* w. x6 @: Z d1 R# z, C7 Z/ w E: ?# K0 M, F* v$ U
/ w% c9 q5 g! r, a! X" o
n2 R1 A$ }+ {8 F
|$ M1 ~/ _1 d- M% O& N. \4 e* N! E; g/ d, @" ~
8 R2 d. ^6 z. I% S. b, N. P
1 j# T5 M3 v4 X
(三)在【CmdFindNum】按钮单击事件中加入如下代码。: o' H5 i; y# _. t
Private Sub CmdFindNum_Click()0 |: ]1 x1 |" C4 I! p% z1 m
'申明自定义类" D0 V( V" h H6 f$ ^' J3 } q
Dim MyFindNum As 提取数字" S. }3 b6 [4 q0 {
Dim strOut As String2 r6 i- |* g* A9 J( |2 C+ k5 ?
0 A& H, f R8 @3 K3 V' A7 O '实例化"提取数字类"对象8 I: H- C# q1 b" {0 M* p
Set MyFindNum = New 提取数字4 S/ r# n* h4 b/ M* Z9 z
'将函数输出结果赋值给自定义字符串变量3 V* n2 \. s& E
strOut = MyFindNum.fFindNumber(Text0)1 e# L7 X3 P( @5 U& A7 q F H
1 c6 a0 g' j! s8 C% L4 X0 d7 ? '在消息框中显示
9 v5 D. d# X: X4 G/ T MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"4 X3 f3 j# }: t' k5 u
End Sub3 Q* p. r d) W8 p0 J! ]0 v
. G# X2 ~1 o9 B+ ^+ b! l
点击保存后,你就可以运行一下窗体测试你的成果了
! q& n5 Y, L# J- F) i7 e/ }( {/ r 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
7 [( L4 H0 Q5 a+ I- p
& s+ v; O+ r, b2 \9 O: K1 Q5 B/ d% S6 g
|
|