|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
4 P$ G5 U4 a, y7 I1 n7 h8 o* _
* s, K' Y; g( Y' r \VB封装DLL实例讲解(一)2 ~# H1 h+ z3 N1 @, \, t2 z# y5 o
% w+ J9 p+ V# P6 Z$ L4 _3 c. W4 x3 i4 h3 G
一、 DLL基本概念
" w7 L$ U8 w$ N0 y# V2 d(一)概念
1 w2 X/ _; I1 v: C7 CDLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。
- `' }' ]% [3 Z6 R9 k(二)主要优点:
$ x4 ?% y# @9 \- @+ h A- G% V1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;/ E) G4 n% k$ _
2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
3 _# G' {: H- X( ~3、从ACCESS角度而言,还可以更好的确保核心代码的安全。
7 Q) y7 @* d% R) s
. s" P, e9 B# |& k$ U二、 用VB封装VBA代码,构建自定义的DLL动态链接库
7 p: H7 d: Z( [/ }(一)ACCESS中实例代码
0 R/ w2 k$ _% r( w" Z下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。, I. U4 H+ i6 A' l" E
我将就这个实例演示如何将该实例VBA代码封装成为DLL。
4 y+ f0 g4 U! R) y- y z. w% Q/ M
! q& J' U! i; ?% e* q+ P
& E4 o2 Z: U! x' j) {
6 @( L( |8 d I# `4 y1 r, E 按钮单击事件代码如下:
! |, ]$ A( P! S" b, O. DPrivate Sub CmdFindnumber_Click()
: o+ j/ j2 g3 v" ` H! b Dim strM As String '初始字符串
6 K, `. G0 _! F4 |+ O0 W$ I$ z& A& u) T Dim strOut As String '输出字符串变量
" c0 r5 U5 L1 N" e Dim I( h n( c# F0 I! V3 K- ?
6 V" ^' M2 p9 v; \, R7 s1 T9 G# k9 E2 o strM = Me.Text1/ K) H' o" `) p7 h) I
'从第一个字符向最后一个字符循环,以提取每个字符
: Z( T ~( n' k" P2 } W For I = 1 To Len(strM)& o. K) I- \6 n" ^2 E/ j! f) G
'判断是否为0到9字符,是则赋值输出
1 }+ `3 E3 F b7 ]" v/ J! q If Mid(strM, I, 1) Like "[0-9]" Then
4 H: t! y3 k( {5 k" U3 F strOut = strOut & Mid(strM, I, 1)
9 e. m# H3 i* O End If
/ R9 t- |3 ]. L6 x6 E Next I
. Q" u" N; k2 X, ~- n( Q- n7 {8 g '用MsgBox函数进行输出测试
: [+ V L3 J) I% a; s& R MsgBox strOut0 F# d/ _ \( X2 v6 R
End Sub
% w/ D9 s2 f' l  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)
8 h' w& I: x4 \" v4 [1 R
! F$ S9 D9 ?" X, R(二)VB封装实例中VBA代码% h! h( o2 L3 |8 ~9 N: }
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
9 A: r& T' w6 K5 @: [8 _* g: h p8 u. F
8 J! a8 I: y/ `
A! @" p, z! N- f1 ~! i" z
7 k' o- `3 h, W) f; h* a+ n: T$ S F' a
步骤二:修改工程名,这即生成的DLL库名' S: j' ?+ c9 K& P: u T/ b1 L, q
* x/ q7 q# a& C+ Q5 r, f2 T5 i; U4 \/ W
7 I* W4 ?; a7 ?5 R, E% X
. \6 b6 S4 D& {& j+ |5 u2 R# Y1 G$ n
1 Y2 v/ G' z5 Q: y( g0 B/ J
步骤三:修改类名* ^3 C) V! z4 P( b: ~4 n s% B
3 f" n3 ^4 w+ F* P& ]1 m$ Q8 d" O
1 L1 ~7 A7 a; e/ w0 f$ [5 Y+ a: Z6 _# Y0 o
- p+ M6 R$ ~+ L1 y步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
1 G" n! l: G E. I6 A
% s) g; }/ K$ _7 h' N( R4 @3 f! T2 ?+ u$ J- K2 z
8 |% L& I! Y$ W2 v
代码如下
5 C$ G- f Q: B+ A'将这前的ACCESS代码改成一个公用函数
! a* ?; o; S2 c, Y! j'输入:strPutString 字符串变量,需分离数字的字符串
5 O! U. R: K' N! z% g L" R'输出: fFindNumber字符串变量,得到的数字字符' K, b: C3 {) w, Z
Public Function fFindNumber(strPutString As String) As String
- g' F0 x( H1 [) Y7 x/ z. k5 K Dim strOut As String '输出字符串变量/ V5 W7 C6 g3 C/ L* |. K# o3 h
Dim I1 k2 c/ a7 L! T! {. X& O
+ M D! \% g+ p* A1 W
'从第一个字符向最后一个字符循环,以提取每个字符
7 D' U% H) u+ Y: K: P9 H! \ For I = 1 To Len(strPutString)
& e( ^2 v5 |4 \# y3 Z. G '判断是否为0到9字符,是则赋值输出
) x) M9 S2 T2 W! k* ] If Mid(strPutString, I, 1) Like "[0-9]" Then. D* L* e7 b5 G! D& z/ F
strOut = strOut & Mid(strPutString, I, 1)
9 Q9 d! _9 y7 } End If- h6 }& q( U/ ]7 ~4 j$ F
Next I0 q0 \. H4 h! d
'数字输出, P1 O6 {: [# l* E8 h& C' w
fFindNumber = strOut; ]" f% P! {7 O- D* S
End Function- d- w+ p0 x. M+ g) C
, z. k8 Y& Q8 a+ v9 p
步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。2 `7 G' V+ s c1 S
, h3 j$ b' i, ]7 j* \, w- R' e) W三、 在mdb中调用自定义DLL动态链接库( S+ b/ [0 F) f: _
" [) ^4 U$ A% a4 p' K3 p$ f( @3 H
(一)新建数据库及窗体
% x5 P* J7 j, k; J7 W& c5 f0 j新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
7 [: f* F. M" T1 ~9 z: ?3 P: X# Z- h% k9 m+ Q+ x9 z
$ W& Z, Y ?4 I, D* G4 a) C8 {
(二)引用【我的动态库.dll】库
+ o, s _: w' C按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
# {2 T% q0 w* n; N7 N/ @9 X" g0 d! V' M: T; {5 ?
* O* e- T5 |# u2 D+ s* K/ k6 k/ [. E2 Z B; M7 a" X5 o
- y# ?- f3 b- _$ a0 {1 s
8 }* C! j8 E+ Y3 ]+ D, g: \
) c9 m* B+ Y% ]; `% `" i# h- g
9 h- g- N: z# T J6 K7 t2 s
2 k l+ Z9 K4 X+ D4 M+ e8 e* M! T3 P) K8 B, O4 g/ c3 L7 ~# `( d
- c- O4 u6 c2 F! G/ E4 ~(三)在【CmdFindNum】按钮单击事件中加入如下代码。% g- ], T" `0 y" Y" k. t$ I$ I
Private Sub CmdFindNum_Click()
3 d; H8 p+ e8 n8 w" w '申明自定义类
; L" V9 k; g6 O7 C7 O( n Dim MyFindNum As 提取数字9 [; J" o" f3 r1 S* j; ]
Dim strOut As String! ?9 a% a' Y- {: `8 [* k
8 C7 K7 V9 k. r1 M '实例化"提取数字类"对象. w) L8 u. A/ h* t: U z- Z
Set MyFindNum = New 提取数字# h% j" I' S, ^! J" d
'将函数输出结果赋值给自定义字符串变量
- Y/ w+ O' c. ^* r strOut = MyFindNum.fFindNumber(Text0)" m4 ?. J4 w/ s
7 W0 U! g; ?+ [8 z$ P '在消息框中显示
( A; q/ v: f9 F' g' o5 H2 e MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"0 U) \& {; T3 ^
End Sub
7 C p% L. |3 V; }5 k6 I/ d( m$ M s$ J9 h$ w
点击保存后,你就可以运行一下窗体测试你的成果了, `1 o2 h5 U, D* H$ Z- ~
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
& G9 g$ z0 H9 m1 m Q3 Z6 d" i0 z U$ Y7 q! I R
+ N' E3 i& |" \* R7 h9 d |
|