|
发表于 2014-5-25 11:37:42
|
显示全部楼层
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
. G4 z7 \" `/ K& V; X5 E' x9 k
! l0 q; u- t* a1 xVB封装DLL实例讲解(一)# z5 l; S8 E; s* L" @
& y* n% M$ S4 m* Z
! { g/ B' @% _
一、 DLL基本概念( ]5 S J. T! l. `& s
(一)概念3 Q+ D- u! q" u1 f' Z) R% c
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。+ @, |8 C( s! P- U
(二)主要优点:. z% ~6 C& m4 N' F! J* n
1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
5 h K8 ]/ b+ C+ p+ I- Q2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;! h: C( {* V+ l" s9 z- O ? L: r: Q
3、从ACCESS角度而言,还可以更好的确保核心代码的安全。& C7 V) O, g5 O% I' A7 Y' r
5 [& @7 O3 f2 u/ n/ N( J& w
二、 用VB封装VBA代码,构建自定义的DLL动态链接库& K8 G6 P9 c$ v
(一)ACCESS中实例代码
+ Q0 x' w6 [6 }$ G" u9 Y4 j下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。( P& X! \6 [, ?" O* V
我将就这个实例演示如何将该实例VBA代码封装成为DLL。
6 _; ^- l5 ^1 l0 L) i# r 4 n) ?8 [: H3 s$ _. Y/ [
r. q/ ^$ B* B" W+ u* }# m, h* q! K( E5 j2 U- V5 D% n3 _( Q
 按钮单击事件代码如下:
8 q7 W) h1 n; r+ vPrivate Sub CmdFindnumber_Click()8 o' h9 z- d3 P0 y- x
Dim strM As String '初始字符串) }2 Y: h- x) H0 ^6 V9 X& ]6 H
Dim strOut As String '输出字符串变量
$ v3 I$ V5 n9 }/ I Dim I
/ G9 c' ]9 q6 c0 I
% p& [, n: Q! G2 l9 y& g1 w* d strM = Me.Text1
! b8 f- S+ x4 y5 g9 U5 T/ `! u) [3 X'从第一个字符向最后一个字符循环,以提取每个字符2 L: H* c4 B/ E/ ]$ G
For I = 1 To Len(strM)5 \: ~1 B( ^/ t% s! w# u
'判断是否为0到9字符,是则赋值输出& U; Y' @$ O" f e) X2 ?8 {8 `
If Mid(strM, I, 1) Like "[0-9]" Then
" O# T4 Y1 Z# I' g3 x4 l strOut = strOut & Mid(strM, I, 1)6 \+ Y/ g0 e- x( K! T: Z
End If
+ [2 C; F2 u W! o0 ~ Next I- j K# A9 i9 o( a# E
'用MsgBox函数进行输出测试
f! P# C- G7 q MsgBox strOut j m, S: f K! n+ k! ~5 u
End Sub
. F% B# v) ^$ x' l  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)
6 ?, s1 ~( o% A" T: L; @$ C" n/ _& N2 `; R
(二)VB封装实例中VBA代码
, }" O* @$ k, v2 M步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口 K+ L5 Q* a4 y1 a9 }5 s
' j) _9 b" ]( k' i" o) F D9 Z, j; W- ^! g; V; s5 k
: }9 A, i, o2 x8 S0 G
/ `+ L ^1 E# b! v* q5 p; Z# {: [: C* D9 @
步骤二:修改工程名,这即生成的DLL库名2 t! u4 w, c$ g8 M3 F. ?5 o
# N8 J' m" f2 S+ z p8 q
) a; x: O B. U8 K1 l' i ^: Z$ G+ n5 c: t& Y
1 W- Q9 e( d+ o1 }3 L) U% C5 z4 }' c* _
步骤三:修改类名) Y& r3 O, |6 b! ^% C
1 y. N* S1 ?) Q- K8 R4 ]& o" A" z( d6 n0 w
4 u* O5 f! A% z4 b2 f
$ o3 P& `, ?) F: W3 ~: H步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口+ [6 R1 p% v# [' V
% O% F8 Q( m$ A
1 a2 x2 ^8 X. ^, f- o
: R8 U! O3 C1 |1 H* w* H9 U代码如下
1 H8 u [2 ^8 x' P( P% Y0 L/ R'将这前的ACCESS代码改成一个公用函数
% ]' `# o/ v5 c2 t9 }, P# m'输入:strPutString 字符串变量,需分离数字的字符串1 w1 B$ [! o# S! q' Q$ A
'输出: fFindNumber字符串变量,得到的数字字符
# g0 j s; t2 x- XPublic Function fFindNumber(strPutString As String) As String
+ ~! h: J# l- o B& u; q Dim strOut As String '输出字符串变量
, q* D4 \, r# Q Dim I
- p' x6 G# a4 {( o* ^ & d& s* |5 G" y4 f& S% W
'从第一个字符向最后一个字符循环,以提取每个字符3 ^ w( S; }: O" s# u
For I = 1 To Len(strPutString)
6 n* \/ x! w+ k# [/ p '判断是否为0到9字符,是则赋值输出* {0 }- V3 p. p
If Mid(strPutString, I, 1) Like "[0-9]" Then
7 e+ a) ?& `# I3 }% P! G strOut = strOut & Mid(strPutString, I, 1)* S6 n8 g5 ~0 Q. H. C t/ I& U3 ~
End If
- D- I3 X9 T p( F; a7 ?" j Next I
4 @0 F3 i2 F+ i1 }* B" i '数字输出. ~" M3 Y+ K# K" ^
fFindNumber = strOut
1 F+ n6 ]6 a; DEnd Function* G0 ~7 s- ^3 F
/ J; w4 }" j8 Q9 |步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。% w5 T8 A5 U2 c& j
6 Y& A( N, ]: T/ M4 ~- [三、 在mdb中调用自定义DLL动态链接库9 S5 z; t, ?8 O
% A# B% ?; v* A* W2 ^5 C( W2 L% n
(一)新建数据库及窗体
) z: [. M2 m! ^: |' @' K新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
+ D2 ~3 f1 I2 \( c
4 P) p ^) x. L( p
; F/ r. t- O% r& N) `9 u(二)引用【我的动态库.dll】库) C* k, x* v& u& Z/ e
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。' j* R9 L4 S- @# W( Q: j2 w
! o; W, \* U/ |. c G
0 l2 n L/ G" k' k' a! ]7 t' c/ U& T4 D9 U; R7 ]
1 d; d9 l! X6 J" W% z. u( g
* X$ n2 r8 h, \6 L+ _5 ]+ Z7 C" m# h
) S: S* Q$ G- j* M. T5 A7 X* W' u3 M, U4 @# N5 S$ c a5 G1 }
: ]6 K1 z* `, F |
" t; c5 U2 M* `(三)在【CmdFindNum】按钮单击事件中加入如下代码。9 L: C: o4 d- O- y# V% E/ ~
Private Sub CmdFindNum_Click()1 ^8 z1 Y& G& H0 B2 w) ^, Y; ^- T; G
'申明自定义类4 u$ u8 Z0 O" M" {6 n
Dim MyFindNum As 提取数字 {" p# }" [$ E0 L$ y
Dim strOut As String" E1 C" B, q) o3 r5 u* Z
" \/ k7 P( G6 A: Q% |; |! Q '实例化"提取数字类"对象
8 i4 s1 G J- B# Z# Z Set MyFindNum = New 提取数字
6 r7 s4 _3 y" W* y/ Y% K6 B '将函数输出结果赋值给自定义字符串变量9 b; ^6 n; R5 w" ?9 H/ ?
strOut = MyFindNum.fFindNumber(Text0)* L7 V$ E" k8 E) N
/ X2 l j+ E, L2 m* k" x
'在消息框中显示( e: a# x9 c' M; q* _* }" _
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
" Y1 v5 _& `( x% XEnd Sub
6 S: Z: m7 p2 o! ^$ K
" ?# R3 C4 E/ V点击保存后,你就可以运行一下窗体测试你的成果了# ` q: ]( ? S# |6 P
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
( @; l" i- ?% V8 R( T( _' C' j2 K& e+ Y/ d2 z
) ]' D1 E* ]* } r2 p* O/ v
|
|