|
|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
9 }) K" e9 v& Q+ Z! F/ `5 S" K0 ]. [- n% v
VB封装DLL实例讲解(一)" s; o2 l! t# I% ]5 \' \3 h
4 x2 @+ `# w2 `. H/ c& _# f0 E) [
7 G' l8 w0 M/ [7 f) [% [一、 DLL基本概念
) Q- D$ w) k" J7 R( ]3 _' s, ~3 G(一)概念
: t. d$ P; d( N( tDLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。
; e3 m P/ G, v$ O+ Y9 F(二)主要优点:
( l% r }. Y4 Q& n1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
. o6 W% d7 M* z& g4 U' H2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;, ?. @5 s* I" ]+ `* H; _* X
3、从ACCESS角度而言,还可以更好的确保核心代码的安全。6 z- n! w- O, Z
! ~3 U5 i* y9 D$ F二、 用VB封装VBA代码,构建自定义的DLL动态链接库# O! {+ N* {2 i( s7 v: \$ S- x- ^! C
(一)ACCESS中实例代码
/ _: q& c E0 j9 v7 b# M% F下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
0 I$ L z1 W! t我将就这个实例演示如何将该实例VBA代码封装成为DLL。; ?5 t8 X- F7 L9 G
( ?$ [% P% j6 d* q4 l 0 r5 l+ s$ Q0 x2 c3 f: ~. Z
) B8 |0 s9 s A, T$ P 按钮单击事件代码如下:
, t/ ~; y; a$ [Private Sub CmdFindnumber_Click()% M2 N$ d6 y: p3 S- v
Dim strM As String '初始字符串" K0 b! t/ z# |# E3 w
Dim strOut As String '输出字符串变量
, d$ `* Q6 [2 s Dim I
" X! T7 S. n" ^1 ^& K+ |* k & }& n) n8 O2 j! t6 o! s
strM = Me.Text1# [. x! f( { Y
'从第一个字符向最后一个字符循环,以提取每个字符
8 B! Z& ?0 N; g, E c# f+ F3 f$ | For I = 1 To Len(strM)
B s* M/ L. B) A3 m: x; A '判断是否为0到9字符,是则赋值输出
# L' s( N7 o* \/ e) L5 g* ] If Mid(strM, I, 1) Like "[0-9]" Then6 t O/ Z+ [- f/ X. S
strOut = strOut & Mid(strM, I, 1)
" z3 B$ b8 C: o/ J6 \ End If0 F2 T/ @: d" t% K7 X' B' f: K5 H
Next I
) C- H' N# K4 P2 v0 x1 g '用MsgBox函数进行输出测试" z& R$ T! i* `. ?" }) M
MsgBox strOut" J$ S* i; o$ a. ]1 d
End Sub' q* n; S) q9 W7 n. c; g
 以上代码还不能直接用于封装,须将其修改成为公用函数(过程)1 @1 r: y$ d& Z1 [! h
, f' n) Y" U$ E7 |0 M3 N) E(二)VB封装实例中VBA代码
$ j* ]9 |" ?. q2 j; G8 @6 S步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
0 w( Q2 g, k2 Y2 K+ a* B4 [! i+ D4 F& v2 z& M! c8 Y6 M) T
# |" e& }) \$ x8 v
2 n, C' { B7 t) X' e. o6 R
8 n! B, f& \- ^4 I) I# n$ t j: H B* c* T+ Y' b2 D
步骤二:修改工程名,这即生成的DLL库名. F6 V5 L# [7 p
* y. A7 O) i) @. R
- |' c1 O! _7 m, G9 t& H
9 p* A# M6 S+ K0 v$ [% E; W
8 p/ | R0 r+ @$ u5 F0 m }) z+ E4 s8 |9 Q1 w: D
步骤三:修改类名9 |% `& o( y, {4 K' i$ _" c
+ v0 D9 L3 e2 p) v: _
! g* j- H* J' H+ y/ V9 P& \& b9 v' i% T2 j8 c+ d
6 J# {0 r! T% Z: G) Y( Y" i3 f步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
/ G! i+ X+ ^4 m/ j; ^
8 O" Q! |, Y2 Y; I; |, o% x. `% j4 n, o! d% T( ~7 t" l3 r
$ k; L1 a3 W- K% m$ o
代码如下- M8 y. [5 L' S& Z2 X$ q G, i
'将这前的ACCESS代码改成一个公用函数8 b: H2 Q8 X: J; o
'输入:strPutString 字符串变量,需分离数字的字符串
% p( m' _. q; H3 Z: y'输出: fFindNumber字符串变量,得到的数字字符
7 q# t1 Z+ \; M' F9 b$ hPublic Function fFindNumber(strPutString As String) As String B7 A% y6 J ]" f& k
Dim strOut As String '输出字符串变量& M" I$ a- J* t& x- p# E6 @
Dim I" e* \0 ]- Z" Q
+ e3 d# X9 @' D3 h0 u* _1 S1 B '从第一个字符向最后一个字符循环,以提取每个字符
- q9 Y3 J5 i7 `: k1 K6 G& @ For I = 1 To Len(strPutString)) W* T; M' }5 x' `% \4 b/ \
'判断是否为0到9字符,是则赋值输出2 O F/ P! E6 Q- ~) s% H
If Mid(strPutString, I, 1) Like "[0-9]" Then
3 o6 N9 Z6 c. N" j; u! L4 @ strOut = strOut & Mid(strPutString, I, 1)
$ `( _6 |$ X$ B! | End If b& ]& ]7 {8 Y) q" v- e% P" `
Next I5 r+ m( d5 X: A3 e( ?, w
'数字输出
6 i! a6 \( l" ?! [% S5 ~ fFindNumber = strOut; b0 b5 k! W5 l S3 p
End Function
1 B+ t$ u- C8 G
) u ?1 H; G: a7 q# Y% |步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。
) C; C4 k+ H, Z8 \3 o% ]
4 n7 X1 s, u( Q# U6 {2 D" y三、 在mdb中调用自定义DLL动态链接库3 _9 X/ F0 P* G0 N1 H: a9 _- l
2 N1 i* q0 _: u% g% p(一)新建数据库及窗体
0 g2 w" g; K9 `新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
* `- h" @9 m' I3 K
4 [1 I+ q* y# D6 o1 T, `- y( a
+ d+ d0 c+ }$ _3 {! w t" m/ Z(二)引用【我的动态库.dll】库# U+ ~) ~2 a! p5 ` d
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。- b' r, u. y* T/ H* a
( s- F2 G+ Q0 ?
& L% s! F B# D8 {1 D" {: d# j7 G! t
6 W. ]% b( C/ V4 j$ l, O4 I1 T# W7 b# C |
' [; {" a" N1 q7 {, b3 R: p, b# z, ~" H' v. ]' ~/ J; E
' Y0 s8 N0 A8 `/ m8 {$ y6 p, k9 t; W% D5 D) [) s( M: ~- V y: Y- X
5 B! p- H& d Y2 e. ^4 p
' ? c0 M) T P. W. _) d3 _(三)在【CmdFindNum】按钮单击事件中加入如下代码。
8 u. m) z7 z1 f4 N/ D5 @( P) {Private Sub CmdFindNum_Click()+ ]8 ^; H( r1 M; O* u
'申明自定义类
$ P( F C j& d( c: i! T i Dim MyFindNum As 提取数字
2 `8 c1 ]0 g, B) C: ^% {' H Dim strOut As String
- J1 B% X0 v7 x1 p+ j1 ]$ ~ 3 T& B& ]2 U4 {& X( _
'实例化"提取数字类"对象
: x& i3 J u# [/ N# g Set MyFindNum = New 提取数字; C9 U% z- L& m. s* a7 S4 A- \' a3 b
'将函数输出结果赋值给自定义字符串变量4 n, h' N% l C
strOut = MyFindNum.fFindNumber(Text0) l" z3 ^" D$ u* D# L: J
8 v! H+ q) i+ W0 Q/ y
'在消息框中显示
' _% d" G" v- y MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
2 p- f9 ^3 ~2 m$ W3 ?End Sub
* ? ^; O& N% m5 I
- L# _& J) A# Z6 r点击保存后,你就可以运行一下窗体测试你的成果了/ v; A5 Y7 S# ~8 ^5 O0 N# y- A
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。) V: h. I' ^2 u& J2 P
7 O- Q/ z* D4 l% A1 z
0 d0 k% C3 F# Y0 @5 ?
|
|