|
|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
0 e! A8 [# C, C$ B# {8 Y1 V- s" h( d
VB封装DLL实例讲解(一)
$ F4 z& ]' a3 J- l: Y# w, Q2 j% ^ V/ c6 O% E
' N6 P3 ?$ l1 w7 y/ E一、 DLL基本概念
) ]( ?. J6 ^1 Q1 F) _(一)概念
& Z4 S3 V6 g: NDLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。8 u7 ~2 r. d2 ~9 I4 U6 @% n! J
(二)主要优点:: [* V$ \% L% Q- I( |1 b
1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;! e$ Q/ s% L2 H. ]
2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
, m& d2 J# Q: w) J3、从ACCESS角度而言,还可以更好的确保核心代码的安全。
& O/ g7 V u! `
8 o9 d4 T4 n, @" ~0 m二、 用VB封装VBA代码,构建自定义的DLL动态链接库
2 z! [! E% q% Q/ y7 q. S$ \" W(一)ACCESS中实例代码4 c0 O( M& e7 }
下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
6 \5 ^3 Z: _1 p8 K) j# r) Z我将就这个实例演示如何将该实例VBA代码封装成为DLL。
E: O- C; L% v
1 K& a. b4 T; B0 H* v" s 9 k! z9 K( T/ B( @
# E( U9 V: A) d) G; Y9 O
 按钮单击事件代码如下:% k: L4 \# _% |: G# C$ i
Private Sub CmdFindnumber_Click()
9 Y) M5 P9 ?( M Dim strM As String '初始字符串
. o9 z8 t' a) e" A Dim strOut As String '输出字符串变量5 o8 |1 m, b: B/ l
Dim I& }. Z8 b4 S& U: i6 m+ G
! a5 ^+ V; z, C+ ^, s+ y' N& y0 Z. }
strM = Me.Text1
0 L8 u3 |- C+ N3 c, D'从第一个字符向最后一个字符循环,以提取每个字符9 I, b8 u" F8 Y9 s
For I = 1 To Len(strM)1 |$ A, G6 o* a" ?+ E ]
'判断是否为0到9字符,是则赋值输出
8 [$ D4 y& R. U- v( R If Mid(strM, I, 1) Like "[0-9]" Then
. w0 n. l% }/ n W/ u* L! F strOut = strOut & Mid(strM, I, 1)
% e- T+ p; i P End If8 ]/ z2 _, [8 e- N
Next I2 K* y/ C8 C2 R
'用MsgBox函数进行输出测试
- R4 a; T% O% u' V MsgBox strOut
0 T' G0 Z8 Q- q" ?3 f- g+ ], VEnd Sub
1 @/ L" @+ a: n" {2 |  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)
; L+ q$ y' I+ F! e. `' P4 \% V8 M
(二)VB封装实例中VBA代码
% p' l+ S( x+ S% c步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
4 `, Q1 P4 \0 ]0 P
9 U- q" m& |- j
9 B* H3 I/ x# {
. |5 t Q& Z$ K9 s
9 W! L `/ L+ x& G
0 T" z4 b9 ^: P1 p( \6 ^2 q% z步骤二:修改工程名,这即生成的DLL库名
, c* {7 E2 w g) d0 m0 G
7 m Z/ g+ W! Z, o! `& D3 u3 c i, i4 w
2 E q/ u- ~# F9 H# i e! N( k2 R, \+ y- P* [6 D4 Z* c5 k s
# `, \1 {6 |) o3 R7 L
步骤三:修改类名4 M4 V$ h) N/ C' l# O
, C, j9 B/ Q7 X) z
# p; R6 I, {( S( g: x! d9 ~' I' x" a( e% V& j+ `/ f
$ b+ n& e2 A% L: l9 P) W步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
' U1 p0 Q2 Z8 c- }5 E
( y2 U* J$ S% y6 R- y3 P9 S/ t8 D9 y
0 S4 r+ t( w' m6 p4 a& v代码如下
$ z) i& ?+ S1 N'将这前的ACCESS代码改成一个公用函数
: U( i% K, F0 T4 ~'输入:strPutString 字符串变量,需分离数字的字符串, q- R: b: ^5 r2 x' z: l
'输出: fFindNumber字符串变量,得到的数字字符
% v+ n0 L2 {; `6 K* vPublic Function fFindNumber(strPutString As String) As String& q2 v# N- U8 W# w, |* |
Dim strOut As String '输出字符串变量+ c- [, }: h! c( B8 e
Dim I
' M8 p0 ]6 ? W0 j3 \' K
" w4 E; y5 j9 t. m4 t8 q8 ` '从第一个字符向最后一个字符循环,以提取每个字符
9 W7 b0 ]8 q2 E- V; B For I = 1 To Len(strPutString)1 z' d1 i# t2 J4 S
'判断是否为0到9字符,是则赋值输出) |, U5 l1 q5 L- s- A
If Mid(strPutString, I, 1) Like "[0-9]" Then+ {& b+ v' f( y7 h3 ^% M4 j
strOut = strOut & Mid(strPutString, I, 1)( X/ T2 I! A9 Z" [- r% R& G
End If
J' O. M r" ~/ ? Next I& H2 u7 I! I4 O$ n$ B& q4 z! `
'数字输出
2 R$ n( v. g; _ fFindNumber = strOut" _8 }! T* c: h& r
End Function
* S0 w4 S5 T% ?, E' A1 P! T G+ z
8 V/ Q4 q, v6 W! I步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。( v. B2 B4 ?1 V! {. d& g
' ] |4 k/ A1 j/ u
三、 在mdb中调用自定义DLL动态链接库
1 W% I6 C- v6 l9 ^5 p+ F6 h& Y" ?0 k3 K; L
(一)新建数据库及窗体
) U9 s1 G7 W A! a新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
9 Y i! g$ B" M- d" n' W
% B) W& {+ d7 Y/ w( U2 p% k3 w( p
9 X+ ]- \: s& T: x: Q(二)引用【我的动态库.dll】库& ~- o2 D$ G/ A; a/ K$ F* T! u a
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
2 I$ |- }/ |( y1 ~% g3 W% z6 ~, M W- J u3 V
$ N7 v3 [2 W) j$ V
+ s/ ]3 e- \: M2 b& B+ u
; i9 D* F) e6 L$ i1 h
6 G: a0 q* R) N/ o& Y7 I! _$ }4 r. o1 [7 X2 Y* ?1 s; O4 a
% z8 f6 g8 q5 I* R7 R9 @& I! C
! N% ~$ J9 R) z( Z7 V* `0 [! @( ^$ \
9 U( H9 u0 {0 ?( l G* g! `
(三)在【CmdFindNum】按钮单击事件中加入如下代码。. G r6 Y' @4 c+ @: G& a' Y) p6 j
Private Sub CmdFindNum_Click()4 F3 H/ |; M X0 R$ J
'申明自定义类! ]- H. j$ V& M$ W( P- r
Dim MyFindNum As 提取数字1 x. E, [! o* l% S$ X5 @! N1 G
Dim strOut As String
' |' u; D7 g. ]+ G0 ^6 ~. U
, R9 V: P9 f" v% l8 O- w '实例化"提取数字类"对象
9 A8 t; s% o* q t7 Z- S Set MyFindNum = New 提取数字2 z$ i: ~' _; p I+ x
'将函数输出结果赋值给自定义字符串变量5 n, p" O6 R2 B0 U7 ^ x: f p3 k* O
strOut = MyFindNum.fFindNumber(Text0)
6 e" Q8 E t/ Y" n7 M g# S - N8 f- t4 U$ ~% f/ ?
'在消息框中显示
& m' M+ z( K2 Q4 r) r- W$ E MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"( r0 t$ _+ Q6 x$ i/ I) e1 `
End Sub6 N$ s% z2 z7 [+ b
) I2 Q" ?5 Z& G+ w9 o点击保存后,你就可以运行一下窗体测试你的成果了
: x2 O5 R. |* S, B, ` 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。8 o& c" F3 [ [& P! [: y
% M6 z+ s8 Z7 D$ B* ]
/ F2 c. J/ d1 X- Q, G |
|