搜索
查看: 1010|回复: 3

DLL参数带结构体指针的 使用

[复制链接]

4

主题

18

帖子

99

积分

一级会员

Rank: 2

积分
99
发表于 2017-10-23 12:09:10 | 显示全部楼层 |阅读模式
原来的C++结构体和函数定义是这样的:
EXTERNC DWORD __stdcall VCI_ReadBoardInfo(DWORD DeviceType,DWORD DeviceInd,PVCI_BOARD_INFO pInfo);

typedef  struct  _VCI_BOARD_INFO{
                USHORT        hw_Version;
                USHORT        fw_Version;
                USHORT        dr_Version;
                USHORT        in_Version;
                USHORT        irq_Num;
                BYTE        can_Num;
                CHAR        str_Serial_Num[20];
                CHAR        str_hw_Type[40];
                USHORT        Reserved[4];
} VCI_BOARD_INFO,*PVCI_BOARD_INFO;


以下是我定义的导入函数,但是不熟悉,一致提示出错

//1.ZLGCAN系列接口卡信息的数据类型。
class VCI_BOARD_INFO {
                WORD        hw_Version;
                WORD        fw_Version;
                WORD        dr_Version;
                WORD        in_Version;
                WORD        irq_Num;
                BYTE        can_Num;
                BYTE        str_Serial_Num[20];
                BYTE        str_hw_Type[40];
                WORD        Reserved[4];
}

var dll = ..raw.loadDll("\res\ControlCAN.dll");

::PCAN=dll;     


VCI_ReadBoardInfo= dll.api("VCI_ReadBoardInfo","int(int DeviceType,int DeviceInd,struct &pInfo)");

//这里是我想封装下,将pInfo的结果传出来,一致没法达成目标 。
ReadBoardInfo=function(pointer pInfo){       
        return ::PCAN.VCI_ReadBoardInfo(::devType,::devIdx,pInfo);
};

//结果 function(pointer pInfo) 或 function(struct & pInfo) 或 function (VCI_BOARD_INFO  pInfo)都不行,
请了解操作的帮助看一下,具体该如何写
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2017-10-23 12:31:30 | 显示全部楼层
PVCI_BOARD_INFO应该是结构体指针,指针一般前面有一个P,而且对数里的结构体基本都是指针,
你的写法没有问题,结构体指针在aardio里应声明为struct &,DWORD 是无符号的应当在aardio中写为大写的INT。

并不是你API都写对了结果就一定正确,这个你还是要具体核对DLL的文档,你都声明对了,但实际参数任何一个写错了,结果都可能是错的。
回复

使用道具 举报

4

主题

18

帖子

99

积分

一级会员

Rank: 2

积分
99
 楼主| 发表于 2017-10-23 12:48:18 | 显示全部楼层
多谢 Jacen.He 关注

吃饭时候发现了原因,终于发现了:所有关于帮助文档里面 函数定义的例子里面都没有静态参数类型定义。

把pointer删除就解决了,aardio函数参数定义时候是动态类型的,不写类型。。。

ReadBoardInfo=function(pointer pInfo){        
        return ::PCAN.VCI_ReadBoardInfo(::devType,::devIdx,pInfo);
};


多谢 Jacen.He 关注
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2017-10-23 12:53:27 | 显示全部楼层
waleson 发表于 2017-10-23 12:48
多谢 Jacen.He 关注

吃饭时候发现了原因,终于发现了:所有关于帮助文档里面 函数定义的例子里面都没有 ...


我还真没注意到你这里写错了,
不过这里写错了,运行的时候会报pInfo前面有语法错误的,

aardio本身是动态语言,不需要写变量的类型,
但是在API函数声明里可以写静态类型,结构体里也可以写静态类型,
普通的aardio函数里不用写变量类型。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-21 22:42 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表