|
|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑
$ Q4 g% E6 B) a4 C' T3 r! \( r l7 K$ e* m- l; Z" t
VB封装DLL实例讲解(一)3 A9 k. \4 r- ^6 T
% `- H- y5 F8 b
5 W8 A; T; N4 ^. z一、 DLL基本概念7 L/ d' l9 ]6 ~9 ]( p2 P
(一)概念
U/ d; Y) y8 m3 Y- z. V; F: O' LDLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。0 O0 N, G0 a4 I0 R& d
(二)主要优点:
( {) n" l9 @' s: N: q M6 }$ Q1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;3 ]0 W5 l6 G9 O* @0 G
2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;; V( E* v) E( r+ F, t' n
3、从ACCESS角度而言,还可以更好的确保核心代码的安全。
4 S Z: f- j' c2 A m* `; Z5 E( n' y% Z6 d4 I) k+ M
二、 用VB封装VBA代码,构建自定义的DLL动态链接库
8 Q1 Z6 E6 {7 s5 b1 Q& W(一)ACCESS中实例代码
" f8 E2 I* Y6 y# f下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。
G# J7 ?9 F$ |4 T% f我将就这个实例演示如何将该实例VBA代码封装成为DLL。
" n4 i1 T6 a' t- n ( n! b, W9 y( T8 Y Q
0 N# x3 C) O% c1 U
0 ~& \+ M5 t5 Y1 W7 }8 _8 M# v/ R
 按钮单击事件代码如下:
: ]' M {: p/ e) }& ~Private Sub CmdFindnumber_Click()
" Q- {& V9 ]. `2 j" y Dim strM As String '初始字符串' o$ c8 u2 p% X* g
Dim strOut As String '输出字符串变量
: @! Q0 `: X9 N/ Y' A' N7 ] Dim I$ P6 m4 I! g& [2 \( \7 t* O
5 ?+ i/ P8 T. _) Y* u6 O2 ? strM = Me.Text1
, Q5 [5 e% B9 s% V. e'从第一个字符向最后一个字符循环,以提取每个字符 x( o1 i Z V7 Q" z: L! H* {9 k! Y7 [& _
For I = 1 To Len(strM)& u% M+ A/ [8 s& e9 |3 K
'判断是否为0到9字符,是则赋值输出$ q3 Z# f+ C$ r+ f) N) S! _
If Mid(strM, I, 1) Like "[0-9]" Then
2 u% ~- n1 W2 i; T9 O. h strOut = strOut & Mid(strM, I, 1)
5 m7 T8 c% \" m5 W i' y$ T End If b9 Z% L0 j% r8 U; V, f
Next I
3 i: f. O3 {. P; ~. @" [1 E* \! W '用MsgBox函数进行输出测试
; s* H }/ m: m4 ^; m4 X MsgBox strOut# S3 q8 H! m- @/ z" t
End Sub
! b. y5 K# E& G1 L4 q" C# \  以上代码还不能直接用于封装,须将其修改成为公用函数(过程)8 e0 ?* ^2 S5 m/ s
1 p1 {+ T. M) g [4 M) n2 a3 z
(二)VB封装实例中VBA代码; ]8 S' ], X( i- q/ d* P
步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
& i X/ i3 u4 ]' n" H- Y4 A2 O5 q3 f( `: h7 S
/ H7 b# _3 g, o$ [" c. D( H. r; M8 ]4 S/ e
5 b( c$ B& f0 m* U; ^6 n; ]
: A: a6 I0 T8 @2 m! T步骤二:修改工程名,这即生成的DLL库名
5 d) Y. f8 b: g; t! u8 c3 W2 z6 ]8 a5 J1 a
2 t1 X3 ?1 M) N" m" U5 E
. l2 _7 D5 N) O1 d' E9 P. |
# R. l7 Z0 D4 z/ l# C9 k" x% `9 F4 t+ p' s
步骤三:修改类名
5 Q7 H9 A0 F+ w* E. M- u6 g# V' \$ E
+ K) S9 F0 W% s8 m9 U* ?" }0 V
) B0 s, @, u, Q/ y3 u
/ k: q$ I5 e" C8 L. c步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
7 L9 Y- I3 X% Z( ~* f
* M, C; C& e& C" A
) p8 w: p, W# k. X2 i' Q. I0 M9 R6 ~& n5 y
代码如下
# P' l6 [2 |" d, E'将这前的ACCESS代码改成一个公用函数" q9 ?* S3 \$ g5 L
'输入:strPutString 字符串变量,需分离数字的字符串& c: P2 p7 }, k" S9 ^, ?
'输出: fFindNumber字符串变量,得到的数字字符* l" ]9 N/ {5 D) A$ T# S
Public Function fFindNumber(strPutString As String) As String. D/ {9 f u4 P# }) e- q4 `
Dim strOut As String '输出字符串变量0 S* s: q1 C: |: h1 y3 ?
Dim I7 i, f; `8 } ~ L- M
! ^$ X- b; i, L; r
'从第一个字符向最后一个字符循环,以提取每个字符( G4 Y. ] T/ N% A3 j) d
For I = 1 To Len(strPutString)- u6 X r$ D( V) O; T6 D' b* H
'判断是否为0到9字符,是则赋值输出8 j+ l3 J% ~- F9 W, N7 B
If Mid(strPutString, I, 1) Like "[0-9]" Then$ u2 k; G- @) f. P8 g
strOut = strOut & Mid(strPutString, I, 1)7 y1 F0 g, n" v) i4 q& b2 c
End If9 s6 _- W1 [$ B1 e, y
Next I" l& |0 X4 t9 I2 u
'数字输出
v% O" _0 {! x2 m0 O7 X fFindNumber = strOut
* Z1 p( ]" H1 k& M% ?End Function$ X$ `; E1 N- P' S; V8 _% v
O' n0 a: S3 O* L8 M0 y2 Q步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。! F7 J' X. i* i; [5 _7 n) l
5 Z2 J& {) I* Y! ^( j- `
三、 在mdb中调用自定义DLL动态链接库
+ k1 A% H7 Y8 \) E3 I5 E/ Y o Y9 X, B$ x a
(一)新建数据库及窗体
" K; d# J! j' R- ]) y: e新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)' N! I; u- @* i9 i) G8 u. x9 Z+ E7 ]3 [) n
: n! T* H, q; Z1 e V5 ?# y5 J8 ]- I& s! \0 r" f; i
(二)引用【我的动态库.dll】库, e: J" \- c& g4 ?3 W
按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。
' L$ K2 u/ [4 }/ ^
" t9 I" x7 a/ g
; U" M; b, y* X# X; p0 a9 p/ V
6 s% h9 \5 h' l U7 T" q; H m& c' A' V7 {5 L) A4 P4 _ s
7 }6 `1 c( |6 ^4 f5 A- Q
2 M5 _' ]1 g& l
" i* f# M- M( C) o
/ x+ @9 l, M+ E$ N% [! @- M5 o4 N( L6 P1 h8 t
9 Y f0 Y9 x+ e0 ~9 a9 g D(三)在【CmdFindNum】按钮单击事件中加入如下代码。2 x) s' ^: }. C" J& u( K
Private Sub CmdFindNum_Click()9 p% a8 z$ E$ O6 N0 Y" S4 A
'申明自定义类: s8 q1 Z! _. F- R
Dim MyFindNum As 提取数字; v+ n3 E- f+ K, Y. C$ [
Dim strOut As String* @, Q' G6 X% B! V2 m
& I/ G5 Q T+ @6 Q
'实例化"提取数字类"对象
/ W3 f, V# j, u* M Set MyFindNum = New 提取数字: P w1 K9 g0 M
'将函数输出结果赋值给自定义字符串变量
) K8 ?5 Y% [! `- J strOut = MyFindNum.fFindNumber(Text0)
9 a, c5 u% G3 S. U+ h$ S0 ?0 t7 \' N * x& l+ q O' \& U
'在消息框中显示1 W8 o0 F) f# A! z
MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
# m) l2 c# {1 REnd Sub
5 ?$ K& I G' b0 S) A0 p8 T
/ l& D9 e" Z+ b' ]6 p- u点击保存后,你就可以运行一下窗体测试你的成果了
, s+ x7 l5 I& \. [ 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
; L, c' t" B# a% w, b$ `5 m
/ o9 G) w. V# g2 E* c7 T! e6 y9 y E
|
|