注册 登录
编程论坛 VB6论坛

关于调用dll的传值问题

pengzhanggui 发布于 2016-10-31 16:49, 2429 次点击
dll中某个函数定义如下:

基本信息读取函数
BOOL WINAPI ReadBasicInfo(int  iNo, char* respBuf, int* iLength );
参数:
        iNo:所读记录序号(取值范围1~11)
        respBuf:读取内容返回值(此字符串数组长度必须大于0x28即40个字节)
        iLength:返回值长度(不大于0x28)
返回值:
TRUE表示读取成功,FALSE表示读取失败

其中,respBuf iLength  这两个结果是要传回到VB中,那么vb该怎么写啊?
10 回复
#2
xzlxzlxzl2016-10-31 18:45
可以试试如下代码:
private function ReadBasicInfo lib "user.dll"(byval ino as long,byref respBufas string,byref iLength as long) as boolean 'api声明部分
dim ino as long,respBuf as string*40,iLength(40) as long
ReadBasicInfo(ino,respbuf,ilength(0))

[此贴子已经被作者于2016-10-31 18:53编辑过]

#3
风吹过b2016-10-31 22:23
2楼,最后一个参数错了,要求一个 long 数据进行,按地址传就可以。

int  iNo,
char* respBuf,
int* iLength
首先,c的int,翻译成 long
传字符串指针的,传定长的string 或byte数组,按地址传,一定不能传vb的变长字符串类型。
按指针传的简单数据,照样按地址传就是了。如果不是按指针传的简单数据,就按值传。
#4
pengzhanggui2016-11-01 08:19
回复 3楼 风吹过b
请问下代码怎么写呢?
#5
风吹过b2016-11-01 09:06
按2楼的代码,最后一个定义为单long 变量

大体抄二楼的代码
试试如下代码:
private function ReadBasicInfo lib "换成你的DLL名字"(byval ino as long,byref respBufas string,byref iLength as long) as boolean 'api声明部分
dim ino as long,respBuf as string*40,iLength as long

if ReadBasicInfo(ino,respbuf,ilength) then
'调用成功
else
'调用失败处理
end if
#6
pengzhanggui2016-11-01 09:45
回复 5楼 风吹过b
这种写法能够返回 respbuf,ilength 的结果吗?
我测试过,返回的结果是空的。
#7
风吹过b2016-11-01 10:01
按地址传递应该能返回。
所以申明时应该能得到。
你判断了 函数返回值吗?是 TRUE 还是 FALSE

实在不行,用 integer 保存返回值,判断是不是等于0 。
C里,0 为FALSE,非0 为 True
VB里,0 为FALSE,true 多数时候为 1 或 -1

#8
风吹过b2016-11-01 10:14
你第二个参数,也可以试着传一个 byte 数组进去看看。

private function ReadBasicInfo lib "换成你的DLL名字"(byval ino as long,byref respBufas() as  byte ,byref iLength as long) as boolean 'api声明部分
dim ino as long,respBuf(39) as byte ,iLength as long

if ReadBasicInfo(ino,respbuf(0),ilength) then
'调用成功
else
'调用失败处理
end if
#9
pengzhanggui2016-11-01 10:58
回复 7楼 风吹过b
按地址传递,即byref ,会报错: .....内存不能为written...
按值传递,即byval,也会报错:.......内存不能为read...
#10
xzlxzlxzl2016-11-01 11:54
应该是传数组的问题,好像vb不能传数组单个元素,改成如下试试:
private function ReadBasicInfo lib "user.dll"(byval ino as long,byref respBuf as string,byref iLength as long) as boolean 'api声明部分
dim ino as long,respBuf as string*40,iLength as long
ReadBasicInfo(ino,respbuf,ilength)
#11
pengzhanggui2016-11-02 07:56
回复 10楼 xzlxzlxzl
已测试ok,分享一下,整个dll需要注意的是char* 指针类型(传地址还是传值的问题)

方法1(传地址):
private function ReadBasicInfo lib "user.dll"(byval ino as long,byref respBuf as byte,byref iLength as long) as boolean 'api声明部分
dim ino as long,iLength as long
dim respBuf(1 to 40) as byte
ReadBasicInfo(ino,respbuf(1),ilength)
respbuf(1)获得的地址位置,后续要得到地址对应的值的时候,需要使用
结果=StrConv(Mid(respBuf, 1, iLength / 2), vbUnicode)

方法2(传值):
private function ReadBasicInfo lib "user.dll"(byval ino as long,byval respBuf as string,byref iLength as long) as boolean 'api声明部分
dim ino as long,iLength as long
dim respBuf as string
ReadBasicInfo(ino,respbuf,ilength)

[此贴子已经被作者于2016-11-2 08:14编辑过]

1