找回密码
 加入
搜索
查看: 7144|回复: 11

[系统综合] 请教Autoit如何实现结构体数组?

  [复制链接]
发表于 2015-2-2 21:18:51 | 显示全部楼层 |阅读模式
本帖最后由 emutemp 于 2015-2-3 08:43 编辑

Autoit可以使用DllStructCreate来实现结构体。在此基础上,请教如何实现结构体数组的用法?

例如函数原型:
#pragma pack(push,1)
typedef struct student
{        char  stuno[10];//学号一般比较长,用字符数组存放。
         char name[10];//存放姓名
     float score[2];//数组中存放2门课的成绩;
     float sum;//存放总分
     float aver;//存放平均成绩
}student[5];     //结构体数组,能表示5个同学各自的信息

Autoit实现student结构体部分
DllStructCreate("struct;align 1;char  stuno[10];char name[10];float score[2];float sum;float aver;endstruct")

现在问题是,函数原型中DLL调用结构体时,有很多笔记录,需要用结构体数组来存放,在Autoit里面用DLL调用结构体时,创建的结构体中好像只能存放1笔数据,如何实现“student[5]”这个定义结构体数组的用法,让DLLCALL调用结构体时,能存放多笔数据?
发表于 2015-2-3 09:39:10 | 显示全部楼层
$tStudent = dllstructcreate
$tStudentArray = dllstructcreate(ptr dllstructgetptr($tstudent1);ptr dllstructgetptr($tstudent2);ptr dllstructgetptr($tstudent3);ptr dllstructgetptr($tstudent4);ptr dllstructgetptr($tstudent5);)
发表于 2015-2-3 09:42:32 | 显示全部楼层
或者用ptr*/ptr**不知道行不行
 楼主| 发表于 2015-2-3 12:02:09 | 显示全部楼层
本帖最后由 emutemp 于 2015-2-3 13:29 编辑

这样使用?

$tagStudent ="struct;align 1;char  stuno[10];char name[10];float score[2];float sum;float aver;endstruct"
$tStudent1= dllstructcreate($tagStudent )
$tStudent2= dllstructcreate($tagStudent )
$tStudent3= dllstructcreate($tagStudent )
$tStudent4= dllstructcreate($tagStudent )
$tStudent5= dllstructcreate($tagStudent )
$tagStudentArray="ptr dllstructgetptr($tstudent1);ptr dllstructgetptr($tstudent2);ptr dllstructgetptr($tstudent3);ptr dllstructgetptr($tstudent4);ptr dllstructgetptr($tstudent5);"
$tStudentArray = dllstructcreate($tagStudentArray)

$HandleOpen=DllOpen("icomm.dll")
DllCall($HandleOpen,"int","GetInfo","int",$InfoNum,"ptr",DllStructGetPtr($tStudentArray))

似乎还不行,总共有3条信息记录,运行到DLLcall后autoit的脚本进程出错。
dll本身也有日志文件输出,看日志文件,GetInfo函数功能成功调用执行了,也返回了查询到的信息,估计还是autoit在将多条返回信息写结构体数组数据时出错了。
发表于 2015-2-3 19:46:27 | 显示全部楼层
$tagStudentArray=dllstructcreate('ptr[5]')行不行
 楼主| 发表于 2015-2-3 20:28:02 | 显示全部楼层
$tagStudentArray=dllstructcreate('ptr[5]')行不行
netegg 发表于 2015-2-3 19:46


    这个语句似乎是独立的,怎么和上面其它的语句关联起来?
 楼主| 发表于 2015-2-3 20:31:14 | 显示全部楼层
另外,在上面语句里
$tStudentArray = dllstructcreate($tagStudentArray)
后查看@error值,发现被设为1了,手册里ERROR为1是“ 传递给 DllStructCreate 的变量不是字符串.“
$tagStudentArray="ptr dllstructgetptr($tstudent1);ptr dllstructgetptr($tstudent2);ptr dllstructgetptr($tstudent3);ptr dllstructgetptr($tstudent4);ptr dllstructgetptr($tstudent5);"
$tStudentArray = dllstructcreate($tagStudentArray)
这两句语句似乎有问题?
发表于 2015-2-3 22:04:17 | 显示全部楼层
$tagStudentArray="ptr " & dllstructgetptr($tstudent1)& ";ptr " & dllstructgetptr($tstudent2) & ";ptr " & dllstructgetptr($tstudent3) & ";ptr " & dllstructgetptr($tstudent4) & ";ptr "&  dllstructgetptr($tstudent5) & ";"
 楼主| 发表于 2015-2-3 22:51:41 | 显示全部楼层
本帖最后由 emutemp 于 2015-2-3 22:53 编辑
$tagStudentArray="ptr " & dllstructgetptr($tstudent1)& ";ptr " & dllstructgetptr($tstudent2) & ";ptr ...
netegg 发表于 2015-2-3 22:04


谢谢。按这个$tStudentArray = dllstructcreate($tagStudentArray)没出错了。

不知这个
$tagStudentArray=dllstructcreate('ptr[5]')
是什么意思,创建1个含有指针数组元素的结构? 怎么和之前的$tagStudent 联系起来用?
发表于 2015-2-4 00:12:36 | 显示全部楼层
应该是不能
发表于 2015-2-4 00:18:14 | 显示全部楼层
前断时间跟蛋蛋也请教过这问题,因为存取变量不行所以存取数组变量也不行。P版可能行
发表于 2015-2-6 11:04:44 | 显示全部楼层
学习的好贴子啊
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-27 19:22 , Processed in 0.110833 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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