VB调用DLL.docx

上传人:b****3 文档编号:12659514 上传时间:2023-04-21 格式:DOCX 页数:12 大小:23.44KB
下载 相关 举报
VB调用DLL.docx_第1页
第1页 / 共12页
VB调用DLL.docx_第2页
第2页 / 共12页
VB调用DLL.docx_第3页
第3页 / 共12页
VB调用DLL.docx_第4页
第4页 / 共12页
VB调用DLL.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

VB调用DLL.docx

《VB调用DLL.docx》由会员分享,可在线阅读,更多相关《VB调用DLL.docx(12页珍藏版)》请在冰豆网上搜索。

VB调用DLL.docx

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_~!

需要的在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 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 商业计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1