| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2244 人关注过本帖
标题:关于调用dll的传值问题
只看楼主 加入收藏
pengzhanggui
Rank: 5Rank: 5
等 级:职业侠客
威 望:8
帖 子:161
专家分:344
注 册:2015-7-20
结帖率:81.82%
收藏
已结贴  问题点数:20 回复次数:10 
关于调用dll的传值问题
dll中某个函数定义如下:

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

其中,respBuf iLength  这两个结果是要传回到VB中,那么vb该怎么写啊?
搜索更多相关主题的帖子: 字符串 记录 信息 
2016-10-31 16:49
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:10 
可以试试如下代码:
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编辑过]

2016-10-31 18:45
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:10 
2楼,最后一个参数错了,要求一个 long 数据进行,按地址传就可以。

int  iNo,
char* respBuf,
int* iLength
首先,c的int,翻译成 long
传字符串指针的,传定长的string 或byte数组,按地址传,一定不能传vb的变长字符串类型。
按指针传的简单数据,照样按地址传就是了。如果不是按指针传的简单数据,就按值传。

授人于鱼,不如授人于渔
早已停用QQ了
2016-10-31 22:23
pengzhanggui
Rank: 5Rank: 5
等 级:职业侠客
威 望:8
帖 子:161
专家分:344
注 册:2015-7-20
收藏
得分:0 
回复 3楼 风吹过b
请问下代码怎么写呢?

来找我试试看
2016-11-01 08:19
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
按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

授人于鱼,不如授人于渔
早已停用QQ了
2016-11-01 09:06
pengzhanggui
Rank: 5Rank: 5
等 级:职业侠客
威 望:8
帖 子:161
专家分:344
注 册:2015-7-20
收藏
得分:0 
回复 5楼 风吹过b
这种写法能够返回 respbuf,ilength 的结果吗?
我测试过,返回的结果是空的。

来找我试试看
2016-11-01 09:45
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
按地址传递应该能返回。
所以申明时应该能得到。
你判断了 函数返回值吗?是 TRUE 还是 FALSE

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


授人于鱼,不如授人于渔
早已停用QQ了
2016-11-01 10:01
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
你第二个参数,也可以试着传一个 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

授人于鱼,不如授人于渔
早已停用QQ了
2016-11-01 10:14
pengzhanggui
Rank: 5Rank: 5
等 级:职业侠客
威 望:8
帖 子:161
专家分:344
注 册:2015-7-20
收藏
得分:0 
回复 7楼 风吹过b
按地址传递,即byref ,会报错: .....内存不能为written...
按值传递,即byval,也会报错:.......内存不能为read...

来找我试试看
2016-11-01 10:58
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
应该是传数组的问题,好像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)
2016-11-01 11:54
快速回复:关于调用dll的传值问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017763 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved