蒋勇api支持库开源带模块写支持库

易语言 2020-07-15 17:07:18

蒋勇api支持库开源带模块写支持库

字节集指针 = 指针到整数 (pArgInf) ' 因为 GetArgAddr (pArgInf, 1) = pArgInf 所以就不用GetArgAddr了
欲取数据类型 = 指针到整数 (根据参数序号取得参数地址 (pArgInf, 2))
起始位置 = 指针到整数 (根据参数序号取得参数地址 (pArgInf, 3))
' 首先通过数据地址取得前三个参数值 前面说很多了 不再说了
.如果真 (欲取数据类型 < #字节型 或 欲取数据类型 > #文本型) ' 判断第二个参数是否有效
调用易语言内部功能函数 (#NR通知系统已经产生运行时错误, _取文本指针 (“‘欲取数据类型’参数超出范围!”), 0) ' 显示运行时错误
返回 ()
.如果真结束
' !!!!↓下面这句是返回通用型数据的重点!!置返回数据类型,上面说过了pRetData也是MDATA_INF结构 保存了类型等信息
' 因此我们要设置返回的数据是什么类型!根据第二个参数来设置
置数据类型 (pRetData, 多项选择 (欲取数据类型, #字节型, #短整数型, #整数型, #长整数型, #小数型, #双精度型, #逻辑型, #日期时间型, #子程序指针, #文本型))
' SetDataType是为大家省事写好的子程序 直接调用即可
' SetDataType的实际作用是:写内存整数_ (pRetData + 8, 位或 (指针到整数 (pRetData + 8), 数据类型))
.如果真 (字节集指针 ≤ 0)
返回 ()
.如果真结束
.如果真 (参数是否为空 (pArgInf, 3) 或 起始位置 ≤ 0) ' IsArgMissing可以判断参数是否为空 相当于 是否为空()
起始位置 = 1 ' 为空或无效则设置默认值
.如果真结束
字节集长度 = 取数组成员总数 (字节集指针) ' GetElementCount可以取得数组的总成员个数 字节集和字节型数组是一样的
' 传递给GetElementCount的参数一定要是“真正的”数据地址 也就是相当于 指针到整数(变量地址) 得到的数据地址
' 为什么会有“真正的”这种说法呢 因为支持库中的 取变量数据地址 和 本例程中的 _取字节集指针 取出的
' 都不是“真正的”数据地址 而是 “真正的”数据地址+8
' ★★★易语言数组的存储方式★★★以下内容同样非常重要 请仔细理解
' 以上所称“真正的”的数据地址以下简称“真实地址”
' 易语言保存数组的真实地址内存结构是:前4个字节是数组总维数n
' 后面n个4个字节分别表示每一维的最大下标 然后才是数组内容
' 比如这样定义的一个多维数组: .局部变量 数组, 整数型, , "3,5" 在内存中用字节集表示的话就是这样:
' { 2,0,0,0, 3,0,0,0, 5,0,0,0, , , , , , , ……}
' 真实地址↑总维数2 ↑第一维最大下标3 ↑第二维最大下标5 ↑数组其内容 保存了各个成员的数值
' 把每一维的最大下标相乘就是成员总数
' 特别的,因为字节集是一个一维的字节型数组
' 因此它真实地址下前4个字节保存的是其维数1,第二个4字节是它的第1维最大下标
' 因为它只有1维 因此这个也就是它的成员个数 也就是该字节集的长度 从第9个字节开始就是该字节集的内容
' 取变量数据地址() 取得的字节集指针就是这第9个字节的地址 也就是 真实地址+8
' 另外大家可能听说过 字节集指针-4 下的内容就是字节集长度 这个道理其实就是这么来的
' 同样的 我们可以说 字节集真实地址+4 下的内容就是该字节集长度
' 如果是非基本类型数组 数组其内容保存的各数值是指向各实际数据的数据地址 前面的维定义结构和上述相同
' - -||这些东西其实sdk里面讲着很清楚 不过可能一般没多少人去看 我无聊就在这继续科普吧
.如果真 (起始位置 > 字节集长度)
调用易语言内部功能函数 (#NR通知系统已经产生运行时错误, _取文本指针 (“起始位置超出字节集数据总长度!”), 0)
返回 ()
.如果真结束
' 下面就是计算地址了进行各种处理了 懒得解释了 自己看吧
最大可取长度 = 字节集长度 - 起始位置 + 1
字节集指针 = 字节集指针 + 8 + 起始位置 - 1
字节集 = 取空白字节集 (最大可取长度 + 8) ' 保证长度一定要大于8
新指针 = _取字节集指针 (字节集)
CopyMemory (新指针, 字节集指针, 最大可取长度)
.如果 (欲取数据类型 ≠ #文本型)
CopyMemory (pRetData, 新指针, 8) ' 如果是基本类型数据 直接拷贝本身进入pRetData
.否则
返回文本型值 (pRetData, 指针到文本 (新指针)) ' 文本型就又要按这样来返回
.如果结束
' 返回通用型数据其实就是这点点代码 可能有些人会以为返回通用型一定要每种类型都来判断一下
' 有些人甚至可能会这么写:
.判断开始断 (欲取数据类型 = #字节型)
' 返回字节型值 (pRetData,xxx)

.' 判断 (欲取数据类型 = #短整数型)
' 返回短整数型值 (pRetData,xxx)

.' 判断 (欲取数据类型 =……)

.默认

.判断结束
' 完全没有必要 要返回的类型中只有文本型特殊 因此只要拉它出来特别处理即可
' 了解了数据在内存中的形式 怎么写入都是一样的