|

楼主 |
发表于 2023-11-28 04:19:45
|
显示全部楼层
湖南省娄底市
今天心血来潮又研究一下这个问题。翻阅易语言我吃了的易写易库模板源码,将相关关键命令写在下面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 | | | |
pRetData | 整数型 | | | | nArgCount | 整数型 | | | | pArgInf | 整数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 字节集指针 | 整数型 | | | 欲取数据类型 | 整数型 | | | 起始位置 | 整数型 | | | 字节集 | 字节集 | | | 新指针 | 整数型 | | | 字节集长度 | 整数型 | | | 最大可取长度 | 整数型 | | |
字节集指针 = 指针到整数 (pArgInf ) 欲取数据类型 = 指针到整数 (GetArgAddr (pArgInf, 2 )) 起始位置 = 指针到整数 (GetArgAddr (pArgInf, 3 )) 如果真 (欲取数据类型 < #字节型 或 欲取数据类型 > #文本型 ) NotifySys ( #NRS_RUNTIME_ERR, _取文本指针 (“‘欲取数据类型’参数超出范围!”), 0 ) 返回 () SetDataType (pRetData, 多项选择 (欲取数据类型, #SDT_BYTE, #SDT_SHORT, #SDT_INT, #SDT_INT64, #SDT_FLOAT, #SDT_DOUBLE, #SDT_BOOL, #SDT_DATE_TIME, #SDT_SUB_PTR, #SDT_TEXT ))
pRetData是MDATA_INF数据类型,的结构如下
也就是说,pRetData的前8字节代表数据本身,后4代表数据类型。
易语言我吃了pRetData赋值文本型代码如下
|
返回文本型值 | | | |
pRetData | 整数型 | | | | 返回值 | 文本型 | | | | 返回副本 | 逻辑型 | | | |
如果 (返回副本 ) 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赋值文本型代码如下
置入代码 ({ 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进行再加工
成功将通用型返回实现。
基于梦优勿扰支持库关键代码如下1.添加生成支持库命令
命令_添加参数 (“参数”, #数据类型_通用型, “一个通用型参数”, , #参数_可空 )命令_添加 (&返回通用型, “返回通用型”, “”, “”, “”, 1, , #数据类型_通用型, #级别_初级, , )命令_生成当前索引 ()
2.添加命令
|
返回通用型 | | | |
返回地址 | 整数型 | | | | 参数数量 | 整数型 | | | | 参数地址 | 整数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 参数信息 | 参数数据信息 | | 0 | 返回文本 | 文本型 | | | 取参数数据信息 (参数信息, 参数数量, 参数地址 ) 判断 (参数信息 [1 ].数据类型 = #数据类型_文本型 ) 返回文本 = GetTextArg (参数信息 [1 ].数据地址 ) 返回文本型值 (返回地址, 返回文本 )  返回类型 = 位或 (指针到整数 (返回地址 + 8 ), #数据类型_文本型 ) 写内存整数 (返回地址 + 8, 返回类型 ) 
3.测试支持库代码
运行结果如下
最后,在这里非常感谢两位前辈为我们做出的贡献!
为我们易语言玩家提供了如此便捷的支持库开发工具!
|
|