|
|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
# r" `5 O: |' t$ m& G9 D3 V; G i
Z1 K3 r/ n% c& y! H- aVB封装DLL实例讲解(一)& J+ ~5 m0 N; y q
: l6 n( g% v) D. D5 ]: U2 P5 E" M% d/ V0 @( j; o
一、 DLL基本概念. u0 I% g* Y- ~. t
(一)概念4 }. w7 e7 i! u9 V% P0 x% c% Y, E
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。
& {" S' d$ o! o/ r(二)主要优点:" d! V$ W+ l6 [+ b% e
1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;+ L+ S/ X* U- v7 O$ a8 O
2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;1 v2 Q. G1 M5 X* e' L
3、从ACCESS角度而言,还可以更好的确保核心代码的安全。 D6 j. V( q" R: Z) y( a
3 P! j& q4 M8 |" f4 w' Y) \0 O二、 用VB封装VBA代码,构建自定义的DLL动态链接库
' J0 h( W3 n1 j8 L(一)ACCESS中实例代码
4 w# p0 F% z& S: }& I下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
: ~# ?) K' o! {! U我将就这个实例演示如何将该实例VBA代码封装成为DLL。$ G5 R. y. B/ f
0 K& T5 [1 `8 J. F2 a1 y. _
4 y0 N+ B1 [" O0 Z1 a
: i3 ^5 s8 \: e. `/ ? 按钮单击事件代码如下:$ y2 v; s+ ?: G1 [
Private Sub CmdFindnumber_Click()4 u% i7 }' v9 q5 D8 c, W
Dim strM As String '初始字符串
0 ] o. J3 ?- Q+ b+ b' I Dim strOut As String '输出字符串变量, l L: W0 m4 f4 C
Dim I1 ^. {0 {& y) N: ^, P" d& q) I
+ j+ z9 G3 {6 f
strM = Me.Text1
% u/ U: P5 _& P! @) g- i'从第一个字符向最后一个字符循环,以提取每个字符
+ z$ S* f2 p$ ?$ n4 W8 T8 R% | For I = 1 To Len(strM)* N1 f; N! e0 b- k8 B3 ?
'判断是否为0到9字符,是则赋值输出
; y7 F, r& [0 U s If Mid(strM, I, 1) Like "[0-9]" Then5 ~: N3 g( ~) {* d
strOut = strOut & Mid(strM, I, 1) {7 G8 C- M$ [- J
End If
# B: v2 e$ V" ~6 T+ S" d7 N" Y Next I
) H4 `7 Y3 Z+ M6 m5 I' f: T9 Q( Q '用MsgBox函数进行输出测试7 A9 @+ q% I! d1 \/ @! n
MsgBox strOut5 c- G7 P/ |' s" A/ X! t3 c W
End Sub
& Q* g+ l" }/ U! u* o9 ]  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)
( Y/ N4 z2 T V% X1 J- V
* w. B3 ]5 F# C2 F9 {(二)VB封装实例中VBA代码! o6 E; J3 c! ]8 n" s: S' B
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口& j0 R* p5 U; f( \6 F# C
% W( U; o* X5 x" y2 d
9 E; Q, m: K1 g+ @) H- L
, S0 `5 o& V* E( ~. P- V1 x! m. q3 M
1 c/ J& J6 T9 |& V4 r& e9 s. V8 V. L/ t
步骤二:修改工程名,这即生成的DLL库名' e9 f0 N( D+ m6 h* E! _
5 l b1 k" Q+ I0 p7 u% V! @" Y/ l- V6 N5 e8 d
d# r7 i! J- I5 k6 C
: }$ F" `: m' ^ i A- ~ `, h. I* r0 _9 D3 V- U
步骤三:修改类名
9 e$ i% q+ |* s1 I' j2 V3 \0 V& \1 I( k2 N
: _& F% g# i8 i, s
* O. X! f6 F( J h0 t
$ ?, J# P4 y. d8 q步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口: w- n4 k( K. M4 c3 M2 m
- b6 S5 \0 |$ c
& \, w# c' C* J. l0 I/ ]
+ Y$ e. v5 _( p& n
代码如下7 f& n6 |5 \ H& a( _9 m+ W" Q) e
'将这前的ACCESS代码改成一个公用函数6 u8 y% `: N/ {1 x" h
'输入:strPutString 字符串变量,需分离数字的字符串
2 P1 c$ C4 `: J3 m'输出: fFindNumber字符串变量,得到的数字字符( N" p7 I* c k% T u8 L
Public Function fFindNumber(strPutString As String) As String
! d' Y8 A: F3 `. V' O" Y Dim strOut As String '输出字符串变量
) H- S, _) a: R% y6 u Dim I
9 q/ G, o9 k9 G$ X5 K! K- }
. Z' r! _2 m5 K! j: s: g. O ~9 \ '从第一个字符向最后一个字符循环,以提取每个字符
- E' J) Y% S$ k2 k* |% | For I = 1 To Len(strPutString)
: B0 I& y3 e* M2 j& s '判断是否为0到9字符,是则赋值输出% s) _6 _& J) ]( E2 O
If Mid(strPutString, I, 1) Like "[0-9]" Then
& o2 g+ f" M8 o3 x, P# D strOut = strOut & Mid(strPutString, I, 1)
7 W; `5 Z3 b9 c$ M End If( ~' c+ A, W$ ~) Y
Next I
/ S. o0 n7 K. V# P* o5 N '数字输出
# E6 H9 x; F; N. v( B. x fFindNumber = strOut; {2 m% I* E! s8 Q4 K! {6 C
End Function
2 n, Y! p6 C" V7 q: t+ g" A8 r/ B; z& {* o; P0 B1 j
步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。' D2 L) q7 ~7 H& M, h" [
/ ~& O+ L' ~3 [, t: c( v; G
三、 在mdb中调用自定义DLL动态链接库2 W- j( ? h, I2 e) [
- o' V. D: A& r. O, }, C* j
(一)新建数据库及窗体8 J) I9 r+ G% i. D% i4 ~3 _) N
新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)" S/ q# s S0 E. m" c
! n4 P' l9 ]- V: u1 ]* x( I
0 {0 j5 ?, y7 U8 A1 _' h/ K$ f(二)引用【我的动态库.dll】库+ N! I# K0 g P
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
6 b3 ^. y# ] v% {9 Y. c# g
+ r9 [( e& F# f* l
3 L0 Z4 Y) m7 B* ~ |8 ~+ p
7 R; V# r: M! h% K( f7 d5 S0 L- n! m9 N0 x. z, p6 @) l
7 w5 W0 C. P8 b
, p. e# u2 ~4 n& E" ~' q, _- k/ c. d* }) U) D
2 z0 V8 b1 t9 }2 ^8 m4 Q# j. V: o- i K) J
/ q3 c& U( U" c9 o1 p% m
(三)在【CmdFindNum】按钮单击事件中加入如下代码。+ x9 ]* k! g! A R) n
Private Sub CmdFindNum_Click()
9 g" g# {7 ]% N3 u& }5 R '申明自定义类/ J$ o. c4 O" J
Dim MyFindNum As 提取数字% s- X }4 I7 K) A$ j3 C
Dim strOut As String% Y7 j% `7 {, c! Q
5 h/ L* W- H# Z5 o: f
'实例化"提取数字类"对象
4 U9 U! d0 o" U8 v4 y7 i Set MyFindNum = New 提取数字
1 A2 v& ^- Q" \- { '将函数输出结果赋值给自定义字符串变量# U7 N- B7 A0 x% ~
strOut = MyFindNum.fFindNumber(Text0)
; b0 b4 Q1 [# L4 @
/ z# n" g, w8 ~! D6 j+ p '在消息框中显示
i$ q8 X( j& w8 C8 Q MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"5 c' `; T7 H! ^0 ]
End Sub2 K2 J& B4 z- ~( Z, l9 u
( z8 Y/ ]1 k* y( J' [ Z* S( |点击保存后,你就可以运行一下窗体测试你的成果了
9 b7 ?, V! D( I( X 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。* ]5 Q |) v# |' |! b( }9 B
' f( e( ~ z$ F& |
, o$ n+ Q6 z# _' G! E7 i
|
|