易语言 取自定义数据类型的大小

点击阅读原文



先说一下易语言的变量储存机制


易语言有基本数据类型和复合数据类型两种
基本数据类型包括:1. 各种整数 2.各种浮点 3. 逻辑值
他们都是储存在栈上的 大小都是固定的 用不着取


复合类型一般储存在堆上 然后在栈上储存堆上数据的引用
其中有几种比较特殊:字符串 字节集 数组
这两种类型的大小虽然储存在堆上的某个地方
但都有专门的取大小函数 直接调用即可


剩下就是自定义数据类型 比如类或者结构
特别是类 类的数据成员都是私有的
假如你想知道别人写的一个模块里一个类的大小
不可能通过数数据成员的方法得到
那如何取到呢?有人可能提出用“取变量地址”这个函数
可惜的是 “取变量地址”取到的永远是栈上的地址


根据上面所说 栈上地址的内容就是堆上地址
但是易语言没有一个用指针取整数的函数
这就需要用一个系统api:RtlMoveMemory
这个函数跟c语言memcpy的功能一样 但是有了他问题就变得容易的多
声明一个整形变量a  q是一个自定义的类或者结构
RtlMoveMemory (取变量地址 (a), 取变量地址 (q), 4)
这样a储存的就是ls在堆区的地址


之后用到一个api:LocalSize
我们都知道堆区内存分配必然用到LocalAlloc/GlobalAlloc
那么也能通过LocalSize取到大小
调试输出 (LocalSize (a))
之后这样输出的就是ls的大小


当然 相同的数据类型 大小肯定是不变的

每次需要的时候不用都取

取一次之后当常数用就好了





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本模块界面使用EXUI制作,内部没有包含其他模块,使用模块时如果提示载入ex_ui支持库失败的,请到iexui.com下载2017.02.26版本的支持库(注意版本,不同版本可能会出现不兼容),模块中包含了卸载用的uninstall.exe文件,这个文件在安装时可选是否释放,以便于后续客户双击uninstall.exe直接卸载程序(这个程序其实也就是模块自身的自我配置的EXE文件)。 功能 本模块支持外部单独压缩文件和资源数据文件两种方式,资源文件方式已测支持最大200MB左右,测试400MB加入易语言资源表中易语言会崩。 原理 本模块的一半原理和WinRAR的自解压相似,除了界面稍微好看(傲娇0.1秒中……),算法就比较老了,利用扩展支持库ZIP压缩解压支持库实现,没有多大的技术含量。 使用 1、外部单独压缩文件方式: 1)、这种方式下,需要将整理好的文件打包成一个标准的zip压缩包(必须是标准的zip压缩包,推荐使用WinRAR压缩),压缩时可以不用连主文件夹压缩进去,因为在调用安装的时候,可以选择填写文件夹名称的,压缩完毕后的文件,可以自己修改后缀名混淆,比如改成:Package.dat;这时候调用安装的文件名就写入:Package.dat,如果是需要解压多个压缩文件(不能是分卷压缩的压缩包,必须是单独压缩的多个压缩包),则安装的文件名就用半角;符号隔开,同时安装类型必须是0,编译后的Setup.exe(可以自行命名)必须和这(些)压缩包放在一起,这种方法推荐文件压缩后超过200MB的使用。 2、内部资源安装方式: 1)、压缩文件方法同上,这种方式下,没有独立的压缩资源包,直接将压缩好的文件导入到资源中,双击安装的时候会自动释放到临时文件夹中,进行安装,此时安装的类型必须是1,这种方式编译后只有一个EXE。 3、支持创建卸载文件(卸载EXE图片支持替换,图像大小不超过1MB),卸载若系统没有限制目录权限,能实现干净完整卸载。 4、支持强制安装在指定文件夹; 5、支持可选性的快速安装和自定义安装两种模式; 5、支持创建快捷方式、开机启动、快速启动栏(这个暂时无效); 其他的就没什么大作用了,其实也都没什么大作用。
这两天搬C++代码到 易语言 上,虽然一路顺风,但是感觉有点乱,比如数据结构之类的,有些的结构复杂,要自己计算偏移量 于是,灵感来了,把C++的结构代码复制到易语言里,然后解析一下,如果调用C++返回的是数据 结构的话,把指针出来,然后利用本模块便可以模拟加载指针到 动态数据 类型。 步骤:(如果是有指针的) 1、置入相关结构大小() (如果有无法识别的 且不为C++中的指针类型将会默认认为是int型,所以先置入,避免结构出错,没有其他结构的就不管) 2、解析类() (把C++中的结构粘过来解析一下,解析完成后将返回xx结构的大小,类似于C++中定义xx类型后,调用sizeof()一样) 3、置xx指针() (把指针置入进去) 4、Get() 就可以愉快的出值啦,默认可以出int,string。如果是其他自定义的xx结构,将会返回字节集,如果C++中原本是指针类型的,这里就返回指针 如果是没有指针的,而是我们创建数据 类型传入C++中 1、置入相关结构大小() 同上 2、解析类() 同上 3、创建数据 空间() 就类似于C++中的先new初始化一下空间 4、Set() 设置值啦! 5、指针() 自定义xx类型结构的指针,然后传入DLL函数中调用C++。 下面是我的实验截图: 1、C++中原本定义的结构: 2、C++中调用,然后先一下结构大小 3、把结构粘贴到易语言中 4、运行一下。 5、至于使用,已经在exosip项目里测试过了,值没问题。
精易模块V6.9.1 what's new:(20181201) 一、新增 1、新增“文本_到小写EX”API版将指定文本转换为小写; 2、新增“文本_寻找文本”调用Ntdll命令,比核心库快三倍以上; 3、新增“进程_系统进程列表”调用ntdll命令枚举进程列表并获相关信息; 4、新增“文本_分割文本”分割文本获非空文本成员;感谢【@dangerace 】提供源码 5、新增“网页_GZIP压缩_文本”“网页_GZIP解压_文本”针对字符串压缩处理,web端标准的gzip压缩结果;感谢【@surplus 】提供源码; 6、新增“窗口_发送拖放消息”将指定路径的文件以拖放消息的形式发送到指定句柄的窗口; 7、新增“类_外部选择夹”相关命令17个,实现指定句柄外部选择夹的基本操作; 二、修复 1、修复“文本_删除指定文件文本行1”“文本_删除指定变量文本行1”在删除行数为末行时删除失败的BUG;感谢【@ dangerace 】反馈问题 感谢【@jr21066 】修复源码; 2、修复“进制_十六到十”转换结果异常的问题,【@haishifu 】提供修复代码; 3、修复“时间_转为GMT格式1”“时间_转为GMT格式2”未赋值时间导致转换错误的BUG;感谢【@xdm1957 】反馈; 4、修复“程序_内存中运行EXE”修复无法正确执行的问题;感谢【@jr21066 】反馈; 5、修复“文本_是否为汉字2”第一个字符为汉字返回假的问题;感谢【@bianyuan456 】反馈; 6、修复“文件_创建映射对象”内部DLL调用错误的导致的创建错误;感谢【@喝杯热水就好了 】反馈; 7、修复“字节集_子替换”内部判断导致的替换错误的BUG;感谢【@一切都会过去 】 三、优化 1、优化“网页_访问S”对提交cookie 传入值的判断;感谢【@915743805 】反馈 2、优化“窗口_写字”“类_通用对话框 - 选择字体”内部调用变量类型,统一类型调用;感谢【@福仔 】提出建议; 3、优化“外部超级列表框”类,精简代码提升执行效率;感谢【@福仔 】提出建议; 4、优化“RtlMoveMemory”相关API命令的命名;感谢【@福仔 】提出建议; 5、优化部分API命名上对A与W版的补全; 6、优化“窗口_置位置和大小”参数 左边位置 和 顶边位置 的顺序; 7、优化“文本_指定文件文本行1”“文本_指定变量文本行1”对于参数文件号为0的判断; 8、优化“文本_是否为汉字”命令备注为“中间不能有空格,判断一个文本是否全为汉字,是汉字返回真,否则返回假”;感谢【@bianyuan456 】反馈; 四、移除 1、移除“_GDIpLoadImageFromFile”“_获图像格式对应的Clsid”“CLSIDFromStringA” “API_判断窗口状态”“API_RegEnumKey”“API_RegEnumValue”“_GDIpSaveImageToStream” 以及一些未公开内部重复调用的DLL命令;感谢【@福仔 】提出建议; 2、移除“外部超级列表框”类  “_内存变量地址_”相关命令,替换为“数据_通用型”;感谢【@福仔 】提出建议; 3、移除“写屏幕”自定义数据类型,整合统一调用“LOGFONT”自定义数据类型; 4、移除“选择夹_子夹数”“选择夹_现行子夹”“选择夹_置现行子夹”,三个命令已整合到“类_外部选择夹”中; 5、移除“RtlMoveMemory_整数型1”“RtlMoveMemory_整数型_传址”有相同DLL命令,移除重复命令;
精易模块V6.9.1 what's new:(20181201) 一、新增 1、新增“文本_到小写EX”API版将指定文本转换为小写; 2、新增“文本_寻找文本”调用Ntdll命令,比核心库快三倍以上; 3、新增“进程_系统进程列表”调用ntdll命令枚举进程列表并获相关信息; 4、新增“文本_分割文本”分割文本获非空文本成员;感谢【@dangerace 】提供源码 5、新增“网页_GZIP压缩_文本”“网页_GZIP解压_文本”针对字符串压缩处理,web端标准的gzip压缩结果;感谢【@surplus 】提供源码; 6、新增“窗口_发送拖放消息”将指定路径的文件以拖放消息的形式发送到指定句柄的窗口; 7、新增“类_外部选择夹”相关命令17个,实现指定句柄外部选择夹的基本操作; 二、修复 1、修复“文本_删除指定文件文本行1”“文本_删除指定变量文本行1”在删除行数为末行时删除失败的BUG;感谢【@ dangerace 】反馈问题 感谢【@jr21066 】修复源码; 2、修复“进制_十六到十”转换结果异常的问题,【@haishifu 】提供修复代码; 3、修复“时间_转为GMT格式1”“时间_转为GMT格式2”未赋值时间导致转换错误的BUG;感谢【@xdm1957 】反馈; 4、修复“程序_内存中运行EXE”修复无法正确执行的问题;感谢【@jr21066 】反馈; 5、修复“文本_是否为汉字2”第一个字符为汉字返回假的问题;感谢【@bianyuan456 】反馈; 6、修复“文件_创建映射对象”内部DLL调用错误的导致的创建错误;感谢【@喝杯热水就好了 】反馈; 7、修复“字节集_子替换”内部判断导致的替换错误的BUG;感谢【@一切都会过去 】 三、优化 1、优化“网页_访问S”对提交cookie 传入值的判断;感谢【@915743805 】反馈 2、优化“窗口_写字”“类_通用对话框 - 选择字体”内部调用变量类型,统一类型调用;感谢【@福仔 】提出建议; 3、优化“外部超级列表框”类,精简代码提升执行效率;感谢【@福仔 】提出建议; 4、优化“RtlMoveMemory”相关API命令的命名;感谢【@福仔 】提出建议; 5、优化部分API命名上对A与W版的补全; 6、优化“窗口_置位置和大小”参数 左边位置 和 顶边位置 的顺序; 7、优化“文本_指定文件文本行1”“文本_指定变量文本行1”对于参数文件号为0的判断; 8、优化“文本_是否为汉字”命令备注为“中间不能有空格,判断一个文本是否全为汉字,是汉字返回真,否则返回假”;感谢【@bianyuan456 】反馈; 四、移除 1、移除“_GDIpLoadImageFromFile”“_获图像格式对应的Clsid”“CLSIDFromStringA” “API_判断窗口状态”“API_RegEnumKey”“API_RegEnumValue”“_GDIpSaveImageToStream” 以及一些未公开内部重复调用的DLL命令;感谢【@福仔 】提出建议; 2、移除“外部超级列表框”类  “_内存变量地址_”相关命令,替换为“数据_通用型”;感谢【@福仔 】提出建议; 3、移除“写屏幕”自定义数据类型,整合统一调用“LOGFONT”自定义数据类型; 4、移除“选择夹_子夹数”“选择夹_现行子夹”“选择夹_置现行子夹”,三个命令已整合到“类_外部选择夹”中; 5、移除“RtlMoveMemory_整数型1”“RtlMoveMemory_整数型_传址”有相同DLL命令,移除重复命令;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值