`
dazhilao
  • 浏览: 239753 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

VB调用DLL的参数类型匹配问题

阅读更多

VB调用DLL的参数类型匹配问题(一)

  几天前, 网友提到了VB中的参数与标准的C语言的参数的对应关系的问题,说老实话,我对次也是七窍只通了六窍。这几天查了些资料,总结如下,希望能对大家编程有所帮助。

  VB调用DLL的缺省调用方式是:传引用调用。即VB传一个指向参数变量的指针,DLL中便可以修改实际参数的值。若要传值方式,则需要在函数申明时在参数前加上ByVal关键字。

  下面谈谈字符串调用的约定。 事实上对字符串无论是否使用ByVal关键字,在DLL中均可以修改传入的参数。但,用不用ByVal关键字,还是有区别的。因为VB与DLL接口支持两种类型的字符串,VB是用如下的规则来匹配类型的,若没用关键字ByVal,则传一个VB字符串句柄(数据类型为HLSTR),这种类型或字符串句柄只有专为VB设计的DLL才能识别。所以,通常的DLL如果不是专门为VB设计的,就只有用ByVal关键字了。因为加了ByVal关键字后,VB会在字符串尾加上Null字符,即自动将VB字符串转换成C-style字符串,然后将指向该串的指针传给DLL。

VB调用DLL关于参数的匹(二)

  这次谈谈VB与C语言的其他参数类型间的转换。包括布尔型、16位整数、16位无符号整数、8位有和无符号整数、32位有和无符号整数、VB中Variant类型及结构指针等。

  〈布尔量〉VB和C中都定义0为“假”,非0为“真”,但C语言逻辑表达式的结果用1表示“真”,而相应的VB返回-1做为“真”。这是二者的区别。

  〈16位符号整数〉C语言中的int和short类型与VB中的integer完全对应匹配,所以可以大胆使用。:)

  〈16位无符号整数〉VB中没有相应的类型,所以就存在转换的问题了。关键是对于从32768-65535这一区间的数如何处理。事实上可以用一个范围更大的类型(如long)数做“中间代理”,而达到目的。举例如下:

   SignedEquivalent% = CInt( UnsighedNumber& - &h10000&) 其中UnsighedNumber&就是我们要的“代理”。这里的诀窍是:DLL希望一个无符号的16位整数,即使VB把SighedEquivalent解释为负数,DLL也会将它解释为我们所需要的在32768-65535间的正整数。当然,反过来的逆变换,如下: LongResult& = (CLng( IntegerResult%) and &h0ffff&)VB中调用DLL关于参数匹配的问题(三)

  * 8位有符号和无符号整数

  只要VB的无符号整数在正确的范围内,即-128~+127或0~255之间,就没有任何问题,直接用Integer类型就可以了。

  * 32位有符号整数

  与VB中的Long 类型完全兼容。真是好运气。呵呵。

  * 32位无符号整数

  有要转换了,因为VB中无相应的类型。这种转换的需要主要发生在使用的变量值在 2,147,483,647 ~ 4,294,967,295范围内。这里可以采用与前面提到的16位无符号整数类型转换相同的技巧,不过要用 Currency 或 Double 数据类型做中间的“代理”。方法相同,这里就不再罗嗦了。

  * VB中的 Variant 类型

  这种类型似乎只有VB中有,是不是有点太排他的感觉?所以碰到有这种类型的DLL函数,放心用吧,那DLL肯定是专门为VB而设计的。

  * 结构体指针

  在很多场合,要构造出一个与DLL(C-Style)完全吻合的结构体是有可能的,但,也存在走不通的情况。下面列出了一些在结构体中常常用到的类型,希望对你有所帮助。

  C-StyleVB-Style

  BYTE长度为1的字符串:string*1

  16位整数Integer

  32位整数Long

  位域把位域里每16位合成一个整数

  字符数组(定长)定长字符串

  FARPROC(函数指针)Long, 事实上VB不直接支持函数指针:)

  句柄Integer

  LPSTR(C字符串)Long

  数值数组相应的数值数组

  结构指针Long

  Single或DoubleSingle或Double

  * VB中的 Currency 类型

  事实是 C 语言中也没有这种类型, 当可以构造出与之相当的类型,如下结构可以实现:

  typedef struct currencystruct{

  char currency_buf[8];

  } Currency;

  * vb中的 Any 类型的应用

  这种类型申明的参数不进行任何类型的匹配检查,传递的参数类型总是函数调用时传进的参数的类型。当然这就要求调用程序保证传入正确的类型。实际上,这种类型是很有用的。例如,Windows API中很多的函数就支持多种类型的参数的调用,一个典型的例子如下:

  HCURSORLoadCursor(hInstance, lpCursorName)

  其中的第二个参数 lpCursorName 既可以是字符串指针,也可以是一个整数(即是光标在资源文件中的ID)。对于这种可容许多类型的函数参数,可将相应参数申明为 Any。

  全文到此结束了,其中也许有很多细节没考虑周到,有问题欢迎提出。

分享到:
评论

相关推荐

    C#调用NIVISION做的模板匹配源码计算机视觉

    C#调用NIVISION模板匹配

    机器视觉软件开发包VB

    CkVision集成BLOB分析,对象计数、几何匹配、灰度匹配、彩色匹配、字符识别、条码识别、测量圆、自动找圆、卡尺工具、间距测量、颜色识别、图像基本运算(二值化、比例变换、开运算、闭运算、膨胀、腐蚀、滤波、边缘...

    MSCOMCTL.OCX

    难道是安装的OFFICE 2007的问题,造成相关的DLL或OCX文件不匹配,卸载OFFICE 2007, 安装OFFICE 2003 SP3, 结果问题解决了。 分析问题的原因:可能是OFFICE 在安装时与MSCOMCTL.OCX相关的文件被破坏。比如被病毒...

    DLL函数查看器V3.5

    3.关于参数量的问题,由于猜解方法过于简单对于部分函数未从当前函数返回,而是"JMP"到别的函数 所以猜解可能会有错误,需要结合已知函数库或反汇编查看,另此方法对于cdecl调用函数无效. 4.关于反汇编视图的"到首...

    VB6增强搜索插件 4.13.0.130

    更改了工程文件名和DLL文件名,去掉了开头的VB字母 修改了安装文件的文件名为VBEnhancedSearch_Setup.exe 代码预览的相关行数默认值修改为12 增加定位时将代码窗体最大化的选项 在搜索结果列表的右键菜单中,增加...

    vb Script参考文档

    调用语句 将控制移交 Sub 或 Function 过程。 CBool 函数 返回已被转换为 Boolean 子类型的变体的表达式。 CByte 函数 返回已被转换为字节子类型的变体的表达式。 CCur 函数 返回已被转换为货币子类型的变体的...

    clsWindow2.1_微信群发案例软件源码

    ' 增加SetFocus函数,调用Focus实现,为了是兼容VB习惯 ' 扩了ProcessID、AppPath、AppName、AppCommandLine三个函数,可带参数 ' 网友wwb(wwbing@gmail.com)提供了一些函数和方法属性: ' CheckWindow, Load, ...

    天琊超级进程监视器V1.02

    比如Rundll32.exe xxxx这种系统常用的EXE会以各种参数命令行来调用DLL或者其他程序。这时如果我们把Rundll32.exe加入黑名单就是不明智的选择了,因为正常程序比如就算是插入U盘都会调用这个程序。那么我们怎么处理呢...

    asp.net知识库

    泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 Attributes in C# 手痒痒,也来个c# 2.0 object pool 泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅(四):Provider、策略...

    创科机器视觉软件试用版(免费)

    CkVision集成BLOB分析,对象计数、几何匹配、灰度匹配、彩色匹配、字符识别、条码识别、测圆、找圆、卡尺测量、外径内径测量、颜色识别、图像基本运算(二值化、比例变换、开运算、闭运算、膨胀、腐蚀、滤波、边缘...

    横瓜数据库全文检索中间件

    横瓜数据库全文检索中间件全套软件,英文名称HdMap,可让你轻松将自己的数据库文件架构成全文搜索引擎,你无需对自己的数据库文件做任何更改,就可以为数据库文件创建可供编程语言调用的ActiveX DLL全文检索接口,可...

    vc++ 应用源码包_6

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    vc++ 应用源码包_1

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

    vc++ 应用源码包_2

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

    vc++ 应用源码包_5

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

    vc++ 应用源码包_3

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

    Java-PHP-C#

    这就是完整的email认证匹配模式了,只需要调用 eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil) 就可以得到是否为email了 正则表达式的其他用法 提取字符串 ereg() and eregi...

Global site tag (gtag.js) - Google Analytics