开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6938|回复: 28
收起左侧

[易语言纯源码] 取CPU基准速度(Ghz) - 敲黑板:易语言自定义数据类型数组内存格式及调用API时的转换

[复制链接]
结帖率:83% (39/47)
发表于 2018-11-5 19:37:34 | 显示全部楼层 |阅读模式   福建省宁德市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
偶然有兴致,研究了一下易语言的一些变量内存格式
https://bbs.125.la/forum.php?mod=viewthread&tid=14232322
但是有个问题一直没搞懂:就是汇编取自定义数据类型地址然后传递给API调用时,会异常
后来搞了个调用CallNtPowerInformation函数读取CPU频率信息的功能,我又想到了自定义数据类型的问题
QQ截图20181105193506.png
昨晚再次研究了一下发现,我以前的思路就是错的...因为我在【DLL命令定义表】的参数传指提示中发现了这句话:
某些实际Dll库命令的参数需要接收数据地址,设置本属性为真可以确保将参数数据的地址传递过去。如果参数数据的类型为数组、文本、字节集、用户定义数据类型、库定义数据类型,则无论此属性是否为真,都将传递数据地址。如果本属性为真且调用 Dll 命令时所传递过来数据的类型与相应位置处所定义参数的数据类型不一致但可以相互转换,则系统先分配一段临时内存空间,然后进行转换并将转换后的数据存放到该空间,最后将此内存空间的地址传递到实际的 Dll 库命令。
反正这意思就是,易语言会将数组啊、自定义数据类型那些东西,在调用API的时候二次封装,调用API结束后再给一个个成员赋值回来。
所以嘛,本文章就是给新手讲解一下易语言的数组、自定义数据类型在易语言内存中的格式以及调用API时是怎么转换的。
为了方便查看,就用json格式来展示吧:

{
        "数组变量栈指针":{
                "+4":"数组成员数",
                "+8":"数组指针"
        },
        "易语言数组指针":{
                "数组成员0":[{
                                "数据类型成员0指针":"数据类型成员0内容"
                        },{
                                "数据类型成员1指针":"数据类型成员1内容"
                        },{
                                "数据类型成员2指针":"数据类型成员2内容"
                        }],
                "数组成员1":[{
                                "数据类型成员0指针":"数据类型成员0内容"
                        },{
                                "数据类型成员1指针":"数据类型成员1内容"
                        },{
                                "数据类型成员2指针":"数据类型成员2内容"
                        }],
                "数组成员2":[{
                                "数据类型成员0指针":"数据类型成员0内容"
                        },{
                                "数据类型成员1指针":"数据类型成员1内容"
                        },{
                                "数据类型成员2指针":"数据类型成员2内容"
                        }]
        },
        "调用API时转换成一段字节集(四字节对齐的)":"数据类型成员0,数据类型成员1,数据类型成员2,数据类型成员0,数据类型成员1,数据类型成员2,数据类型成员0,数据类型成员1,数据类型成员2"
}

比如说我们调用API,传递了这个数据类型
  
数据类型名公开备 注
数据类型1 
成员名类 型传址数组备 注
a整数型  
b整数型  
c字节集  


易语言在调用时会自动打包一个格式:成员a内容+成员b内容+成员c指针  所以一共是传递了3*4=12字节的数据+字节集指针指向的堆内存


我们操作变量指针第一步其实只需要获取变量栈内存地址,别人封装的其它数据类型那些其实无非就是增加了一些指针的加减操作罢了
比如,文本型指针只需要读栈内存指向的地址即可,字节集指针需要读栈内存指向的堆内存地址+8,+8是因为易语言这样定的格式
指针到整数(指针_取变量地址(字节集)+4) = 字节集长度     指针到整数(指针_取变量地址(字节集)+8)=字节集数据

有许许多多的骚操作都是玩指针实现的,可能平时用不到,但是这知识我认为是必须掌握的
多一份知识,在面对同一个问题时就会多一份方案,这样就可以根据自己的经验来判断哪种方案最合适

顺便提一下,我仔细研究了一下发现,易语言应该是不适合直接用指针方式“复制”变量的,最多做到交换变量指针(栈指向的堆内存)
而且数据类型要匹配,否则100%的内存泄露...目前没有什么完美的方案能够读取易语言的自定义数据类型,更别提复制了。


CallNtPowerInformation.e (10.56 KB, 下载次数: 86)

评分

参与人数 2好评 +2 精币 +1 收起 理由
空竹 + 1 值得学习
kyo9766 + 1 + 1 精易有你更精彩

查看全部评分


本帖被以下淘专辑推荐:

签到天数: 8 天

发表于 2024-2-1 11:59:12 | 显示全部楼层   江苏省南京市
竟然也有人研究这个,不能骚就不是易了
回复 支持 反对

使用道具 举报

发表于 2021-12-20 19:52:59 高大上手机用户 | 显示全部楼层   陕西省西安市
l哦靠薛一鸣我怀疑
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2020-7-28 14:30:14 | 显示全部楼层   江苏省无锡市
哎哟能用就行了怎么像个shabi似的去研究这些呢,浪费时间
回复 支持 反对

使用道具 举报

发表于 2020-2-3 22:37:57 | 显示全部楼层   上海市上海市
大佬,NB,我来学习了
回复 支持 反对

使用道具 举报

发表于 2019-9-26 21:51:32 | 显示全部楼层   海南省海口市
灵歌流弊
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 13 天

发表于 2018-11-12 09:49:01 | 显示全部楼层   广东省深圳市
高级货,支持一个。
回复 支持 反对

使用道具 举报

结帖率:67% (22/33)
发表于 2018-11-7 22:36:57 | 显示全部楼层   海南省琼海市
11111111111111111111
回复 支持 反对

使用道具 举报

签到天数: 10 天

发表于 2018-11-7 21:22:13 | 显示全部楼层   重庆市重庆市
这个值得一看
回复 支持 反对

使用道具 举报

签到天数: 8 天

发表于 2018-11-7 10:22:44 | 显示全部楼层   浙江省宁波市
福福福福福福福福福
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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