vb.net怎么调用win32dll写的带有结构体数组参数的函数?

笑出丶强大 2018-07-19 09:52:50
win32结构体如下:
struct LibSpList
{
unsigned int id;
unsigned char name[64];
};
API原形int glaGetSpList(struct LibSpList *splt, unsigned int spnum);
vc下调用如下:
比如int spnum = 100;
struct LibSpList *splt = (struct LibSpList *)calloc(100, sizeof(struct LibSpList));
glaGetSpList(splt, 100);
这样可以正常调用并返回100个结构体数组数据。
现在我vb.net调用也是以100个为例子
Declare Function glaGetSpList Lib "XXX.dll" Alias "_glaGetSpList@8" (ByRef stLibSpList as tLibSpList, Byval spnum as UInteger)
dim stLibSpList(99) as tLibSpList //tLibSpList结构体已经在vb.net下定义
glaGetSpList(stLibSpList(0), 100);
现在的问题是这样调用结果只返回第一组下标为0的数据,后面的都未收到,请问怎么样才能完整收到100个结构体数组的数据?
...全文
199 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
笑出丶强大 2018-07-19
  • 打赏
  • 举报
回复
引用 11 楼 Chen8013 的回复:
才发现,我在8楼回复的数字,居然都少了个0。 
如果unsigned int id是4字节的,那么每个结构体就是68字节,
  100元素应该是6800字节才对(在8楼写成680去了)。

知道你少写个0啊
舉杯邀明月 2018-07-19
  • 打赏
  • 举报
回复
才发现,我在8楼回复的数字,居然都少了个0。 
如果unsigned int id是4字节的,那么每个结构体就是68字节,
  100元素应该是6800字节才对(在8楼写成680去了)。
笑出丶强大 2018-07-19
  • 打赏
  • 举报
回复
问题解决了,非常感谢举杯邀明月的回答,没有你的提示也解决不了,刚才出错是底层dll的一些机制搞错了,现在用byte数组已经可以正确读取了,第一次发帖,csdn很强大,各位大佬也很强
笑出丶强大 2018-07-19
  • 打赏
  • 举报
回复
引用 8 楼 Chen8013 的回复:
[quote=引用 6 楼 qq_22837609 的回复:]
[quote=引用 5 楼 Chen8013 的回复:]
哦, VB.NET的,好像是 变量.toPtr 、还是API声明时参数用 longptr什么的。

我没写VB.NET的,不清楚细节,你自己查一下资料,试一下。


我根据你的提示自己改用Byte数组去接收,现在可以全部收到不过调用时会出现内存已损坏的情况[/quote]
应该不会吧!
你是不是把“长度”算错了?
用Byte数组的话,100个元素,应该是680字节,还是660字节……
你传的是多少字节的呢?
[/quote]

我现在实际从底层读到8个结构体长度,每个结构体长度是68,那总长度不应该是68*8吗
舉杯邀明月 2018-07-19
  • 打赏
  • 举报
回复
引用 6 楼 qq_22837609 的回复:
[quote=引用 5 楼 Chen8013 的回复:]
哦, VB.NET的,好像是 变量.toPtr 、还是API声明时参数用 longptr什么的。

我没写VB.NET的,不清楚细节,你自己查一下资料,试一下。


我根据你的提示自己改用Byte数组去接收,现在可以全部收到不过调用时会出现内存已损坏的情况[/quote]
应该不会吧!
你是不是把“长度”算错了?
用Byte数组的话,100个元素,应该是680字节,还是660字节……
你传的是多少字节的呢?
舉杯邀明月 2018-07-19
  • 打赏
  • 举报
回复
刚才在MSDN网站上搜索了一下,居然什么也找不到。


记得以前有一个介绍VB6与VB.NET某些“差异”的文档……
笑出丶强大 2018-07-19
  • 打赏
  • 举报
回复
引用 5 楼 Chen8013 的回复:
哦, VB.NET的,好像是 变量.toPtr 、还是API声明时参数用 longptr什么的。

我没写VB.NET的,不清楚细节,你自己查一下资料,试一下。


我根据你的提示自己改用Byte数组去接收,现在可以全部收到不过调用时会出现内存已损坏的情况
舉杯邀明月 2018-07-19
  • 打赏
  • 举报
回复
哦, VB.NET的,好像是 变量.toPtr 、还是API声明时参数用 longptr什么的。

我没写VB.NET的,不清楚细节,你自己查一下资料,试一下。
笑出丶强大 2018-07-19
  • 打赏
  • 举报
回复
vb.net不支持VarPtr,有没有其他方法代替?
笑出丶强大 2018-07-19
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
我觉得,就是应该那样用吧!


要不你试试把API第一个参数声明为 ByVal as long 的,然后调用时,传递:VarPtr(stLibSpList(0)) 。


我这里VarPtr提示未定义啊?
舉杯邀明月 2018-07-19
  • 打赏
  • 举报
回复
我觉得,就是应该那样用吧!


要不你试试把API第一个参数声明为 ByVal as long 的,然后调用时,传递:VarPtr(stLibSpList(0)) 。
笑出丶强大 2018-07-19
  • 打赏
  • 举报
回复
这个问题困扰几天了,有大佬出来解答吗?

7,763

社区成员

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

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