VB调用C语言的DLL数据类型转换及运行调用约定错误

xbj_hyml 2016-09-01 04:41:04
最近在引用C语言DLL的时候遇到问题,由于只给了一些函数说明,所以碰到了一些问题,向大家请教下
所给的函数说明
1、 void* __stdcall New_Object() //返回:创建的新Panel对象的指针
VB--Public Declare Function New_Object Lib "BS7400Ctl" () As Long 声明是否正确?void * 用什么类型来表示?作为返回值、函数参数有什么区别么?
这样声明后,在vb中能返回一个long型值

2、void __stdcall Delete_Object(void *pObject) //释放Panel对象,pObject 就是上面返回的Panel指针
VB--Public Declare Sub Delete_Object Lib "BS7400Ctl" (ByVal pObject As Long)
用上面的long值作为参数时,在IDE中运行时提示:94错误,调用DLL约定错误,但生成EXE后却没有错误提示,是这么回事?

3、DWORD __stdcall OpenReceiver(void* pObject, TRANDATAPROC pTranFunc, LPVOID pPara)
VB--Public Declare Function OpenReceiver Lib "BS7400Ctl" (ByVal pObject As Long, ByVal pTranFunc As Long, ByVal pPara As Long) As Long
参数:pTranFunc --回调函数;pPara -- 回调函数相关的参数指针。
这里的pPara是个什么鬼?vb中怎么声明

请各位不吝赐教,,分可以再谈
...全文
3444 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
test2002 2016-09-08
  • 打赏
  • 举报
回复
你这个问题,我弄个,只是VB,VC函数都是我自己写。 你这个问题,相当于直接调用VB类模块函数,传给VC 参数时,都传long,VC函数自己做类型转换
赵4老师 2016-09-05
  • 打赏
  • 举报
回复
引用 8 楼 Chen8013 的回复:
[quote=引用 7 楼 xbj_hyml 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
唉,木有办法呢,用的是人家的DLL 而且估计很少会有人照你说的去做吧。。个人或者开源的东西可能还好说 所以,再苦再累也得受着[/quote] 那是“机器人回复”,你别当真…… 估计在这论坛里能找到几千贴这种“一字不差”的回复了。 看起来似乎“很有道理的样子”,但实际是“然并卵”, 按我的评价,他这就是基于幼儿园的水平、方法、思路,去处理所有遇到的问题。 [/quote] 为什么人和人沟通主要用说话;而不是用眼神、手势、体感、……呢?!
赵4老师 2016-09-02
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
xbj_hyml 2016-09-02
  • 打赏
  • 举报
回复
引用 4 楼 Chen8013 的回复:
没看到函数原型是啥样,这难道是你猜的参数格式? 第2个,你可以试试 Declare Function ....... as long 第3个中,那么参数要传什么,那得是程序开发员决定的,别人能“脑补”出来??? 要想弄清楚怎么用,一个就是联系相关的技术人员或找到相关文档资料;   另一个就是找一份“正确的应用示例”代码。 要不然,你进行反汇编、然后分析它究竟“需要什么”!
我上面写的就是他们提供的函数原型(不过没有示例),只是没有看到dll里的具体东西。。然后我也不了解是不是还有其他的情况导致这个问题,所以来这边请教下大家。。 先谢谢了,我想办法联系下他们开发人员问问看
舉杯邀明月 2016-09-02
  • 打赏
  • 举报
回复
没看到函数原型是啥样,这难道是你猜的参数格式? 第2个,你可以试试 Declare Function ....... as long 第3个中,那么参数要传什么,那得是程序开发员决定的,别人能“脑补”出来??? 要想弄清楚怎么用,一个就是联系相关的技术人员或找到相关文档资料;   另一个就是找一份“正确的应用示例”代码。 要不然,你进行反汇编、然后分析它究竟“需要什么”!
xbj_hyml 2016-09-02
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
晕,刚才又看了一下,才发现“第3”的第二个参数是“回调函数”。 这“回调函数”是一个函数地址,VB6中只能按你那样声明参数。 调用函数时,是用 AddressOf 取“回调处理函数的地址”传参数的。
谢谢 其实1,2问中,我不明白的事为什么运行会出错,生成EXE就不会。另外dll里函数原型我没看到,这是第三方的,暂时还没联系到他们的开发人员。。。所以先在这边问下,看 有没有其他的可能 第3问中,我不明白的事第三个参数pPara--回调函数参数的相关指针,这个是传什么值 回调函数 Public Sub RcvData(ByVal pObject As Long, ByVal sRcvData As String, ByVal iDataLen As Long) End Sub
舉杯邀明月 2016-09-02
  • 打赏
  • 举报
回复
引用 7 楼 xbj_hyml 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
唉,木有办法呢,用的是人家的DLL 而且估计很少会有人照你说的去做吧。。个人或者开源的东西可能还好说 所以,再苦再累也得受着[/quote] 那是“机器人回复”,你别当真…… 估计在这论坛里能找到几千贴这种“一字不差”的回复了。 看起来似乎“很有道理的样子”,但实际是“然并卵”, 按我的评价,他这就是基于幼儿园的水平、方法、思路,去处理所有遇到的问题。
xbj_hyml 2016-09-02
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
唉,木有办法呢,用的是人家的DLL 而且估计很少会有人照你说的去做吧。。个人或者开源的东西可能还好说 所以,再苦再累也得受着
舉杯邀明月 2016-09-01
  • 打赏
  • 举报
回复
晕,刚才又看了一下,才发现“第3”的第二个参数是“回调函数”。 这“回调函数”是一个函数地址,VB6中只能按你那样声明参数。 调用函数时,是用 AddressOf 取“回调处理函数的地址”传参数的。
舉杯邀明月 2016-09-01
  • 打赏
  • 举报
回复
初步感觉:你的1和2是没有错的。 但如果在IDE下运行,2会出现“调用约定错误”,   请确认 Delete_Object 的函数原型是否真如你说的那样。 在VB6中,不管什么样的“指针”,统统都可以用 Long类型表示; 但在函数调用时,就要注意按函数原型来分清楚:究竟该传值、还是“传引用”。 “第3”: 那个pPara究竟是什么鬼,得看它的说明文档啊。   单从函数原型来看,你的使用并没有错。 但第二个参数,也许你可以声明为:[ByRef] pTranFunc as TRANDATAPROC 这样,调用函数时,直接传递TRANDATAPROC类型的变量即可。 当然按你的“ByVal 指针”也可,只是调用时得用VarPtr( )取得TRANDATAPROC类型变量的地址来传参数。

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧