开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 958|回复: 2
收起左侧

[讨论] 求易写易库正确返回通用型的方式

[复制链接]
结帖率:100% (3/3)
发表于 2023-5-19 03:31:36 | 显示全部楼层 |阅读模式   湖南省娄底市
使用的是易写易库梦优勿扰版首先定义一个返回值为通用型的命令
  
命令_添加参数 (“内存指针”, #数据类型_整数型, “”, , )
命令_添加参数 (“类别”, #数据类型_整数型, “可空,默认3,内存块指针。0.包头,正常的包头为long的字节集 { 108, 111, 110, 103 } 1.结构版本号,本版本号是结构版本号,不是支持库版本号 2.成员数量 3.内存块指针 4.内存块大小 5.内存块已使用大小 6.增量大小 7.内存块当前读写位置”, 3, #参数_有默认值 )
命令_添加 (&结构体_取指针信息, “结构取指针信息”, “结构体_取指针信息”, “结构体_取指针信息”, “”, 2, , #数据类型_通用型, #级别_初级, , )

接着是这个命令的过程
  
子程序名返回值类型公开备 注
结构体_取指针信息 
参数名类 型参考可空数组备 注
返回地址整数型
参数数量整数型
参数地址整数型
变量名类 型静态数组备 注
参数信息参数数据信息0
内存指针整数型 
类别整数型 
取参数数据信息 (参数信息, 参数数量, 参数地址)
内存指针 = 指针到整数1 (参数信息 [1].数据地址)
类别 = 指针到整数1 (参数信息 [2].数据地址)
判断 (类别 = 0)
返回字节集值 (返回地址, 指针到字节集 (内存指针, 4))
判断 (类别 = 1)
返回整数型值 (返回地址, 汇编__读整数偏移 (内存指针, 4))



下面是调用这个支持库命令的代码
  
子程序名返回值类型公开备 注
支持库命令测试  
变量名类 型静态数组备 注
内存指针整数型 
i整数型 
返回整数型 
内存指针 = 结构新建 (, )
返回 = 结构取指针信息 (内存指针, 1)
调试输出 (返回)


i支持库列表   支持库注释   
ljgt(未知支持库)
spec特殊功能支持库


报错截图
11111.png

虚心求教,如何在通用型返回的支持库命令中,正确返回对应的数据类型
结帖率:100% (10/10)
发表于 2023-12-13 19:01:49 | 显示全部楼层   山西省太原市
这些用到的支持库和模块 源码 啥的 能分享上来嘛
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 4 天

 楼主| 发表于 2023-11-28 04:19:45 | 显示全部楼层   湖南省娄底市
今天心血来潮又研究一下这个问题。翻阅易语言我吃了的易写易库模板源码,将相关关键命令写在下面1.添加命令及到支持库
  
' 4.--(1)特殊功能-- **模拟取字节集数据**
地址 = 申请信息保存空间 (3, #SIZE_ARG_INFO )
生成参数信息 (地址, “字节集”, “”, , , #SDT_BIN, , )
生成参数信息 (地址, “欲取出数据的类型”, “数值同核心支持库。”, , , #SDT_INT, , )
生成参数信息 (地址, “起始位置”, “设置起始取出的位置。”, , , #SDT_INT, , #AS_DEFAULT_VALUE_IS_EMPTY )
生成命令信息 (m_pBeginCmdInfo, “模拟取字节集数据”, “GetBinData”, “模拟核心库的‘取字节集数据()’,演示返回通用型数据。”, #命令类别_特殊功能, , #_SDT_ALL, #LVL_SIMPLE, , , 地址)

其中#_SDT_ALL是为命令信息结构指定了返回类型。
下面是这个支持库命令的关键代码
  
子程序名返回值类型公开备 注
test_GetBinData 4、模拟取字节集数据 (返回值:通用型)
参数名类 型参考可空数组备 注
pRetData整数型返回值地址
nArgCount整数型
pArgInf整数型
变量名类 型静态数组备 注
字节集指针整数型参数1
欲取数据类型整数型参数2
起始位置整数型参数3
字节集字节集 
新指针整数型 
字节集长度整数型 
最大可取长度整数型 
' 通过这个子程序来给大家讲一下如何返回通用型数据
字节集指针 = 指针到整数 (pArgInf)  ' 因为 GetArgAddr (pArgInf, 1) = pArgInf 所以就不用GetArgAddr了
欲取数据类型 = 指针到整数 (GetArgAddr (pArgInf, 2))
起始位置 = 指针到整数 (GetArgAddr (pArgInf, 3))
' 首先通过数据地址取得前三个参数值 前面说很多了 不再说了
如果真 (欲取数据类型 < #字节型 欲取数据类型 > #文本型 )  ' 判断第二个参数是否有效
NotifySys ( #NRS_RUNTIME_ERR, _取文本指针 (“‘欲取数据类型’参数超出范围!”), 0)  ' 显示运行时错误
返回 ()
' !!!!↓下面这句是返回通用型数据的重点!!置返回数据类型,上面说过了pRetData也是MDATA_INF结构 保存了类型等信息
' 因此我们要设置返回的数据是什么类型!根据第二个参数来设置
SetDataType (pRetData, 多项选择 (欲取数据类型, #SDT_BYTE, #SDT_SHORT, #SDT_INT, #SDT_INT64, #SDT_FLOAT, #SDT_DOUBLE, #SDT_BOOL, #SDT_DATE_TIME, #SDT_SUB_PTR, #SDT_TEXT ))
' SetDataType是为大家省事写好的子程序 直接调用即可
' SetDataType的实际作用是:写内存整数_ (pRetData + 8, 位或 (指针到整数 (pRetData + 8), 数据类型))



pRetData是MDATA_INF数据类型,的结构如下
  
数据类型名公开备 注
MDATA_INF 大小:12 pArgInf中每个参数的结构如此所示
成员名类 型传址数组备 注
Data长整数型 参数数据,基本类型为数据本身,非基本类型(包括文本型和字节集)为数据地址
m_dtDataType整数型 参数类型


也就是说,pRetData的前8字节代表数据本身,后4代表数据类型。
易语言我吃了pRetData赋值文本型代码如下
  
子程序名返回值类型公开备 注
返回文本型值  
参数名类 型参考可空数组备 注
pRetData整数型
返回值文本型
返回副本逻辑型
变量名类 型静态数组备 注
Temp文本型 
如果 (返回副本)
Temp = 返回值
置入代码 ({ 139, 69, 8, 255, 117, 252, 143, 0 })
置入代码 ({ 81, 139, 69, 8, 139, 77, 12, 81, 139, 9, 137, 8, 89, 139, 69, 252, 137, 1, 89, 89 })
置入代码 ({ 201, 194, 16, 0 })


梦优勿扰pRetData赋值文本型代码如下
  
子程序名返回值类型公开备 注
返回文本型值  
参数名类 型参考可空数组备 注
返回值指针整数型
返回值文本型
' mov ecx, dword ptr [esp+0C]
' mov eax, dword ptr [ecx]
' test eax, eax
' je 0C
' mov edx, dword ptr [esp+08]
' mov dword ptr [edx], eax
' mov dword ptr [ecx], 00000000
置入代码 ({ 139, 76, 36, 12, 139, 1, 133, 192, 116, 12, 139, 84, 36, 8, 137, 2, 199, 1, 0, 0, 0, 0 })


现在讲结果。
在支持命令创建的时候,如果指定了返回值为具体的数据类型,则会忽略支持库命令中pRetData指定的返回类型。如果指定的返回是通用型(#_SDT_ALL),则具体返回类型则交给pRetData的后4位。
测试中我输出了易语言我吃了以及梦优勿扰对pRetData的后4位,发现均为空({0,0,0,0})。
对返回pRetData进行再加工
  
返回文本型值 (返回地址, 返回文本)
返回类型 = 位或 (指针到整数 (返回地址 + 8), 参数信息 [1].数据类型)
写内存整数 (返回地址 + 8, 返回类型)

成功将通用型返回实现。
基于梦优勿扰支持库关键代码如下1.添加生成支持库命令
  
子程序名返回值类型公开备 注
建立命令信息  
命令_添加参数 (“参数”, #数据类型_通用型, “一个通用型参数”, , #参数_可空 )
命令_添加 (&返回通用型, “返回通用型”, “”, “”, “”, 1, , #数据类型_通用型, #级别_初级, , )
命令_生成当前索引 ()

2.添加命令
  
子程序名返回值类型公开备 注
返回通用型 
参数名类 型参考可空数组备 注
返回地址整数型
参数数量整数型
参数地址整数型
变量名类 型静态数组备 注
参数信息参数数据信息0
返回文本文本型 
取参数数据信息 (参数信息, 参数数量, 参数地址)
判断 (参数信息 [1].数据类型 = #数据类型_文本型 )
返回文本 = GetTextArg (参数信息 [1].数据地址)
返回文本型值 (返回地址, 返回文本)
' 再处理
' 将数据类型写入返回指针的后4位
返回类型 = 位或 (指针到整数 (返回地址 + 8), #数据类型_文本型 )
写内存整数 (返回地址 + 8, 返回类型)



3.测试支持库代码
  
窗口程序集名保 留  保 留备 注
程序集1   
子程序名返回值类型公开备 注
_启动子程序整数型 本子程序在程序启动后最先执行
变量名类 型静态数组备 注
输出文本文本型 
输出文本 = 返回通用型 (“这里是输入的文本”)
信息框 (输出文本, 0, , )
返回 (0)  ' 可以根据您的需要返回任意数值



i支持库列表   支持库注释   
tyx(未知支持库)


运行结果如下
测试截图.png

最后,在这里非常感谢两位前辈为我们做出的贡献!
为我们易语言玩家提供了如此便捷的支持库开发工具!
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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