|
|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑 : m! p3 D) ?! p; ]8 N3 g7 T
5 x0 _+ I$ [ G0 G! m, s3 C
VB封装DLL实例讲解(一)
% a/ L. Y" s5 y5 k
: M9 I+ z: {3 N; J
g/ Q( s6 G; J6 X一、 DLL基本概念
( h# ]; f+ f4 ?/ z- Y(一)概念
2 J" w6 y1 }, c. L+ ^# g+ uDLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。+ |4 l e5 a( w5 [( k# J: ?
(二)主要优点:
, j; a* o" H/ l+ X. d; Y6 r1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
# [9 Y' l1 x+ c- T/ S2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
+ H! x. N) R7 q% Q, n. s5 z4 |3、从ACCESS角度而言,还可以更好的确保核心代码的安全。9 X" P' B7 Z. V* l. K# G
9 Y+ z3 t- K2 [6 |' V/ G1 [7 A" s; ?
二、 用VB封装VBA代码,构建自定义的DLL动态链接库: X. i- ?/ @7 \4 t9 Q
(一)ACCESS中实例代码
. v2 ]0 u: @9 ]! X- D$ {/ S# w下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
9 x- R& ~& M s: P我将就这个实例演示如何将该实例VBA代码封装成为DLL。
. D/ j( E n1 S+ @
. u" F* N$ M$ D1 J8 k, ?% y! G. y
1 r+ `$ Q* I o% u3 X2 V
4 Y) u b8 t. { 按钮单击事件代码如下: V# e$ K$ q/ D: g0 d% H' e! L
Private Sub CmdFindnumber_Click()9 Y% _4 Z+ G( p! m
Dim strM As String '初始字符串" h; q! r3 d9 H! K7 I
Dim strOut As String '输出字符串变量0 ~1 G: |% F! x; L' L; Q: N$ E
Dim I, w+ w& N7 G; Q' i# w
) S$ ]) T+ c9 { N
strM = Me.Text1
8 K* Y' K/ _% X* x- ?'从第一个字符向最后一个字符循环,以提取每个字符" o8 E8 ^8 L! {$ k1 Z: I
For I = 1 To Len(strM)- R/ d9 g! h L& [5 v( K
'判断是否为0到9字符,是则赋值输出
) G# v4 n _2 ~2 y7 z If Mid(strM, I, 1) Like "[0-9]" Then5 J# ^; W M3 t$ ^% H
strOut = strOut & Mid(strM, I, 1)
' d0 g: G( R. C4 }6 X End If
% z, g7 |" ]6 z- H Next I5 E N5 ^: s5 O& r4 T
'用MsgBox函数进行输出测试
' J' B0 [* e+ a5 @ MsgBox strOut; v1 z# o* c: f( M
End Sub" j1 X% k6 l% e
 以上代码还不能直接用于封装,须将其修改成为公用函数(过程)
- m W1 S4 s0 m8 o' n! K# _7 s5 S3 r# R1 J6 `
(二)VB封装实例中VBA代码4 x7 H3 B+ Y" b4 p/ \3 \; D
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
: g& g; f# `8 j) @2 x" E
( W5 N- E E) E3 L/ U8 [
6 Q r( o R! u) m1 z1 I
$ U. d6 D' Q5 M$ |& ]; M- S; J2 l4 `: d1 k
0 F% [# x) L' s/ N5 G
步骤二:修改工程名,这即生成的DLL库名
# b/ G7 J* c5 ]% A' n+ J3 @# X7 b, F7 W( B' p% N+ E
+ S K( R8 Z7 J* ?; r% X. Z- e" T, E* E8 H
/ m- Z' g4 L7 a2 J% e L
& b, s; u; ~0 q& G4 {4 a# o步骤三:修改类名
% w4 Z& ^( U% k: i
' P# t7 M8 V: H( T+ m& j) U6 }$ {+ Z# Q# Q+ d# @2 n+ E- |% A
5 G* Q! ~* b5 X! {+ S! m% f: k, `
4 x* i; S6 b. t. v' R7 { S
步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口% d+ [/ A' q3 P
! ?3 w1 v( K3 m. T7 r5 ]( u& r: c
$ e; B0 r& o* ~5 ~7 t) T; X( v4 v( K) Z7 Y% @; H; d6 I
代码如下
4 V" Z3 H& Y# {* W* \& D+ U( n+ g'将这前的ACCESS代码改成一个公用函数 R; q A# C! @' e8 ~/ R
'输入:strPutString 字符串变量,需分离数字的字符串
/ y) W# [& s( R5 \'输出: fFindNumber字符串变量,得到的数字字符/ H0 ?' E( G3 g
Public Function fFindNumber(strPutString As String) As String
7 }; A1 y! F1 X Dim strOut As String '输出字符串变量
/ B7 b& _1 B- c7 @' v1 X9 b Dim I) d6 _/ J4 q6 y S* P
9 J2 J6 ~# j& W* w4 ~0 f" B4 o1 y '从第一个字符向最后一个字符循环,以提取每个字符/ ~$ u5 I4 l# W$ Y3 x/ \! |
For I = 1 To Len(strPutString)
, w. Z3 U- \8 w. [7 K '判断是否为0到9字符,是则赋值输出
5 R$ ^% Q5 E) ]. m" g If Mid(strPutString, I, 1) Like "[0-9]" Then
9 ^# s& j7 o" U strOut = strOut & Mid(strPutString, I, 1)
9 w1 `4 }% j! ~( N End If
5 s0 e7 Q; G( x: w0 c' ?) o Next I( d+ V. Y# k6 `" h
'数字输出
0 r9 n+ B8 \ R# R fFindNumber = strOut0 y# I& ]7 F; q; r9 b- @
End Function
! I& ?" `& k- D
" i& Z8 l7 I* Z. ?步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。0 a4 _8 A. {. B. f, q# N7 h f
% p# k8 Q! |& V三、 在mdb中调用自定义DLL动态链接库
_3 r# \ ?' Q# P- ?. n: X* K5 G, x
(一)新建数据库及窗体7 X' ]/ J3 n+ Q% H: _9 J; l5 }
新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)' v5 M0 K( |2 w5 r& o: T4 F
' Z5 Z! o( B$ v* R9 q
" M# w1 C0 ` ? @% Q N
(二)引用【我的动态库.dll】库
/ M, i& C7 |5 l8 |. Z. _4 Z按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。% F- x3 K8 m) n }
4 W, p8 B( v, ~
$ g) {+ O) [" ?) V
( ?1 P7 \ R" t5 p; i i0 ]5 e( ]* |. t' v. m. M9 ?# Z
$ T5 ]' o1 I+ L; Z4 o9 V
( h9 J# ]7 C' {" g2 O# {
1 I" \- \7 S$ }- w/ t
) l! m' {& I2 x I/ d2 u% j
5 _- ?1 x, \# P. v+ r+ A) P
& w2 b. p: L, p0 E
(三)在【CmdFindNum】按钮单击事件中加入如下代码。* |" R7 v) G: R7 n
Private Sub CmdFindNum_Click() u5 ~% N o3 E
'申明自定义类
9 }* Q# [' r! d Dim MyFindNum As 提取数字
, f# o* A1 v. I Dim strOut As String0 J, E# u) C: b% R8 G5 R1 g
" F) O% E6 J, @8 B: t
'实例化"提取数字类"对象8 }7 k4 U% `' q$ b) _% o
Set MyFindNum = New 提取数字
6 c/ x# ]* V4 @) v( \ '将函数输出结果赋值给自定义字符串变量" g% W) i7 i, N$ b9 l- n0 a: t2 T$ s
strOut = MyFindNum.fFindNumber(Text0): S# d* F+ a) D0 \
1 ^: k, C$ W2 R @8 e8 f
'在消息框中显示 y! c) g' N/ y- q8 k
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
/ l4 x' m/ ]9 O. W# v1 O, a7 h2 xEnd Sub& j; {0 g) D. b# a' Y" A
8 `5 m: e, T. z4 C! ~
点击保存后,你就可以运行一下窗体测试你的成果了' J# c& j/ P" P$ i1 ?
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。8 e& I% }# t4 ^: g1 |7 z' ]
& n6 m8 j1 Q& r% w" ~
' a5 V" {) w9 J1 C0 }4 B- }- n4 B |
|