|
|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑 , b' y. e: g7 S p4 U, q" N1 l
2 b+ O7 G, @+ I7 r0 C, s# l4 \
VB封装DLL实例讲解(一)
1 {2 l8 J0 F4 R) L ^
4 h/ }; F. \8 z
( ~3 c6 e+ g" X8 i9 o- `一、 DLL基本概念
3 {5 k% G4 P$ g: r* e/ O. i! c(一)概念, M) @5 F$ d$ E) j* R/ \
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。
+ L3 J" G% X% x(二)主要优点:# T0 l4 k) }! H, W
1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
) h# U/ Y- @- M$ m# o& o4 M2 n0 D! i2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
" t7 ?/ |" @1 Q; S) d3、从ACCESS角度而言,还可以更好的确保核心代码的安全。 j! r5 l1 _0 s. Y- y9 \
: f7 \: Z4 W2 {( |9 t二、 用VB封装VBA代码,构建自定义的DLL动态链接库/ X, F, J* S8 H' |8 c3 y
(一)ACCESS中实例代码$ d- C' t3 U% h! x) S8 ?. i: B
下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。% k: V* S$ Q0 v- o. X2 h3 k `
我将就这个实例演示如何将该实例VBA代码封装成为DLL。0 F# l) } |! {4 I' s. i
- x. M9 B0 l1 o. @& Z
) B8 B0 z; w+ H4 O$ G4 N
; |" [3 T: P) g, l" D( _ 按钮单击事件代码如下:7 {- d! [: T' ?
Private Sub CmdFindnumber_Click()
8 `) B# g1 ` L7 o. j Dim strM As String '初始字符串8 z. M* [$ [/ g$ Z v
Dim strOut As String '输出字符串变量% _; T( A3 v+ y' e* T8 f% b
Dim I0 [9 F( Z8 B( ?
$ r( |% C1 o# S% K strM = Me.Text1- v: \4 o: W' H( T& y) S2 O; m+ B5 [
'从第一个字符向最后一个字符循环,以提取每个字符" A: w' n9 }) V; D( f
For I = 1 To Len(strM)
% ]8 z( @. o& p# m+ E8 \( ^ '判断是否为0到9字符,是则赋值输出 b8 s+ h; Z, W3 l* U: M* Z
If Mid(strM, I, 1) Like "[0-9]" Then- u" l' D6 u- `. x( Y: x# s
strOut = strOut & Mid(strM, I, 1)6 E+ {" _/ v8 _+ }* V
End If
( N6 X6 ^: t: }) D; w i# ~- d k u Next I: c) Y% S, b& Y, D, V
'用MsgBox函数进行输出测试. s. l: [6 X2 e) ]- c
MsgBox strOut
, p- U* M9 F% d( l$ f! dEnd Sub4 X9 N* D; m7 z) h L A
 以上代码还不能直接用于封装,须将其修改成为公用函数(过程)! G3 M' c9 S$ f" b; F( e
v$ [9 D e$ a" r$ C/ p
(二)VB封装实例中VBA代码+ i( R y9 y* L
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口1 b8 P% z1 U# X# f7 \0 w6 Y7 Y+ ]
, F# i4 J: A$ q0 p# {5 `8 Z, P
0 y5 t8 I. Q; ^+ O' T+ D
. S$ T% e9 U3 i' r/ `# P# u. E1 s$ x* N4 j
, h! w! C8 L+ s8 W9 \
步骤二:修改工程名,这即生成的DLL库名
# }; F# h& L- G" {. n% x/ j& U# p( {" H
2 s& n+ M; I0 P% x7 k h a* F/ X+ N! u
9 P( z* E: R$ x# {
# u7 K Z. m) `1 X步骤三:修改类名
8 K* L( Z! L! L d; p
7 w# e% C# p4 y, H c7 ~! p) |2 g( \& ^- X% X
" _! r/ a" O! y6 _: B$ y) u, k! R- b6 J, X% S' y
步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
, q2 A; c3 {! ?9 l" ~# m8 ^* O: j! R
; s0 @% X2 c% [2 I2 w6 x' e1 T$ s+ }
代码如下
* \ B9 E9 U$ S# u7 {'将这前的ACCESS代码改成一个公用函数
; z O6 h! r! k- E$ G2 y'输入:strPutString 字符串变量,需分离数字的字符串# t3 R( M. E2 l- P
'输出: fFindNumber字符串变量,得到的数字字符
4 Q, l0 S" ]8 m6 E' R2 R: }/ s4 TPublic Function fFindNumber(strPutString As String) As String; a; {$ N4 g) l
Dim strOut As String '输出字符串变量1 M# f3 h. \9 f3 z8 B0 h0 N# |9 Z
Dim I" `0 B; r/ w: T0 @# F) \
1 T: F) a8 h8 B/ L9 R
'从第一个字符向最后一个字符循环,以提取每个字符
5 j, X4 c4 w, ?/ d. j For I = 1 To Len(strPutString)
+ s% Q- J2 G1 o. ~) D/ a '判断是否为0到9字符,是则赋值输出! c: i# p/ O. {+ @
If Mid(strPutString, I, 1) Like "[0-9]" Then
- K) k L: S+ y2 s" E strOut = strOut & Mid(strPutString, I, 1)
: R7 B, t" a; E& G' J End If% Z: c0 M1 X. P& x
Next I7 t. u2 Y, d! ]- l; ?
'数字输出
$ C! M6 m0 i: a! s0 P7 `: H, n fFindNumber = strOut# x& P. O S- {, ?- w w( U
End Function
, U8 w, O$ h$ T' R. D6 j
. e; L7 k- ^8 h" ~! Q; u步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。7 I' j, `% J+ }! H( J+ D
' P! l+ r% S1 V# F, g% o( ^三、 在mdb中调用自定义DLL动态链接库/ h% P4 b# e$ M# @
; Q8 I1 w9 e6 ](一)新建数据库及窗体
2 v( }$ m2 w/ v5 `( j ~7 |% B( X. I新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
% u! g" g" D' m5 @. ] e" s& u# v9 I
+ p5 q1 \5 y7 j8 h$ b1 W* p
(二)引用【我的动态库.dll】库& L' ]# a/ t! r F7 Q7 A: y$ D
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。& r6 f0 @7 J& R+ F
( u( M/ t' B2 g1 \6 j9 Z
9 ]& L/ q' E, l0 }5 }2 }# w% r7 w/ R2 n8 \
! ~9 Y9 V' F2 j% K- }; K0 `4 ?' p" k
7 i2 v7 f/ Q) A( Z& v1 I5 E* l1 I% i1 m8 g4 X. K+ m1 i+ X
1 }" Y' J+ A3 ]
% N2 ]( o, W% q% [
9 I1 M2 B4 p' I( H3 ~8 v7 v) ^(三)在【CmdFindNum】按钮单击事件中加入如下代码。
* g( ?. _" y; a1 H( {# v. @Private Sub CmdFindNum_Click()
9 a5 }- O3 k& L- g( P0 ^ '申明自定义类- T7 R$ } s# b0 Z; A
Dim MyFindNum As 提取数字
$ p) [8 T0 O7 _; q/ d; T- L( j1 d/ t& ` Dim strOut As String
$ O( [( j0 ~7 ^7 k- m' D- l ( L1 n O6 P7 l% L2 S8 [
'实例化"提取数字类"对象
0 R' [7 s w! T! t, q- d- A Set MyFindNum = New 提取数字
5 h1 d4 k( n! Q '将函数输出结果赋值给自定义字符串变量
+ y7 c; E2 T5 k% d; x% ]& b strOut = MyFindNum.fFindNumber(Text0)! K) T, L1 ^! h9 }: n- d
7 x1 Z$ E& }, K4 ~! {% y
'在消息框中显示% Q' C$ g* g& D7 N9 S$ u
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
, U3 S# u+ m j" X. E- ?5 HEnd Sub
% \! h* j1 K0 e- h1 G& L, {5 x/ Z4 F9 y
点击保存后,你就可以运行一下窗体测试你的成果了
' ^3 a" G7 e7 z. S$ M3 V" Y0 k 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。- j) X7 q( H( ]7 H# U' |7 L A
5 c5 [" ?# t0 B
8 K% X* r# L- Q; `( C5 z1 e |
|