任意类型 互转 字节集
https://bbs.125.la/forum.php?mod=viewthread&tid=14824177
(出处: 精易论坛)
这个帖子里,有人提到,想要自动获取出传递的对象的数据类型尺寸,省去多传递一个参数
想了一下,有个奇淫技巧是可行的
(这是取出基本数据的尺寸,如果要获取自定义类型的尺寸,参数上面的链接里面的源码解析)
易语言传递通用型,就像C的cdecl调用约定一样,被调函数不知道你传了多少个参数,每个参数多大,只有主调函数知道(所以cdecl需要外平栈),
易语言单纯的在调用的时候,是多大,就push多大,然后被调函数是不知道的,但是它默认就当成4字节了
比如下面的代码:
第二个参数,传4字节的没有问题,正常输出1 2,如果第二个参数传了个8字节,后面的参数,就不识别了
顺带记录一下:易语言带通用型的也是stdcall,返回的时候当4字节处理了(如果计次循环里调用有通用型的参数,就会堆栈不平衡崩溃乱套了,其他情况没见崩溃大概是因为,易语言先集中申请了栈空间,后面不平衡会导致栈顶多了个,但是后续并不是通过栈顶定位变量的)
这么说起来被调函数,理论上是没有办法获取到的……
但是因为主调函数知道,所以获取到主调函数的代码部分,分析他到底push了多少个4字节,不就知道传进来的参数到底多大了吗
原理就是通过ebp找到返回地址,获取到返回地址前面,call的时候,附近的字节码,分析,到底push了多少,就得出参数大小!
通用型长度判断.e
(5.81 KB, 下载次数: 14, 售价: 1 枚 精币)
|