|
|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑 0 H X5 n, X# o! n, `( M
* x" [1 J! g1 o- e' g& P0 O6 Z
VB封装DLL实例讲解(一)
4 J$ W$ `6 j, ?/ w: z5 J0 y9 `5 \' a |3 z+ F1 C# j
]6 c+ u: L4 ? X. I6 y3 u一、 DLL基本概念5 X# c3 I( t& P# q4 E0 K. X9 v" c
(一)概念
4 G0 j. r' L# _5 CDLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。* X7 Q5 S$ @; i0 t
(二)主要优点:
9 ^% c, U) d* O6 n/ `* i1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;" S( S# |! G, |' r6 S; f
2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
6 |( ^) K! y- x# ?3、从ACCESS角度而言,还可以更好的确保核心代码的安全。5 i6 {" v5 z+ `: r
/ W3 l- y5 z6 F, {2 |# q7 e9 e! q二、 用VB封装VBA代码,构建自定义的DLL动态链接库
6 D. |3 R7 ]: o" s# r- ` Y(一)ACCESS中实例代码/ O* p' ~0 h' J6 ?; O
下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
# J. d5 y) D3 B `7 J我将就这个实例演示如何将该实例VBA代码封装成为DLL。
3 Q' d8 [3 K! r/ u) U* e6 h; R 2 t" ]; p% M; J8 S+ G
3 g, P ^" @3 p ^1 k2 d2 t
/ Q6 Z% n1 C- |5 G5 l$ X q
 按钮单击事件代码如下:6 k3 j5 R- d' e+ t$ s, u+ g6 X
Private Sub CmdFindnumber_Click()
6 M: s; L1 `( {! g Dim strM As String '初始字符串6 E; w0 K9 |' e0 |" ?$ _: `1 y
Dim strOut As String '输出字符串变量: a% l$ K; v4 {8 ^0 S! p9 O' ?0 D
Dim I4 M9 @! h" ?# }" V0 z
6 {7 ~. Y8 K: ^% q
strM = Me.Text1. Q2 w& Q: Z: e( s9 S
'从第一个字符向最后一个字符循环,以提取每个字符
8 @ A0 h2 ~! c+ [, A For I = 1 To Len(strM); q5 @4 G4 r- w" E& ~" x* }6 B
'判断是否为0到9字符,是则赋值输出
: z; f2 g7 i& I If Mid(strM, I, 1) Like "[0-9]" Then
' {3 u" p: _( l+ L strOut = strOut & Mid(strM, I, 1)
* X# z- R1 n+ n6 c End If$ `2 ?. M( t9 }1 p* `$ U
Next I
9 k0 H1 R Q. n0 P8 L '用MsgBox函数进行输出测试
, h" A' W c( J$ V/ _ MsgBox strOut
0 T- }* y) }3 L& A+ V2 r. p. ^End Sub( A \5 l9 K4 w* X4 U
 以上代码还不能直接用于封装,须将其修改成为公用函数(过程)! ]9 X3 T* k X% U/ i
/ X( m( V1 i! H# E! Y
(二)VB封装实例中VBA代码
' y" r' \* y _ E( A步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口4 P/ i# S3 ~/ {; `
0 p) l# c' K( b3 N. m6 Q
" k' F1 {2 F) I. S, @3 \7 a& A7 }: h2 k6 R
' v7 V2 `8 g* u# V
, h( R+ h$ P x% g: f9 Y
步骤二:修改工程名,这即生成的DLL库名8 t r' s& p. C! \
) j9 H" a4 z( y; S! U1 v0 ^. G3 `3 R# o1 g ~
# a, u) M1 g+ g$ [9 ?0 M i% t$ s
3 w3 l4 @, i3 P; m
+ E x# Q" @" Y! M步骤三:修改类名4 a' g" w. H# e
# r# Q m+ D m, |: `) G( @
7 W: p( Z _( P/ f! {( A* M
8 T7 w( Q' A" z* H4 Q" p3 r0 U* i! D% Z8 X0 ]
步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口' v6 N6 _/ N. P% K9 ~
" Z( J# K1 S4 q7 f! S% Z7 ]4 I
; \8 `1 z+ w2 ?' s
: H% D# \, p. R* W; p% n U: J代码如下
, a' W0 Q) L7 Z1 U5 X' H4 F: d'将这前的ACCESS代码改成一个公用函数; l, P# C& t0 h
'输入:strPutString 字符串变量,需分离数字的字符串3 m. c( {) H8 S; m
'输出: fFindNumber字符串变量,得到的数字字符. f: V+ N3 e7 }
Public Function fFindNumber(strPutString As String) As String
# n) | k! N- t5 p3 } Dim strOut As String '输出字符串变量" a/ ?% P. F% l# l) e) j
Dim I; x$ W$ y$ H0 x
& T! h2 v! q8 q9 ` '从第一个字符向最后一个字符循环,以提取每个字符
% R8 k7 ?8 m% w# n1 S5 ]+ M For I = 1 To Len(strPutString)+ E) n/ {4 H0 U. R! {4 i! x2 d
'判断是否为0到9字符,是则赋值输出5 [( E4 x) e- a. l- F6 F9 D. p2 O
If Mid(strPutString, I, 1) Like "[0-9]" Then' [0 f$ o: N& T0 W) u7 r
strOut = strOut & Mid(strPutString, I, 1)) g* l: x: Y0 U# l3 G
End If, Z. g2 O- y' W/ r
Next I
- L- H3 _6 S$ X0 u; `1 X '数字输出
& K5 n, G' a! l7 Z* f! }# P fFindNumber = strOut" ]1 Q: _4 e3 ?& B# D
End Function
* |4 B* O7 n2 g) X/ R2 Y/ g, Q
4 K3 C: D3 h/ m! U5 w! y+ Q步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。
4 z; W1 ^: V* A6 q4 ]& m% {; Z( o8 ]' {( P
三、 在mdb中调用自定义DLL动态链接库
+ w, o2 ]5 f. B; c( R
3 G$ E! L4 m% B b" r X1 w( R g J(一)新建数据库及窗体
. s% K+ f( |6 t8 Z% L& h( h新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
$ M2 z% P& {7 a" Y* A }8 D. Y* z* b9 u q
! `9 w0 \% g8 Q" G1 }6 A# g
(二)引用【我的动态库.dll】库
+ O8 B- i4 {% @5 G3 Z& a3 |! \按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
8 e# `! L2 _7 `+ m- z6 ]; \
" l! ?7 q* g9 d( ^2 Y* Q1 C! Y! j
3 \: b: V/ L' t$ [# e$ a
6 ]3 H& E, y O3 }, b! }9 B0 I; p0 o' }$ `, m" y
, O" z, Q$ z& R( x5 l' S3 k5 T8 j% X3 p6 B/ y6 c- y4 Q4 o ~, a
# y: C7 [5 } `+ Q% I
6 D! }: H- \/ D: v6 F6 \5 M
+ @5 R5 h. h& {6 e6 i( z' l8 ?: \; v8 ~) t* }% B. ~) D, }# z
(三)在【CmdFindNum】按钮单击事件中加入如下代码。
( F9 T6 v2 J" q$ u1 mPrivate Sub CmdFindNum_Click()5 m( u- \- R, o* b6 |5 @; |
'申明自定义类
# r( y% z* W% M$ G+ _8 ~ Dim MyFindNum As 提取数字" e K' ]3 V8 D2 k6 x6 j
Dim strOut As String! y/ c' C, \1 H* @& e- R- A) v
& ?8 Y! g9 J+ P2 v& G '实例化"提取数字类"对象
( ]1 P* |) \: Z5 j1 @/ ~7 [ Set MyFindNum = New 提取数字& J: U1 X& y: m$ k
'将函数输出结果赋值给自定义字符串变量
7 T3 q( i: X) E; N strOut = MyFindNum.fFindNumber(Text0)
3 R0 ]% s, G+ D p 9 _" T( x7 ~8 g! ]( l
'在消息框中显示0 [5 Y6 _! z' Q0 A. S
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
/ i' l2 U5 P7 |) H' E! Z; SEnd Sub" c3 G4 y8 Z9 a* t% C& w6 W8 H7 b
2 L3 m6 ~/ z. p1 x点击保存后,你就可以运行一下窗体测试你的成果了
( c; [4 W. G4 S/ l 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
/ i0 p, `6 x$ h _
) T9 A) l. X3 q/ X/ P. W9 B! r4 E7 A# q/ d2 a) c$ h: F- Y
|
|