|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑 4 | y& W. B+ ~
8 s7 Q3 S1 n/ F) o1 d) oVB封装DLL实例讲解(一)
8 }8 C! q& H, p) T) `, p ?
8 K$ Y9 P9 a8 z; o
- B' `- D( q* r一、 DLL基本概念1 d z' ^7 V0 o5 p% u
(一)概念
# K; s* r u! Y8 n5 o$ w! N1 ADLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。! D X7 \0 D S6 ?, ]0 s" A
(二)主要优点:
/ f5 k9 Z% X( Q$ c" x8 S( T1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;2 i+ r3 d% U0 w. B3 N' S
2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;9 f8 r' U/ s ?
3、从ACCESS角度而言,还可以更好的确保核心代码的安全。6 v w# j0 [& W, Y3 M) H4 B
* p( F: E8 S. `- K1 n- S二、 用VB封装VBA代码,构建自定义的DLL动态链接库9 `2 q1 ^. E( \' X1 x; M
(一)ACCESS中实例代码
9 K/ n0 p# _# D' c下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
$ V Z* V2 V6 r) Q& V我将就这个实例演示如何将该实例VBA代码封装成为DLL。) L! v9 T% s' Q) T
+ y% A# H5 ^: Y- X) b
- r& [: x( u( U: M
6 g: ]6 Q4 b# R5 t
 按钮单击事件代码如下:' T, i$ {4 [6 M+ g8 N5 I" j
Private Sub CmdFindnumber_Click()7 [5 o6 T+ {0 P. v$ p9 x4 S0 f
Dim strM As String '初始字符串
" A4 c/ Y) `8 j6 Z( b2 z9 P Dim strOut As String '输出字符串变量( j6 n+ {/ @: R% O
Dim I' _2 f6 C6 X3 S% ?* k
6 @# g# T e4 m' D strM = Me.Text16 r% U# t+ K0 y1 D1 w# E
'从第一个字符向最后一个字符循环,以提取每个字符
, i! t; b z( l& Y For I = 1 To Len(strM)
$ Y- z" O( l' [. t0 F7 L '判断是否为0到9字符,是则赋值输出
: P3 ]8 p6 U: `% m) B& G( U5 t If Mid(strM, I, 1) Like "[0-9]" Then
$ C) R* o; w, X strOut = strOut & Mid(strM, I, 1)$ E+ L O4 T' ?3 Z8 P9 U& X6 C
End If
/ Y5 C$ F$ ^+ { Next I( [# n$ x( e$ b! y* ^
'用MsgBox函数进行输出测试
/ c( d/ u3 S4 c' [% S' t$ V. t& K MsgBox strOut
% G9 A. @ t. S& ?3 z O! Y# fEnd Sub
% i/ o3 }- x0 W3 f- J7 w  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)- n5 D, x7 {1 G1 c; }
0 x N. d, O) g7 N8 C, k8 @. a
(二)VB封装实例中VBA代码
% d1 Z: \; ^& k% Z步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口) O( c% ^0 N* ]0 {* Q8 E
$ a! m- N( y( v* e
' B5 Y- x+ `" X! F
! N* i1 y/ J* \4 V e$ |- h8 w4 R9 \# r" p/ M; T3 L( j
% i3 C/ D/ x8 r& n, z
步骤二:修改工程名,这即生成的DLL库名
0 Y* ^" {1 X. Q3 {2 i# D) o1 Q" e7 G# b' |+ c: B2 o
7 L* E& ]( k$ Q( \
5 `+ r5 l0 F, Y+ |- e- W+ w
/ ]/ p. Q3 j+ |
2 K* k+ b( ] ?步骤三:修改类名
0 }' d2 L' s- R& z1 ~- H- w* D
7 ^& i7 O, e, d4 {1 d
3 z8 X! n3 s% }- f8 w. x) ]; R6 f3 g" Q; ], Q6 V
* O) v! }1 n i, a7 h0 N( A
步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口! t/ v7 D5 f1 J
& w& |. {8 C. W/ d( h- L
% q! f, O: z V/ Y: b) H4 \3 @: C: \! O0 ]6 ?
代码如下
/ G" A2 x8 @& [0 k8 {# F'将这前的ACCESS代码改成一个公用函数
# l$ e0 u9 u$ u: a'输入:strPutString 字符串变量,需分离数字的字符串. m- d: ]& D L0 Y8 q
'输出: fFindNumber字符串变量,得到的数字字符6 ~) Y/ o, ~ B0 Y
Public Function fFindNumber(strPutString As String) As String) {3 M6 J, c; P' E7 | v
Dim strOut As String '输出字符串变量+ s; g# j: H# Q2 n! U/ L
Dim I, x! N6 r% L2 C M" c4 e- O
; O* Q0 v- Q9 [( z- f& e '从第一个字符向最后一个字符循环,以提取每个字符
" _; s0 J0 M4 x0 F% L' Q" | For I = 1 To Len(strPutString)
$ j$ ~; }1 N& Z p- y# i7 z0 ` '判断是否为0到9字符,是则赋值输出0 g7 M* S/ N: F2 }5 r) Y
If Mid(strPutString, I, 1) Like "[0-9]" Then5 \1 r, \- _0 Q- E
strOut = strOut & Mid(strPutString, I, 1)
0 u1 }3 q$ n$ k$ O \ End If
* s) l- @2 d( a( E& \- y Next I" l6 Q" B0 I. _" I7 `. x2 t- Y5 U1 w
'数字输出3 G$ e7 C! h+ V4 e& ^) d
fFindNumber = strOut' @3 [1 ^% v" P1 ]; A. o
End Function; }) ~! T$ }6 |+ w) u3 r' O
' J' ]0 W4 F& p: q
步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。- T( _7 a4 T1 |3 }& J, c
8 q2 f. m6 g! m, W; y! R/ t- t三、 在mdb中调用自定义DLL动态链接库- b4 {7 U( t& p% i# |' w6 r& |7 x
6 ~' V1 z8 A# r: N% A4 D7 l* G
(一)新建数据库及窗体" N8 R* u6 E# ~* E) j2 Z
新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
5 p+ r5 J9 S( R- Q
y$ {# |3 P% u4 L6 I. U( _% f8 d k* f6 M. v! ~
(二)引用【我的动态库.dll】库# @3 d" e4 L8 R7 @6 o# `
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
5 _! B* i; F. {. b* X
( p- A* o0 L3 A' \
5 `, \' E+ L6 P$ R; ?
: f7 C0 q9 p6 [7 I5 u- u. V( p( i7 ^8 N) _- f: ?* W8 J
, u F9 T3 n4 u/ S+ _: E1 P9 U& j1 @
- f% M* W2 e8 Z( Z7 r
3 Q7 y5 w! ^- A; x
6 w4 O, a% o8 H
! F2 G# R! k) z! ?6 D, Q: Q c8 A! G7 Y4 S+ h, V. T
(三)在【CmdFindNum】按钮单击事件中加入如下代码。2 [. l5 [- W% s6 N, B/ m
Private Sub CmdFindNum_Click()
* D. G9 [/ `+ y4 y; |3 o '申明自定义类
6 F# d3 k2 B6 @- M Dim MyFindNum As 提取数字7 x( d+ G. W( z: U1 n \
Dim strOut As String
: ~/ y: t4 x( c. W2 q+ X0 O# g ( O5 s, G3 ~3 m. ~( x3 e& [- k
'实例化"提取数字类"对象
+ E9 o1 k- t9 l) ]) W' o Set MyFindNum = New 提取数字3 r+ ?# w }% }3 i5 u5 c
'将函数输出结果赋值给自定义字符串变量
9 P9 u; i: Z: W: g6 g; E; V2 Q strOut = MyFindNum.fFindNumber(Text0)5 H7 i: e6 h. c
7 u5 G3 g: O E8 [* ` '在消息框中显示9 Y8 R7 [+ y* M1 Z+ v `! g
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"- y% p+ s; ?! @( M, v3 ?
End Sub, y7 U5 y2 Y" ]. W" `' s3 l
% A4 \2 i0 i$ S
点击保存后,你就可以运行一下窗体测试你的成果了
- L1 o/ X M, J 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
# F; _( }* y+ a8 V4 {
1 {% H' R- f8 O( B w
% p# c {$ @- Y7 Y4 h8 s6 Z1 m4 Q |
|