|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
9 R3 h0 q/ R p8 J& E# d/ m# L0 ^' m& t1 m
VB封装DLL实例讲解(一)2 r0 |. r' `( n; c
* K: A7 U. f: ~+ A/ |
/ l& W; H" [& L8 |! S4 \一、 DLL基本概念 y. m7 z* o q
(一)概念1 Z3 ?2 R# `8 w2 c
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。+ N& S8 ^6 v, |( ^' r
(二)主要优点:
7 f& B' K+ M/ ^0 \1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
/ v; L/ U( i' q4 y# \$ x2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
/ [* j( T$ Z! l2 ~* \: n3、从ACCESS角度而言,还可以更好的确保核心代码的安全。
5 C9 N! P4 ` R2 f2 ?! [( Z
/ y: ]! e7 b4 q" k5 E1 u5 |5 F二、 用VB封装VBA代码,构建自定义的DLL动态链接库
* c5 n5 o/ h& [7 ]0 A6 i(一)ACCESS中实例代码! d8 x! K" K$ S* V+ ]
下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。, I: f& x5 C; |3 K) ]2 r7 a
我将就这个实例演示如何将该实例VBA代码封装成为DLL。
3 V* x& q* h5 [, ~ & R7 {" ?7 s9 @: y3 o/ Q0 H1 h% U4 w
: q& h4 x1 k/ k- F5 L" `3 k) H
" r# R5 e( }7 C8 J/ T$ E5 t 按钮单击事件代码如下:
# T* o# d, a" q6 n* f. SPrivate Sub CmdFindnumber_Click()! Z) D) K+ s* B: z3 R6 Y
Dim strM As String '初始字符串
9 y4 Q: i9 }2 C: \/ i Dim strOut As String '输出字符串变量
# V( ]0 Z3 y) g4 ]5 ]: Y Dim I
l: {$ b" p8 f, a4 w7 h4 R
! N+ p2 C4 F" N9 T strM = Me.Text1
$ k% N9 Q/ H; s'从第一个字符向最后一个字符循环,以提取每个字符: P" j6 }+ Q# D! e8 E
For I = 1 To Len(strM)) @+ Q$ N( t" e( _( |) a. A+ {
'判断是否为0到9字符,是则赋值输出
3 Z2 N' v2 h# Z If Mid(strM, I, 1) Like "[0-9]" Then
2 t4 c1 x3 ]& C# C( z" e* A) p4 E strOut = strOut & Mid(strM, I, 1)) u, N; Z: {% v0 H! u
End If
. l/ c. e2 l H2 C! C Next I* b% L1 f# h! [8 y' }
'用MsgBox函数进行输出测试
; }, Z2 T9 o4 h& Q. _ MsgBox strOut
- d8 X9 P9 _( h7 v& {( YEnd Sub9 y( ^) ]( ]1 P. I5 j* _4 `
 以上代码还不能直接用于封装,须将其修改成为公用函数(过程)
7 Z! r- {! q6 O5 L6 ^& h5 G" u5 P4 c1 I+ n' Y
(二)VB封装实例中VBA代码
9 a2 o% N- g9 w. o步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口: ] i0 I4 r: |$ [" E
9 \: c2 I: ~! ?+ Q4 Z3 D; v* V
4 X- ?% C4 [5 Z8 _" H2 m, X9 q- Q( {2 f. |4 v7 i7 A
/ I& X! y. o6 R1 ]2 {. \4 e
1 G- o- g+ |! z, S) s2 N( [* u; J步骤二:修改工程名,这即生成的DLL库名
) l) a2 E. P6 L `8 u! h8 M
' @" B* A! n* D0 a9 {
2 N0 L% V8 Y k: f9 b- V3 t l3 e t0 ~6 e
5 `0 k3 T( @( t. U: L! {2 O) H
, v$ M5 A( r# c g( O8 {
步骤三:修改类名& \( ]& B/ {4 q5 i _, I
! X0 p+ \1 a# X. t
t) b5 F& m" h( A: o( ~6 ~7 V9 e# w
" t1 i7 u5 H" U) f步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口4 q, o, Y7 P0 }
& z1 f: r H2 M0 G ~; G0 C r* T% G! S; c% x. Z
4 O1 b0 q) M; L- |- ^4 p/ e+ w代码如下! s( l) H7 ]( X4 g4 B
'将这前的ACCESS代码改成一个公用函数
* @3 C1 m1 f1 d9 z$ u* X/ G'输入:strPutString 字符串变量,需分离数字的字符串
3 D5 s! k7 \! O4 @. }, D3 c9 N'输出: fFindNumber字符串变量,得到的数字字符
& X+ }! l/ ^2 v1 d/ A! y, I9 TPublic Function fFindNumber(strPutString As String) As String
2 J( j% H* o! |2 c! D; d" I Dim strOut As String '输出字符串变量9 ^# I- b9 j) p# w
Dim I
% s7 V e* m; ` % s8 j1 a) Z) v! K$ t
'从第一个字符向最后一个字符循环,以提取每个字符3 [( z& e" j$ F) }$ o
For I = 1 To Len(strPutString)
1 T: B R: i2 Q3 | E6 v: C '判断是否为0到9字符,是则赋值输出
) Y. w: A0 T0 t" x! q If Mid(strPutString, I, 1) Like "[0-9]" Then0 O+ j) O% d% P$ Q7 @1 n
strOut = strOut & Mid(strPutString, I, 1)9 e' H; i! k+ `5 Y/ F
End If
9 s, s& y* b8 Q1 l: M Next I
! y4 M: B1 h+ t5 f3 _ '数字输出3 a5 P* X7 ?: p
fFindNumber = strOut9 P7 [& p; F: h$ l
End Function
6 b& e- i$ ` t; F0 D# e; a+ k( U4 p$ j/ j6 r$ C- Z% Q
步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。' n; O# _1 I/ B0 }
- Q) F6 w6 L- M v* f# r, k( C: o) u
三、 在mdb中调用自定义DLL动态链接库7 b$ v' S5 Y% D8 [
/ Z& i9 `; s4 s9 f5 g8 s1 R+ I3 X
(一)新建数据库及窗体 X' t- h2 O2 I' C
新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图), q7 X7 \/ B$ q+ J% z
" M# K0 T' ?9 y* u# r$ b) E( d6 ^2 U, g3 }
(二)引用【我的动态库.dll】库
0 J' J2 |1 t H2 ?按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。; E0 A( }! U" _9 j0 y2 b8 E
4 {- z/ W; i8 o7 w5 `9 R3 R
6 F0 B( `+ w8 r5 u; [
* H4 @8 _. u+ e2 |6 U! v% Q2 @' [8 W3 v- D
& u+ x- l* t1 X' L9 h, K, h; r$ D! D8 V! Q7 ], x
- {5 A& e& `/ _" t, F4 M' C
& e# F0 {" t/ [- O/ J# ?% c" e2 J" H) \
. w: t6 B" B4 ]
3 W1 b& J; j2 h) M8 Z5 H' c* J(三)在【CmdFindNum】按钮单击事件中加入如下代码。
8 v, d0 {! B( M6 \+ j% ?( ~Private Sub CmdFindNum_Click()
5 S' q( C' q& t$ @ '申明自定义类9 G0 \! p. d4 z
Dim MyFindNum As 提取数字/ X1 X, e# s% k
Dim strOut As String
; j) s+ f/ `9 C9 i, K# C: I4 j
; G6 P5 B4 J5 J2 g( d: ?) X1 q7 p2 M '实例化"提取数字类"对象
7 O; z8 N. y/ P S4 Y Set MyFindNum = New 提取数字* p8 ^: t: H5 a3 s
'将函数输出结果赋值给自定义字符串变量
. n% W! ^& [ o/ l strOut = MyFindNum.fFindNumber(Text0)
5 e9 m- ]2 ?' I% I
8 \! K+ d" Y) \4 z* p '在消息框中显示4 j7 |) |. _" i4 P& _; e6 j/ F. X
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"- X0 V; ?2 i, G2 @3 b- ~) T6 D7 E
End Sub0 [2 i4 |6 ^3 I- ^) |* A
) g; }4 t# r: l: T" f点击保存后,你就可以运行一下窗体测试你的成果了
% \2 i/ d; X: H5 ^% }2 r 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。1 c; U- T& r; p- U: E# P
8 |$ {2 d2 w, X3 E% j
I( D0 c( N' E* S, k0 I( h
|
|