VB调用DLL.docx
《VB调用DLL.docx》由会员分享,可在线阅读,更多相关《VB调用DLL.docx(12页珍藏版)》请在冰豆网上搜索。
VB调用DLL
制作好DLL之后,就可以用VB调用它,实现VB调用C程序。
VB程序要使用DLL中的函数,首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。
语句格式为:
DeclareSub过程名Lib[Alias"别名]([ByVal参数AS类型]),或为DeclareFunction函数名Lib[Alias"别名]([ByVal参数AS类型])AS类型在声明中首先用Declare关键字表示声明DLL中的函数。
在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。
有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。
例如上面的ADD.DLL在VB中就可以声明为:
DeclareFunctionADDLibc:
\ADD.dll―ByValXASInteger,ByValYASInteger,ByValfileinas
string)ASInteger
通过此声明语句将函数ADD声明到VB中,便可直接调用。
Declare语句只能调用标准DLL,而不能用于调用ActiveXDLL,这是你程序出错的原因。
VB无法生成标准DLL,只能生成ActiveXDLL。
调用ActiveXDLL,一般通过CreateObject语句或在Project|Reference中引用。
如何创建和使用最少的ActiveX组件在VB中
步骤1:
创建服务器
1.在VisualBasic中启动一个新的项目。
选择ActiveXEXE或ActiveXDLL。
2.从Project菜单,选择添加模块,然后模块。
3.在Module1的通用声明部分中键入下面的代码:
SubMain()
注意:
EndSub将自动为您添加。
4.GeneralDeclarationsectionofClass1toaddfollowingcode:
PublicMyStringAsString
PublicFunctionMyFunction()AsString
MyFunction="Youneverknowwhatyou'regonnaget."
EndFunction
PublicSubClass_Initialize()
MyString="Lifeislikeaboxofchocolates."
EndSub
5.在Class1的属性窗口,设置以下属性:
Property Value
------------------------------------
Instancing 5-MultiUse
6.从项目菜单,选择Project1属性。
在常规选项卡,从启动对象列表中选择SubMain并单击确定。
7.byfromRunmenuchoosingStartorbypressingF5keystartprogram。
您现在有一个完整的(尽管受限制)OLE自动化服务器。
更高版本,您可以从文件菜单来创建可用,而不必运行该项目的ActiveX组件选择Project1EXE或生成Project1DLL。
现在,在您想自动完成您的服务器。
8.最小化VisualBasic。
回到顶端
步骤2:
创建客户端访问服务器
1.启动VisualBasic的第二个副本。
此时将创建一个新的项目(Project1)与默认窗体(Form1)。
2.将下面的代码添加到Form1的相应的事件:
'IntheGeneralDeclarationssection:
PrivateMyObjAsObject
PrivateSubForm_Load()
SetMyObj=CreateObject("Project1.Class1")
EndSub
PrivateSubForm_Click()
PrintMyObj.MyString
PrintMyObj.MyFunction
EndSub
PrivateSubForm_Unload(CancelAsInteger)
SetMyObj=Nothing
EndSub
3.byfromRunmenuchoosingStartorbypressingF5keystartprogram。
4.单击Form1。
以下文本是输出到Form1上:
lifeislikeofchocolatesbox。
您永远不会知道您是gonna获取。
Form1加载时,它实例化您的ActiveX组件的一个副本。
在上单击,它使两个OLE调用:
一个检索MyString公用变量,另一个用来调用MyFunction公共函数的值。
Form1卸载时,它会破坏其创建的ActiveX组件的实例。
如果这是在内存中的最后一个实例,是从以及内存中删除服务器进程。
因为最近要用VB写界面,DLL调用call,vb内嵌汇编类,太麻烦了。
转个帖子,就是vb和dll间参数类型的匹配问题。
来自VBGOOD_vtx3_a^__
VB调用DLL的参数类型匹配问题
(一) @~p_;.=1]F
t.\ 几天前,网友提到了VB中的参数与标准的C语言 j__(xVbUa
的参数的对应关系的问题,说老实话,我对次也是七 W0-__KFo.'
窍只通了六窍。
这几天查了些资料,总结如下,希望 ,B90r7K:
_
能对大家编程有所帮助。
J^w!
_?
_n_k
;15_j_\{r
VB调用DLL的缺省调用方式是:
传引用调用。
即VB /E%^s3_S.
传一个指向参数变量的指针,DLL中便可以修改实际参 Sgp_1p}___
数的值。
若要传值方式,则需要在函数申明时在参数前 y/vGt_^;3<
加上ByVal关键字。
_#_jqc_Uno
zt_EM>xsk_
下面谈谈字符串调用的约定。
事实上对字符串无 UG!
+&ii_|
论是否使用ByVal关键字,在DLL中均可以修改传入的参 XG!
s+_ShFV
数。
但,用不用ByVal关键字,还是有区别的。
因为VB H13kNh_V9
与DLL接口支持两种类型的字符串,VB是用如下的规则 'kb_|_!
___
来匹配类型的,若没用关键字ByVal,则传一个VB字符 E__EJ
OJ<
串句柄(数据类型为HLSTR),这种类型或字符串句柄 KD=W_(\_
只有专为VB设计的DLL才能识别。
所以,通常的DLL如 _0ZAT;eaB
果不是专门为VB设计的,就只有用ByVal关键字了。
因 B:
_]%Iu|_
为加了ByVal关键字后,VB会在字符串尾加上Null字符, JwNB)e_D_
即自动将VB字符串转换成C-style字符串,然后将指向 9Hm>_@dBhM
该串的指针传给DLL。
__(:
_r80:
VB调用DLL关于参数的匹
(二) _`~\zz_UZ
_D!
_WyT_`T
这次谈谈VB与C语言的其他参数类型间的转换。
#V-_0-n,`
包括布尔型、16位整数、16位无符号整数、8 __w!
-
-_K9
位有和无符号整数、32位有和无符号整数、VB [X__^O__xs
中Variant类型及结构指针等。
DF_M~__jlH
5DS'22GW_`
〈布尔量〉VB和C中都定义0为“假”,非0 O._z\VI2f
为“真”,但C语言逻辑表达式的结果用1表示“真”, Hw1:
_zro
而相应的VB返回-1做为“真”。
这是二者的区别。
<,+nS_%_a
2Fc_>6_]:
*
〈16位符号整数〉C语言中的int和short C3:
CuoE_X
类型与VB中的integer完全对应匹配,所以可以 z)F_<{]%
大胆使用。
:
) B>U_Fdj]-
jz$]"\G#
〈16位无符号整数〉VB中没有相应的类型,所以 *?
3c2Jg_=E
就存在转换的问题了。
关键是对于从32768-65535这一区间 6-Id
{mx
的数如何处理。
事实上可以用一个范围更大的类型(如long) <`_?
V:
};Q
数做“中间代理”,而达到目的。
举例如下:
_)>;V7_2
SignedEquivalent%=CInt(UnsighedNumber&-&h10000&) _zV_vL!
_
其中UnsighedNumber&就是我们要的“代理”。
这里的诀 F3e1&aK6_{
窍是:
DLL希望一个无符号的16位整数,即使VB把 __B+2EIaI
SighedEquivalent解释为负数,DLL也会将它解释为我们所 }/_*U_~!
t
需要的在32768-65535间的正整数。
当然,反过来的逆变换, W2BZG(_dm
如下:
LongResult&=(CLng(IntegerResult%)and&h0ffff&)W___<_u,S
VB中调用DLL关于参数匹配的问题(三) _YkSHJ{_>
Ajm4q____
*8位有符号和无符号整数 hn_=tSlte_
只要VB的无符号整数在正确的范围内,即-128~+127 mtmTlGp6Lc
或0~255之间,就没有任何问题,直接用Integer类型就可 _hs_HbT^Qm
以了。
U_DW_?
SHAx
EN__rcIZ
*32位有符号整数 _\V_#_fl
与VB中的Long类型完全兼容。
真是好运气。
呵呵。
yA#n_n_u1_
>h_Y._F/[
*32位无符号整数 _Eh_*(N(`
有要转换了,因为VB中无相应的类型。
这种转换的需要 c~+KrW_bZ~
主要发生在使用的变量值在2,147,483,647~4,294,967,295 jyBYs&_v
范围内。
这里可以采用与前面提到的16位无符号整数类型转 _!
_Df>Q5~g
换相同的技巧,不过要用Currency或Double数据类型做 _?
_a-5^{{_
中间的“代理”。
方法相同,这里就不再罗嗦了。
K#Zv>x!
to
_/0o#_V-E)
*VB中的Variant类型 R.cR:
_fA
这种类型似乎只有VB中有,是不是有点太排他的感觉?
=*R_6
_O,
所以碰到有这种类型的DLL函数,放心用吧,那DLL肯定是 F_GzKx_9I9
专门为VB而设计的。
.TCDv4__?
loC~wm%Ql_
*结构体指针 _txvo7?
Y*4
在很多场合,要构造出一个与DLL(C-Style)完全吻合的 ^qzH(_~g{M
结构体是有可能的,但,也存在走不通的情况。
下面列出了 )_N*Jc@Y@
一些在结构体中常常用到的类型,希望对你有所帮助。
~_oJ"s___i
C-Style VB-Style ITg<_u?
z__
BYTE 长度为1的字符串:
string*1 _R1_*4___
16位整数 Integer g+5c"Yk+u~
32位整数 Long Bh_v_$__
位域 把位域里每16位合成一个整数 ljUd_sUw
字符数组(定长) 定长字符串 6]4#8_tR1_
FARPROC(函数指针) Long,事实上VB不直接支持函数指针:
) *A_Y_q:
n6
句柄 Integer &+*OV:
[;
LPSTR(C字符串) Long 9_Msy=qvYG
数值数组 相应的数值数组 D_z____Q_
结构指针 Long _+[<_Y__E_
Single或Double Single或Double _fx(h_f_z
#{PwEX!
Ct
*VB中的Currency类型 ZZ7qSyBs?
事实是C语言中也没有这种类型,当可以构造出与之相 Qr9_;CVW
当的类型,如下结构可以实现:
W*t]d__
typedefstructcurrencystruct{ ]S%_(l_,
charcurrency_buf[8]; 2_l__CFE_)
}Currency; q_D4]_7"9_
V`1,s~"_q