emutemp 发表于 2015-2-2 21:18:51

请教Autoit如何实现结构体数组?

本帖最后由 emutemp 于 2015-2-3 08:43 编辑

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

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

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

现在问题是,函数原型中DLL调用结构体时,有很多笔记录,需要用结构体数组来存放,在Autoit里面用DLL调用结构体时,创建的结构体中好像只能存放1笔数据,如何实现“student”这个定义结构体数组的用法,让DLLCALL调用结构体时,能存放多笔数据?

netegg 发表于 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);)

netegg 发表于 2015-2-3 09:42:32

或者用ptr*/ptr**不知道行不行

emutemp 发表于 2015-2-3 12:02:09

本帖最后由 emutemp 于 2015-2-3 13:29 编辑

这样使用?

$tagStudent ="struct;align 1;charstuno;char name;float score;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在将多条返回信息写结构体数组数据时出错了。

netegg 发表于 2015-2-3 19:46:27

$tagStudentArray=dllstructcreate('ptr')行不行

emutemp 发表于 2015-2-3 20:28:02

$tagStudentArray=dllstructcreate('ptr')行不行
netegg 发表于 2015-2-3 19:46 http://www.autoitx.com/images/common/back.gif

    这个语句似乎是独立的,怎么和上面其它的语句关联起来?

emutemp 发表于 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)
这两句语句似乎有问题?

netegg 发表于 2015-2-3 22:04:17

$tagStudentArray="ptr " & dllstructgetptr($tstudent1)& ";ptr " & dllstructgetptr($tstudent2) & ";ptr " & dllstructgetptr($tstudent3) & ";ptr " & dllstructgetptr($tstudent4) & ";ptr "&dllstructgetptr($tstudent5) & ";"

emutemp 发表于 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 http://www.autoitx.com/images/common/back.gif

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

不知这个
$tagStudentArray=dllstructcreate('ptr')
是什么意思,创建1个含有指针数组元素的结构? 怎么和之前的$tagStudent 联系起来用?

zhouhaijin 发表于 2015-2-4 00:12:36

应该是不能

zhouhaijin 发表于 2015-2-4 00:18:14

前断时间跟蛋蛋也请教过这问题,因为存取变量不行所以存取数组变量也不行。P版可能行

nqawen 发表于 2015-2-6 11:04:44

学习的好贴子啊
页: [1]
查看完整版本: 请教Autoit如何实现结构体数组?