|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
9 v* o: t6 W* j' {9 x8 w, N% L) H. C& j" A( p6 {5 b9 o" C( ~
VB封装DLL实例讲解(一); o6 d6 {5 O0 |2 k' Z
& I- Y, O6 i9 O& t
! u* J" M8 H9 {2 ^一、 DLL基本概念
1 l, W1 E1 F( \! e(一)概念, ^5 Q0 q, W0 y5 k; j
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。
{3 ^2 I) B A+ r: A( B' n h(二)主要优点:
% u" H' X* m/ k, O9 _. B6 p1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;
1 l' J, S: Y" o9 q. P- y' {6 B9 m2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;
" s( q+ R. T6 y- O8 ~ G! Q- l3、从ACCESS角度而言,还可以更好的确保核心代码的安全。
+ |% W2 C! B* W3 j
/ o7 u" t8 q" g' g3 ?: P) b* b二、 用VB封装VBA代码,构建自定义的DLL动态链接库
6 V1 ^% K2 c% i8 R g) G(一)ACCESS中实例代码
2 [+ w# z, Y) J) Y下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
1 x+ J' }& Q1 |, H8 U2 E! H我将就这个实例演示如何将该实例VBA代码封装成为DLL。! Y( P3 D) i, H1 y5 q" N( O/ E
6 t% Q9 P' b) B) C9 h
1 V9 E: b+ P8 A
" ]' Z* f7 x+ M% I: u6 H; s 按钮单击事件代码如下:
3 {$ D0 w! {! d% @! |! z' \Private Sub CmdFindnumber_Click()4 R: j$ g; E: n+ J* V
Dim strM As String '初始字符串
6 x$ l& s! p0 P/ ]' G Dim strOut As String '输出字符串变量
% k0 g6 S @! M) Q# ^1 k Dim I, P: j6 s( @1 I) y5 q
( U' Y' v# W$ n5 V/ H# ?# k* W
strM = Me.Text1
; `9 ]" k6 A* T'从第一个字符向最后一个字符循环,以提取每个字符# V9 F1 F- I3 _3 d8 N
For I = 1 To Len(strM)& I% H! {0 p& z; G3 T1 J8 b- l' W! d
'判断是否为0到9字符,是则赋值输出1 ^6 _! N9 Y' l
If Mid(strM, I, 1) Like "[0-9]" Then
: Q3 z5 r& }/ r" n+ q" a strOut = strOut & Mid(strM, I, 1)
# d8 E3 x" q$ g8 I) D: x# v End If/ u) u( K, c7 b) e1 c* ]% ~% v7 M
Next I
: |; K) z4 k4 E! X; y '用MsgBox函数进行输出测试
]4 u; h3 M2 W9 O( v8 N MsgBox strOut, p& _, _. ~; n; |2 D% j
End Sub8 P4 |5 M; t1 m+ M9 }
 以上代码还不能直接用于封装,须将其修改成为公用函数(过程)
1 P! `. T$ A! g4 j7 O: P! Q1 {# M( w7 G$ n( H
(二)VB封装实例中VBA代码$ l% Z3 i! m$ ?
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
' ^2 A' T6 r O3 L+ v5 o1 T
: m5 r( W9 k' E8 d/ O% q. B1 u' L) ?8 u0 Z2 C
+ z* G# t/ j- w1 O. a# ^/ ^ Y0 @ f" u" L7 | `+ k
Y3 [/ ~/ A4 a! C/ L, \步骤二:修改工程名,这即生成的DLL库名; W Y- O& k$ m" d5 }
. r+ [6 n" f9 K, B/ y3 Y
. R. T3 |9 r, }
2 J! y0 `! m0 g4 E
1 b- `6 v8 @' P% m+ _& l8 _
1 n+ k9 c; L, x6 Y- y! r/ I/ `步骤三:修改类名. Z! B: |: [( X: f3 ?
6 P4 q/ H7 v: q, r7 S' g& B5 q/ a' I3 Q! Q
- u3 S. L8 T, V8 x
, G* f/ a0 p) }8 `步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口9 v) b) _3 c& \# ?, k
. J9 ?# N% K0 W( ?% a$ R0 l
. b) B0 }- w& L# G& O
6 _, E5 U( F3 X' R. @0 ?7 K代码如下
2 ~) v' \/ i# m+ t' B'将这前的ACCESS代码改成一个公用函数/ |: C* E+ Y9 Q% E2 j
'输入:strPutString 字符串变量,需分离数字的字符串) \6 G2 }* u1 H: i. C' u2 u
'输出: fFindNumber字符串变量,得到的数字字符. M" \7 |7 K0 i) j9 q
Public Function fFindNumber(strPutString As String) As String* _: c9 v$ Y- H
Dim strOut As String '输出字符串变量& M0 f+ k6 l: T5 Y6 i9 Y
Dim I% y/ T9 K5 w, c" m: s* n$ X5 J
# ^% o" k" s. p '从第一个字符向最后一个字符循环,以提取每个字符" W" W3 F( i. ~
For I = 1 To Len(strPutString)
. j2 r) U" R0 r) y '判断是否为0到9字符,是则赋值输出
3 q l# \9 P1 Q0 a6 G If Mid(strPutString, I, 1) Like "[0-9]" Then6 t$ e- \7 c( t9 I. g7 f: p
strOut = strOut & Mid(strPutString, I, 1)2 O5 {1 }1 j- A) }4 a, g
End If
0 Q$ `+ f* ^& A, e, U Next I
9 r5 w% D' ^. q0 r$ j '数字输出
& u6 e7 @# e/ X7 Y9 X8 H fFindNumber = strOut7 S) U3 ^6 L& Y; H4 p
End Function6 T: y% e4 O q
/ |3 c5 B* p( t9 W4 a4 O步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。
/ g! A# P& n# w" U2 T# x- N3 w+ p. K, y% U3 O3 M3 ]. P$ U# g! p
三、 在mdb中调用自定义DLL动态链接库4 d- K7 V* Q C. _+ q6 I8 e
1 o' ]/ P3 ~0 H9 |5 M
(一)新建数据库及窗体- y+ k+ R- m$ j- X, e% Q5 }( [
新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
. B' P9 v! T% g8 ]( Y
( a7 X/ K4 {' a, H6 s s/ q
@+ S4 x3 m( n/ i0 u(二)引用【我的动态库.dll】库
/ J; ^& G! a3 u; N. M按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
' I" K& F$ \; _* w& S& X# ] k- Z; Z4 T* K4 v
: m( i. s% ~; K& S9 A
; |2 e; C4 [5 `, G' v
# W% K( A1 \1 C8 F' z0 l9 h
7 f# ]# b3 ^* d8 W4 q l
0 u( n) \ a ]% f* x; [! Z) y4 Z$ q# h' ^6 b
$ ?0 K1 A, O6 j8 `
0 a0 h7 _* Q: g V4 {% D& J! J+ w5 w* \# O
(三)在【CmdFindNum】按钮单击事件中加入如下代码。9 b* I- D( b, l$ ?7 x2 q
Private Sub CmdFindNum_Click()
5 [0 @8 e4 S( y }4 w- d' w '申明自定义类
. s8 N, K, P& @( [ Dim MyFindNum As 提取数字
9 Y, X. g6 I6 f Dim strOut As String& `+ o9 a8 o! e, }7 G$ L
3 }, K3 C1 |8 G$ D, C '实例化"提取数字类"对象( s$ a3 t* l2 l. g
Set MyFindNum = New 提取数字" r8 v5 S7 D( ?
'将函数输出结果赋值给自定义字符串变量3 L, F6 M6 X1 v9 \0 {, [
strOut = MyFindNum.fFindNumber(Text0)
& @9 D; s9 s9 G- I2 r$ { 7 m- @' `7 T3 e/ i
'在消息框中显示9 P- O0 X) y2 B; c" F
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
8 U5 G# y7 z% \! s0 m2 eEnd Sub6 [- D6 f3 T# ^* W2 M/ O
J( Q& }6 D/ t点击保存后,你就可以运行一下窗体测试你的成果了
" S$ K3 i7 `' ]0 C+ [4 O/ w1 E 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。' Q7 c: B2 J& C3 V$ f
& o/ D9 t7 V7 \6 b3 m) A
: @1 `% [, n4 H: U* z0 | |
|