vb调用dll如何传递字符串指针

assummerflower 2019-05-28 04:17:43
在c++编写的dll头文件中,函数定义如下

int EXPORT_API usb_relay_device_open_with_serial_number(const char *serial_number,unsigned len);
/*open device that serial number is serial number*/
/*return:This funcation return a valid handle to the device on success or NULL on failure*/
/**eg:usb_relay_device_open_with_serial_number("abcde",5")*/



在vb中尝试以下几种方式编写程序(设备序列号为“QAAMZ”)
1、直接传递字符串
声明:
private declare function usb_relay_device_open_with_serial_number Lib“xx路径”(byval SerNum as string,byval lenth as long)as long
调用
dim return as long
return=usb_relay_device_open_with_serial_number(“QAAMZ”,5)
2、传递指针
声明中 byval SerNum as long
其中sernum为序列号数组首字符的指针地址

但都出现“DLL调用约定错误”的提示。

求教~

ps:这个问题的前置提问:https://bbs.csdn.net/topics/392563831
已经解决了利用dll获得设备序列号的问题。


...全文
526 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
assummerflower 2019-05-31
  • 打赏
  • 举报
回复
引用 18 楼 milaoshu1020的回复:
[quote=引用 17 楼 assummerflower 的回复:]
[quote=引用 15 楼 milaoshu1020的回复:][quote=引用 14 楼 assummerflower 的回复:]
[quote=引用 13 楼 脆皮大雪糕的回复:][quote=引用 10 楼 assummerflower 的回复:]
[quote=引用 8 楼 脆皮大雪糕的回复:]要被VB调用的函数都要用stdcall

我不知道我的是不是stdcall,也不知道在哪里改…求指导啊[/quote]

要看DLL的源代码,找到函数的声明,确认是否有声明 stdcall调用,如果没有则需要修改,修改以后要重新编译。[/quote]
哪个是源代码?用什么软件编译?我这有厂家给的.dll,.h和.lab[/quote]
厂家说没说是否支持VB6调用?
厂家试验过,能用VB6调用吗?
是否可以让厂家给你个VB6调用的例子?
[/quote]
商家转卖的一个小东西,联系不到厂家…[/quote]
实在不行的话,你可以用VC的ATL工程包装一下,然后用VB6调用;
因为有可能这个API函数VB6没法直接调用;
方便的话我可以给你包装一下,不过你得把.H和.DLL发给我;
你可以用百度网盘,上传并共享,把地址贴在这里;
也可以把这几个文件打包发送到我的邮箱:milaoshu1020@126.com;[/quote] 感谢感谢,已经发到邮箱了
脆皮大雪糕 2019-05-30
  • 打赏
  • 举报
回复
要被VB调用的函数都要用stdcall
milaoshu1020 2019-05-30
  • 打赏
  • 举报
回复
.cpp、.h 是源代码文件;
试试修改 .cpp、.h(再导出的函数名称前边加上_stdcall);
比如:
int _stdcall EXPORT_API usb_relay_device_open_with_serial_number(const char *serial_number,unsigned len);
.lib、.dll 是编译生成的文件,.dll是vb6实际用到的文件;

因为我没有测试过,仅仅是看别人这么说的,所以也不太确定这个方法能达到效果;
你可以试一试,不行再想其它的办法;
milaoshu1020 2019-05-30
  • 打赏
  • 举报
回复
引用 17 楼 assummerflower 的回复:
[quote=引用 15 楼 milaoshu1020的回复:][quote=引用 14 楼 assummerflower 的回复:]
[quote=引用 13 楼 脆皮大雪糕的回复:][quote=引用 10 楼 assummerflower 的回复:]
[quote=引用 8 楼 脆皮大雪糕的回复:]要被VB调用的函数都要用stdcall

我不知道我的是不是stdcall,也不知道在哪里改…求指导啊[/quote]

要看DLL的源代码,找到函数的声明,确认是否有声明 stdcall调用,如果没有则需要修改,修改以后要重新编译。[/quote]
哪个是源代码?用什么软件编译?我这有厂家给的.dll,.h和.lab[/quote]
厂家说没说是否支持VB6调用?
厂家试验过,能用VB6调用吗?
是否可以让厂家给你个VB6调用的例子?
[/quote]
商家转卖的一个小东西,联系不到厂家…[/quote]
实在不行的话,你可以用VC的ATL工程包装一下,然后用VB6调用;
因为有可能这个API函数VB6没法直接调用;
方便的话我可以给你包装一下,不过你得把.H和.DLL发给我;
你可以用百度网盘,上传并共享,把地址贴在这里;
也可以把这几个文件打包发送到我的邮箱:milaoshu1020@126.com;
assummerflower 2019-05-30
  • 打赏
  • 举报
回复
引用 15 楼 milaoshu1020的回复:
[quote=引用 14 楼 assummerflower 的回复:]
[quote=引用 13 楼 脆皮大雪糕的回复:][quote=引用 10 楼 assummerflower 的回复:]
[quote=引用 8 楼 脆皮大雪糕的回复:]要被VB调用的函数都要用stdcall

我不知道我的是不是stdcall,也不知道在哪里改…求指导啊[/quote]

要看DLL的源代码,找到函数的声明,确认是否有声明 stdcall调用,如果没有则需要修改,修改以后要重新编译。[/quote]
哪个是源代码?用什么软件编译?我这有厂家给的.dll,.h和.lab[/quote]
厂家说没说是否支持VB6调用?
厂家试验过,能用VB6调用吗?
是否可以让厂家给你个VB6调用的例子?
[/quote] 商家转卖的一个小东西,联系不到厂家…
assummerflower 2019-05-30
  • 打赏
  • 举报
回复
商家转卖的一个小东西,联系不到厂家…
assummerflower 2019-05-30
  • 打赏
  • 举报
回复
引用 5 楼 milaoshu1020的回复:
[quote=引用 4 楼 assummerflower 的回复:]
[quote=引用 3 楼 milaoshu1020的回复:]vc的dll中需要把调用模式设为_stdcall才能让vb调用
比如函数:
void add (int a ,int b)
就无法在VB中调用
要改为:
void add _stdcall (int a ,int b)

转自:
https://bbs.csdn.net/topics/350190581
第2楼;

我没看过dll里面的代码。不过之前有两个函数已经运行成了,是不是应该是stdcall的?[/quote]
引用成的函数声明是什么样子的?[/quote] 引用成了两个函数。 1,初始化函数 在dll头文件中声明为: int EXPORT_API usb_relay_init(void) /*init the usb relay library return 0 on success and-1 on failure*/ 在vb中声明为 private declare function usb_relay_init lib."路径"()as long 2,第二个函数是扫描设备信息的,在另一个帖子里大神您回复过我,按照您的方法解决了。 ps:如果要修改dll为stdcall方式,应该怎么修改,现在有.cpp、.h、.lib、.dll好几个文件,应该改哪个?
milaoshu1020 2019-05-30
  • 打赏
  • 举报
回复
引用 14 楼 assummerflower 的回复:
[quote=引用 13 楼 脆皮大雪糕的回复:][quote=引用 10 楼 assummerflower 的回复:]
[quote=引用 8 楼 脆皮大雪糕的回复:]要被VB调用的函数都要用stdcall

我不知道我的是不是stdcall,也不知道在哪里改…求指导啊[/quote]

要看DLL的源代码,找到函数的声明,确认是否有声明 stdcall调用,如果没有则需要修改,修改以后要重新编译。[/quote]
哪个是源代码?用什么软件编译?我这有厂家给的.dll,.h和.lab[/quote]
厂家说没说是否支持VB6调用?
厂家试验过,能用VB6调用吗?
是否可以让厂家给你个VB6调用的例子?
assummerflower 2019-05-30
  • 打赏
  • 举报
回复
引用 13 楼 脆皮大雪糕的回复:
[quote=引用 10 楼 assummerflower 的回复:] [quote=引用 8 楼 脆皮大雪糕的回复:]要被VB调用的函数都要用stdcall
我不知道我的是不是stdcall,也不知道在哪里改…求指导啊[/quote] 要看DLL的源代码,找到函数的声明,确认是否有声明 stdcall调用,如果没有则需要修改,修改以后要重新编译。[/quote] 哪个是源代码?用什么软件编译?我这有厂家给的.dll,.h和.lab
脆皮大雪糕 2019-05-30
  • 打赏
  • 举报
回复
引用 10 楼 assummerflower 的回复:
[quote=引用 8 楼 脆皮大雪糕的回复:]要被VB调用的函数都要用stdcall
我不知道我的是不是stdcall,也不知道在哪里改…求指导啊[/quote] 要看DLL的源代码,找到函数的声明,确认是否有声明 stdcall调用,如果没有则需要修改,修改以后要重新编译。
milaoshu1020 2019-05-30
  • 打赏
  • 举报
回复
引用 11 楼 assummerflower 的回复:
[quote=引用 7 楼 milaoshu1020的回复:].cpp、.h 是源代码文件;
试试修改 .cpp、.h(再导出的函数名称前边加上_stdcall);
比如:
int _stdcall EXPORT_API usb_relay_device_open_with_serial_number(const char *serial_number,unsigned len);
.lib、.dll 是编译生成的文件,.dll是vb6实际用到的文件;

因为我没有测试过,仅仅是看别人这么说的,所以也不太确定这个方法能达到效果;
你可以试一试,不行再想其它的办法;

没什么变化。
vb只用到了dll,dll没有改动,程序也就没有变化了。[/quote]
需要编译源代码为DLL;
就像VB6的生成EXE/DLL/OCX一样;
assummerflower 2019-05-30
  • 打赏
  • 举报
回复
引用 7 楼 milaoshu1020的回复:
.cpp、.h 是源代码文件;
试试修改 .cpp、.h(再导出的函数名称前边加上_stdcall);
比如:
int _stdcall EXPORT_API usb_relay_device_open_with_serial_number(const char *serial_number,unsigned len);
.lib、.dll 是编译生成的文件,.dll是vb6实际用到的文件;

因为我没有测试过,仅仅是看别人这么说的,所以也不太确定这个方法能达到效果;
你可以试一试,不行再想其它的办法;
没什么变化。 vb只用到了dll,dll没有改动,程序也就没有变化了。
assummerflower 2019-05-30
  • 打赏
  • 举报
回复
引用 8 楼 脆皮大雪糕的回复:
要被VB调用的函数都要用stdcall
我不知道我的是不是stdcall,也不知道在哪里改…求指导啊
脆皮大雪糕 2019-05-30
  • 打赏
  • 举报
回复
stdcall的调用约定意味着:参数从右向左压入堆栈,被调用函数自身修改堆栈 cdecl调用约定的参数压栈顺序是和stdcall是一样的,参数首先由有向左压入堆栈。所不同的是,被调用函数本身不清理堆栈,调用者负责清理堆栈。 VB的调用方式是不自行清理堆栈的,其实WINDOWS API函数基本上都是stdcall。 _cdecl是C和C++程序的缺省调用方式。 当我们遇到这样的函数如fprintf()它的参数是可变的,不定长的,被调用者事先无法知道参数的长度,事后的清除工作也无法正常的进行,因此,这种情况我们只能使用cdecl。
milaoshu1020 2019-05-29
  • 打赏
  • 举报
回复
引用 4 楼 assummerflower 的回复:
[quote=引用 3 楼 milaoshu1020的回复:]vc的dll中需要把调用模式设为_stdcall才能让vb调用
比如函数:
void add (int a ,int b)
就无法在VB中调用
要改为:
void add _stdcall (int a ,int b)

转自:
https://bbs.csdn.net/topics/350190581
第2楼;

我没看过dll里面的代码。不过之前有两个函数已经运行成了,是不是应该是stdcall的?[/quote]
引用成的函数声明是什么样子的?
assummerflower 2019-05-29
  • 打赏
  • 举报
回复
引用 3 楼 milaoshu1020的回复:
vc的dll中需要把调用模式设为_stdcall才能让vb调用
比如函数:
void add (int a ,int b)
就无法在VB中调用
要改为:
void add _stdcall (int a ,int b)

转自:
https://bbs.csdn.net/topics/350190581
第2楼;
我没看过dll里面的代码。不过之前有两个函数已经运行成了,是不是应该是stdcall的?
milaoshu1020 2019-05-29
  • 打赏
  • 举报
回复
vc的dll中需要把调用模式设为_stdcall才能让vb调用
比如函数:
void add (int a ,int b)
就无法在VB中调用
要改为:
void add _stdcall (int a ,int b)

转自:
https://bbs.csdn.net/topics/350190581
第2楼;
assummerflower 2019-05-29
  • 打赏
  • 举报
回复
引用 1 楼 脆皮大雪糕的回复:
改一下声明,C里面传入指针的参数,VB里面用byref传入,类型为any private declare function usb_relay_device_open_with_serial_number Lib“xx路径”(byref SerNum as any,byval lenth as long)as long 接下来,C的char 其实就是字节数组。把VB的string转换成字节数组 dim a() as byte a = strconv("1234abcd" ,vbfromunicode) 最后,把数组的第一个元素传递进去,其实DLL那边获得的就是这个数组在内存里的起始地址。也就是这个数组的指针。 dim return as long return=usb_relay_device_open_with_serial_number(a(0) ,ubound(a)+1)
大神,还是不行,还是报dll调用约定错误。这个方法我之前也试过了,会不会除了传递指针那里,其他地方有我没注意到的错误。
脆皮大雪糕 2019-05-28
  • 打赏
  • 举报
回复
改一下声明,C里面传入指针的参数,VB里面用byref传入,类型为any private declare function usb_relay_device_open_with_serial_number Lib“xx路径”(byref SerNum as any,byval lenth as long)as long 接下来,C的char 其实就是字节数组。把VB的string转换成字节数组 dim a() as byte a = strconv("1234abcd" ,vbfromunicode) 最后,把数组的第一个元素传递进去,其实DLL那边获得的就是这个数组在内存里的起始地址。也就是这个数组的指针。 dim return as long return=usb_relay_device_open_with_serial_number(a(0) ,ubound(a)+1)
打开链接下载源码: https://pan.quark.cn/s/589796089f72 C++课程设计任务列表,涵盖以下内容:1、识别并显示10至99范围内,各位数乘积超过各位数和的数值,例如数字12不满足条件,因为1乘以2小于1加2,故不输出;而数字27满足条件,因为2乘以7大于2加7,因此需要输出该数。2、开发一个功能,用于从用户输入的任意数量实数中找出最大值与最小值:首先要求用户输入一个正整数n,代表数值的个数,随后用户可输入任意n个实数,程序需找出这n个数中的最大值和最小值并将它们展示出来。3、实现两个已排序数组的合并操作:设有数组A和B,且假设这两个数组的元素均已按照降序排列。编写程序将A和B合并成一个新的数组C,并确保C中的元素同样保持降序排列。int A[10]={123, 86,80, 49,33,15,7,0,-1,-3};int B[10]={100,64,51,50,27,19,15,12,5,2};4、设计一个函数,用于计算特定分数序列前n项的总和,该序列为1/2,1/3,1/4,1/5,1/6,1/7,...。要求在主程序中提示用户输入一个整数n,并验证输入的合法性(n需大于1方为有效),若输入合法,则调用求和函数并显示计算结果。5、编写一个程序,计算两个用户输入日期之间的天数差:用户需以year1,month1,day1和year2,month2,day2的格式输入两个日期,程序随后计算这两个日期之间的天数间隔,并将结果输出到屏幕上。要求编制具有如下原型的函数difs2Date:long GetDayDifference(int y1,int m1,int d1,int y2,int m2,int d2);并在主函数中调用此函数,将计...
代码下载地址: https://pan.quark.cn/s/ee8627e4e6d7 ABAP调试器是一种功能强大的工具,可用于在执行期间对ABAP代码进行检验。除了常规的核心功能(例如逐行运行代码以及检验变量、字段符号和引用的值)之外,它还提供了一些辅助性的特性,能够简化并压缩调试会话的时长。并非所有使用者都熟悉这些辅助特性。SAP ABAP调试器是处理和优化ABAP代码开发与维护工作的核心资源,它配备了多样的功能来协助开发人员在运行状态下进行检验和排除故障。此资源着重阐述了ABAP调试器的一些高级特性,涵盖了深入分析调用堆栈、系统级调试、更新会话调试以及提升调试效率的方法。 1. **深入分析调用堆栈**:除了常规的应用程序调试,开发人员有时需要对调用堆栈的内部层级进行深入调试,特别是在错误出现在异步执行的更新处理或系统级程序时。通过启用**系统级调试**,可以访问通常不公开的系统代码,但这也会导致调用堆栈的显著增加,因此需要审慎操作。 2. **系统级调试**:对于不含业务逻辑的系统级程序,开发人员通常无需进行调试。然而,在特定情形下,例如进行错误追踪时,可能需要进入系统代码。借助调试器的“系统调试启用/禁用”选项,可以赋予对系统程序的调试权限。 3. **更新会话调试**:在处理异步更新任务,例如持久化业务数据时,错误可能发生在更新任务内部。激活**更新会话调试**,在更新任务完成后,调试器将自动启动,展示执行路径。比如,在变更成本中心后,通过输入调试指令 "/h" 启动调试,保存后能够看到更新过程中的错误。 4. **分析调用堆栈**:在进行深入调试时,调用堆栈是至关重要的。通过分析调用堆栈,能够定位到引发问题的具体位置,如在VB_V2_NORMAL...
源码链接: https://pan.quark.cn/s/a4b39357ea24 小程序雷达 AI 驱动的小程序生态选型与风险评估工具,把微信小程序开发资源转化为可筛选、可评估、可对比的技术雷达。 线上地址 主站: Vercel: 适合谁 正在做微信小程序技术选型的产品、研发和架构团队。 需要判断 Taro、uni-app、原生小程序、组件库、云开发和 SDK 风险的团队。 需要把历史 awesome 列表转成可筛选、可对比、可验证技术雷达的维护者。 可以做什么 Radar:按推荐状态、风险等级、资源类型、分类和适用场景浏览小程序生态资源。 Quick Search:快速搜索资源并跳转常用页面。 Compare:对比 Taro、uni-app、原生小程序等核心方案。 Advisor:输入选型问题,获得推荐结论、适用/不适用条件、迁移成本、下一步和证据来源。 Doctor:粘贴小程序项目配置,识别框架依赖、过时方案和迁移风险。 Weekly:查看小程序生态周报和近期风险信号。 数据概览 当前数据集中包含 236 个小程序生态资源。 完整资源可在 Radar 页面和导出能力中查看。 核心样例 Taro ★30.6k+ - 使用 React 的方式开发小程序的框架,同时支持生成多端应用 uni-app ★36.1k+ - 使用 Vue 语法开发小程序、H5、App的统一框架 MPX ★2.1k+ - 增强型小程序框架,深度性能优化,支持跨小程序平台开发,完全兼容原生小程序组件 WePY ★21.7k+ - 支持组件化的小程序开发框架 vant-weapp ★12.3k+ - 高颜值、好用、易扩展的微信小程序 UI 库 tdesign-miniprogram ★1.3...

1,488

社区成员

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

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