|
发表于 2014-5-25 11:37:42
|
显示全部楼层
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑 ( M% y+ m3 z# f! g
# x0 I7 e& U! nVB封装DLL实例讲解(一), ~* z0 V4 R& \! ~( r8 s0 `) g
9 u: r( Q- g" \) \6 @4 v
2 `0 O0 _# D- ?. ]* O
一、 DLL基本概念
$ f- |+ i" N2 i9 j% v(一)概念
, I/ C* m5 E1 LDLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。8 m. n( F. o9 ]
(二)主要优点:
) {7 ]" X( H% a( g: r1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
9 h5 l8 ]- h8 D& c; ?( M7 X% _2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;' q* H) K0 |* S$ T' E
3、从ACCESS角度而言,还可以更好的确保核心代码的安全。/ y; J9 q8 z7 v) m7 ~9 }" z
" ?$ y0 x: L1 Q* p$ i5 j: I二、 用VB封装VBA代码,构建自定义的DLL动态链接库
! i; X5 q, b% }" K5 ?(一)ACCESS中实例代码
, i7 O( `: p* |* Y- F下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
, @* j A9 j) o5 _8 g0 |我将就这个实例演示如何将该实例VBA代码封装成为DLL。
6 f* h z3 _$ g2 W! Q0 ~, p2 B! `
6 k f; D4 @7 s: M5 w/ [/ W% ` * `) i# [# E/ Z7 K0 D+ U/ T$ _6 W
) h6 B) s, O/ x8 E3 c 按钮单击事件代码如下:
. M# I" g Y2 PPrivate Sub CmdFindnumber_Click()
: _* N3 _! f3 Z Dim strM As String '初始字符串
1 o6 {6 F* g7 w0 t b Dim strOut As String '输出字符串变量
+ w) k w w, I3 N/ c$ l Dim I
% o2 Z P" Q3 k: b. Q" v 6 [: T3 X7 Y0 `5 v1 }8 B- l
strM = Me.Text1
& p) N" t% i1 T/ `, `'从第一个字符向最后一个字符循环,以提取每个字符
" `1 a: \7 N/ v For I = 1 To Len(strM)
, |6 ^6 c' d. \* V '判断是否为0到9字符,是则赋值输出3 d# K7 ^1 p% r* ?% p; R
If Mid(strM, I, 1) Like "[0-9]" Then
* x# n- M+ _6 P/ @! u R; w7 [ strOut = strOut & Mid(strM, I, 1)1 m/ u5 a+ w* H
End If5 N/ t8 b9 Y3 x) N* K+ G* G9 |( K
Next I
- k2 ^/ e! V/ B; u2 D '用MsgBox函数进行输出测试
9 a* [+ f+ B _7 ^ MsgBox strOut& J2 C+ Y+ N Z- p; O' Y8 K H2 M
End Sub/ x. J4 i) V, h, c
 以上代码还不能直接用于封装,须将其修改成为公用函数(过程)3 T8 D9 p p9 P* ]& v
( w% |4 ~% t8 d* `: w2 x(二)VB封装实例中VBA代码) L0 T" X! w- E q* u% ^5 h1 |
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
# j" W7 Q: u& I; L: w8 L
, y2 A9 J3 _. J# }$ t, A7 Y( |# k, ~, k( W6 \/ F) J9 u0 t9 d9 S
& U: F6 t$ \; o. I
* N8 ~* I! p3 [4 n
) S: ^; |' [% E0 u步骤二:修改工程名,这即生成的DLL库名6 a/ p0 |( N3 |/ C: {
K$ o, `& O- X+ p
' Y, {. V& u0 l; e3 N
3 s( p( B: P/ Q, A. f4 S
0 {! d0 k/ E0 T2 v( A' V) A+ E) S& w& r: t e @$ y6 a
步骤三:修改类名
6 P9 e$ }( m5 g2 C, o4 ^: f- ?: _6 x9 E0 Q9 X" `* m, l
4 h) X/ j8 h! p0 S3 Q8 e0 p) p: ^
3 ~1 H* w: q4 [1 L2 k3 s
* Z" a8 G; `$ h+ a- n1 L+ D步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
0 [) o# z$ Y% M/ _$ q1 R8 i3 N8 p8 q: S# b& y* u9 m; M* O
! S, R0 n" X4 ]2 G6 b
0 k/ g4 S; l, ]/ I$ |3 ]1 w代码如下, O; _) Z6 P% k; e6 |% w6 V$ Q
'将这前的ACCESS代码改成一个公用函数
% K( A1 C$ O% g y# R3 A8 E i'输入:strPutString 字符串变量,需分离数字的字符串, m. K/ Q, R& t. Z3 b* N5 e; E0 v
'输出: fFindNumber字符串变量,得到的数字字符' `; a% U5 A* \% {! N
Public Function fFindNumber(strPutString As String) As String
8 x) y/ j6 l+ O, o' E Dim strOut As String '输出字符串变量
* r1 z+ x! @9 m2 T* Z- h" W Dim I& ~) B& ~9 @$ m2 z
" U* L& k( z. E0 w9 w
'从第一个字符向最后一个字符循环,以提取每个字符% A, E8 p* X: |8 t, p) G7 a
For I = 1 To Len(strPutString)
l+ \; k X3 G/ o5 L {; w '判断是否为0到9字符,是则赋值输出" b+ s, o0 C, G. m c+ X2 r2 B
If Mid(strPutString, I, 1) Like "[0-9]" Then# o) t. i+ B& S* [
strOut = strOut & Mid(strPutString, I, 1)
( g. f+ V, C9 [& g End If
2 S, F2 C; h* F0 H& ] Next I
1 k0 b8 q5 g7 @! O q1 f' P+ S: s4 s '数字输出6 L% s" M% `7 D$ S6 @
fFindNumber = strOut, }6 O& J+ U D$ X O0 r& V
End Function
: {7 s/ M5 U1 N- G2 o# {
* s% H; o- w$ @步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。
" r! S6 }$ s" @8 X6 C% ?8 N4 {+ |8 B! x
三、 在mdb中调用自定义DLL动态链接库
1 k, U) D' E7 B" J4 Z4 q4 r/ | s- W8 ^3 S; W2 [! f, @* W7 U
(一)新建数据库及窗体6 q" |& G+ o9 U* Z+ x9 v+ z) v: [
新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)- _# x6 d" ]# I1 ~/ i
$ }+ E2 w$ H# m! e4 b+ n, T! Z# v- l. y
(二)引用【我的动态库.dll】库4 |3 h1 m* r- v
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。% |6 q f" G" a& \- x
/ C$ g7 K1 U+ O0 Z& Y% S2 x" b! N+ `2 j- {* r
( H* w/ v2 T! X& v0 V$ i5 j
, _+ i' [$ N2 k- o' a6 g3 z
! K) h$ p7 y1 }4 V" f. C. m
/ k' c) }* `0 P4 r
+ O+ y2 \- A+ X( u, W6 t2 N1 Q
2 D/ f5 N0 y& C a0 p( p& K% g
5 }* f! u# _5 L! `
! B' N/ @/ ?9 `6 a(三)在【CmdFindNum】按钮单击事件中加入如下代码。
" A* ]3 @9 X8 ^- `( z6 r1 rPrivate Sub CmdFindNum_Click()! e; N+ j) x" O, f& F* p
'申明自定义类
* y! s& F5 F7 Z- B0 K Dim MyFindNum As 提取数字3 d% F- W5 ?8 m3 I. `0 Q- l
Dim strOut As String9 U2 Y, S: q0 {8 }' r
, A1 G% { ?* W0 U6 J '实例化"提取数字类"对象
; P: n5 q' I' H# u8 b6 d! m Set MyFindNum = New 提取数字3 q/ k) z+ s7 Y- S, {- l1 R. G( L5 P' U
'将函数输出结果赋值给自定义字符串变量2 g2 U) o4 S1 y/ m& N n' N
strOut = MyFindNum.fFindNumber(Text0)
! p: w' \4 S- x5 V7 ^1 g9 ?/ l1 Y e3 j K& ], e# W/ | y+ ?
'在消息框中显示
* c; p" j. ?' a$ R3 Q& A) B MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
& S' J* d0 [3 E2 IEnd Sub
( |* {6 \$ U; q4 w7 O$ h9 i1 w7 Q7 R z: n* H# j9 [
点击保存后,你就可以运行一下窗体测试你的成果了. ?8 p. E* Y* L! S1 d9 f( |% X
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。9 |$ j" @) b3 e& \' U5 m
- v* ^5 P! a+ H$ c4 Z$ o
$ \6 I, C; L j0 \& ]+ r2 C |
|