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。
全文到此结束了,其中也许有很多细节没考虑周到,有问题欢迎提出。
分享到:
相关推荐
综上所述,VB调用DLL时处理数组类型参数需要考虑数组的传递方式、大小、类型匹配以及资源管理等问题。了解这些要点,就能成功地在VB中调用DLL函数,并正确传递数组参数。通过实践和理解这些概念,可以增强你的VB编程...
在本实例的"clstest"文件中,可能包含了VB调用DLL和VB编写DLL的示例代码。分析这个文件,可以进一步学习如何实际操作这两个过程。通过实践这些步骤,你可以掌握在VB环境中创建和使用DLL的基本技巧,这对于开发大型、...
首先,我们需要了解VB和VC之间调用DLL的基本原理。VB和VC都是Microsoft开发的编程环境,但它们的语法和底层实现有所不同。VB使用COM(Component Object Model)进行组件交互,而VC则更偏向于C++的面向对象编程。当VC...
在IT领域,跨语言通信是常见的需求之一,本篇文章主要探讨如何在VB6.0环境中调用C#编写的Dll文件。VB6.0和C#属于不同平台,但通过COM(组件对象模型)和.NET Framework的支持,可以实现两者之间的交互。 首先,我们...
以下是对如何使用VB.NET调用DLL的深入解析,包括理论知识、实践操作以及常见问题解决。 ### 一、基础知识:DLL与VB.NET #### 1. DLL简介 动态链接库(Dynamic Link Library,简称DLL)是Windows操作系统中的共享库...
VB6.0调用DLL是一个常见的技术实践,用于扩展VB6.0应用程序的功能,实现更复杂或特定的操作。 首先,理解DLL的工作原理至关重要。DLL文件本质上是共享库,它们包含了执行特定任务的函数或资源。当多个应用程序都...
在编程世界中,DLL(Dynamic Link Library)是...总结,VB调用DLL的关键在于正确声明函数原型,理解参数传递和类型转换,以及处理可能的错误。掌握这些要点,你就可以在VB程序中灵活利用外部DLL库,扩展你的应用功能。
总的来说,这个"vb.zip_C++_VB 引用dll_VB调用DLL_call dll_dll"实例为我们展示了VB与C++之间的交互,这对于那些希望在VB项目中利用C++高性能特性的开发者来说,是一个非常实用的学习资源。通过理解这个过程,你可以...
### VB调用C# DLL的详细指南 在跨语言编程中,经常需要让不同语言编写的组件能够相互协作。在.NET框架中,VB.NET和C#是两种常用的开发语言,它们各自有着不同的语法和特性,但都能够在同一平台上运行。本文将详细...
使用`Declare`语句,指定函数名、参数类型、返回值类型和DLL的路径。例如: ```vb Private Declare Function MyDLLFunction Lib "mydll.dll" (ByVal arg1 As Integer, ByRef arg2() As Double) As Integer ``` ...
VB.NET的结构体(Structure)与VC++的结构体(struct)在内存布局上有所不同,这可能导致在跨语言调用DLL时的数据对齐问题。 1. 数据对齐:VB.NET默认的数据对齐是8字节,而VC++可以设置为4字节或8字节。如果不匹配...
"亦思验证码识别系统-VB调用DLL"是一个专为VB(Visual Basic)开发者设计的工具,允许他们通过DLL动态链接库在应用程序中集成验证码识别功能。下面将详细介绍这个系统的相关知识点。 1. **验证码识别技术**:验证码...
确保参数类型、返回值和调用约定都与DLL的定义匹配至关重要。 在64位(x64)和32位(x86)平台上运行,需要注意平台兼容性问题。VB6的ActiveX EXE是32位的,因此在64位系统上,需要以32位进程模式运行(也称为...
综上所述,"Delphi VB 引用dll"涉及的核心技术包括Delphi和VB的工程配置、DLL的创建和导出、VB的引用方法、数据类型匹配、调用约定、错误处理以及多线程编程。理解这些知识点,开发者可以顺利地在两个不同的编程环境...
3. **声明DLL函数**:在VB中调用DLL函数,需要在代码中正确声明函数原型,包括函数名、参数类型、返回值类型和调用约定。错误的声明可能导致运行时错误或崩溃。 4. **调用约定**:在VB和Delphi中,函数调用约定(如...
4. **数据类型匹配**:确保VB.NET的数据类型与C++中的数据类型相匹配。例如,VB.NET的`Integer`对应C++的`int`,`Double`对应`double`,等等。 5. **调用约定**:根据C++函数的实际调用约定(如C、stdcall或...
9. **跨语言兼容性**:动态调用DLL使得Delphi程序能够与使用其他语言(如C++、C#或VB.NET)编写的DLL交互,因为这些语言都支持stdcall调用约定。 10. **优化和性能**:虽然动态调用提供了灵活性,但也有性能开销,...
需要注意的是,由于没有注册,可能需要手动传递类型库信息,确保参数类型和返回值类型与DLL函数匹配。 5. **资源释放**:在不再需要DLL时,使用FreeLibrary API释放之前通过LoadLibrary获得的句柄,这将减少内存...
5. **调用DLL函数**:在VB的代码中,像调用普通VB函数一样调用`AddNumbers`函数,传入参数并处理返回值。例如: ```vb Dim result As Integer result = AddNumbers(3, 5) MsgBox "The sum is: " & result ``` ...
VB.NET调用DLL,可以实现对复杂算法、硬件驱动或第三方库的调用。 步骤1:引入DLL到项目 在VB.NET中,调用DLL的第一步是将DLL引入到你的项目中。这可以通过“解决方案资源管理器”窗口完成,右键点击“引用”文件夹...