参考属性的说明:表示子程序的参数在传递数据时是否为传递数据的地址(也就是传递变量在内存中的地址);简单的说就是如果参考属性上打勾,都是传递变量的内存地址;如果不打勾则是传递变量的内容;
但是如果所传递的参数为:数组、用户自定义数据类型、库自定义类型、文本型、字节集型,都传递的是变最在内存中的地址!也就是说当你传递的数据类型为上面的几种,不管你的参考属性是否选中都是传递变量在内存中的地址;
当数据类型为:整数型、小数型、双精度小数型时,当参考属性没有选中时,传递的是变量的值,而不是变量的内存地址;只有当参考属性为选中时,才传递变量的内存地址; 全文地址: http://bbs./thread-176269-1-1.html
易语言表面上是不支持返回数组数据的。要达到要求,可以用参数实现,也可以自己构造整型数组结构,取结构首地址,返回首地址,这个有点点难度。关于参数实现:易语言支持参数为数组。你就先申请一个没数据的数组,传递给子程序,子程序再往里写值…
用易语言自己弄dll文件 自己做程序 怎么设计才能传递数组型的参数? (目的:将dll中某数组传给此程序)
在DLL里面公开的某个子程序下面再添加一个参数 并且 把 数组 和 传址 和可空 勾上 再在这个子程序运行的最后面 把那个新添加的参数 赋值成 你需要返回的数组数据 然后调用该子程序时 填写 最下面那个参数时候 用一个新变量填写进去 运行完这个命令后 那个新变量里面的值 就是那个子程序返回的数组数据了
#以下代码可以直接复制到易语言IDE使用: | .子程序 __启动窗口_创建完毕 .局部变量 ListArr, 文本型, , "0" .局部变量 i, 整数型
_SearchFile (“C:\WINDOWS\Web\”, “*.*”, ListArr) .计次循环首 (取数组下标 (ListArr, ), i) 输出调试文本 (“File ” + 到文本 (i) + “ ” + ListArr [i]) .计次循环尾 ()
| .子程序 _SearchFile .参数 Dir, 文本型 .参数 FileName, 文本型 .参数 FileListArr, 文本型, 参考 数组 .局部变量 search_result, 文本型
' 路径兼容 .如果真 (取文本右边 (Dir, 1) ≠ “\”) Dir = Dir + “\” .如果真结束
' 根目录 search_result = 寻找文件 (Dir + FileName, ) .判断循环首 (search_result ≠ “”) .如果真 (search_result ≠ “.” 且 search_result ≠ “..”) 加入成员 (FileListArr, Dir + search_result) ' 输出调试文本 (Dir + search_result) .如果真结束 search_result = 寻找文件 (, )
.判断循环尾 ()
' 递归子目录 search_result = 寻找文件 (Dir + “*.*”, #子目录) .判断循环首 (search_result ≠ “”) .如果真 (search_result ≠ “.” 且 search_result ≠ “..”) _SearchFile (Dir + search_result, FileName, FileListArr) .如果真结束 search_result = 寻找文件 (, #子目录) .判断循环尾 ()
| #以上代码使用易代码高亮格式工具JS版格式化 |
关于易语言连续调用DLL导致返回值出错问题举例和解决办法 目前在用易语言比较大点的项目的时候,大家往往采用了将功能模块封装为DLL,各模块间相互调用以及主程序整体调用的方式,这样做得好处是增强了代码或者功能重用的可能性,降低后期维护成本,同时这种开发也可以用易语言模块去做,但模块更新后都需要重新编译程序,所以DLL相对更方便一些,但是目前采用易语言编写的DLL,具有返回值(文本型)DLL中接口被连续调用的时候,会导致返回值出错(部分乱码),经过测试确认,目前无法直接解决此问题,原因:对于返回文本或字节集的DLL命令,所返回的数据是临时存放在一段内存中的,而且下次调用该DLL命令会同时销毁上次所分配的内存,所以如果在一条语句中多次调用了同一个DLL命令,就会产生冲突 ,第二次调用的同名的DLL命令会把第一次调用时所返回的数据销毁,所以就会出错,并且目前没有更好的方法解决,因为易语言不支持指针,不能象api那样接受一个缓冲区过来。 为了减少大家使用的误区和提高程序编写的可靠性,特对本问题作如下举例说明并且归纳出两种解决方法供大家参考。 案例如下: 有一个易语言编写的DLL文件内容如下: 文件名:测试.DLL .版本 2 .程序集 程序集1 .子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码 _临时子程序 () ' 在初始化代码执行完毕后调用测试代码 返回 (0) ' 返回值被忽略。 .子程序 _临时子程序 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。 .子程序 外部接口_测试, 文本型, 公开 .参数 参_text, 文本型 参_text = 参_text + “ ” 返回 (参_text) 代码没有太多操作,只是简单的将原始文本附加一个空格。 简单的写一个调用程序。 测试调用.e 代码如下: DLL申明: .版本 2 .DLL命令 外部接口_测试, 文本型, "测试.dll", "外部接口_测试" .参数 参_text, 文本型 调用代码: .版本 2 .程序集 窗口程序集1 .子程序 __启动窗口_创建完毕 .局部变量 局部_text, 文本型 局部_text = 外部接口_测试 (“易语言DLL调用测试”) + “ ” + 外部接口_测试 (“易语言DLL调用测试”) + “ ” + 外部接口_测试 (“易语言DLL调用测试”) + “ ” + 外部接口_测试 (“易语言DLL调用测试”) 输出调试文本 (局部_text) 输出的结果却为: * 瓠 易语言DLL调用测试 瓠 易语言DLL调用测试 从结果可以看出,部分应该输出为“易语言DLL调用测试”,却出现了“瓠 ”,就是这样的问题。 解决办法: 办法1: 多次调用写法改为: 子程序名 | 返回值类型 | 公开 | 备 注 | .子程序 | __启动窗口_创建完毕 | , | | , | | , | |
.变量名 | 类 型 | 静态 | 数组 | 备 注 | .局部变量 | 局部_text | , | 文本型 | , | | , | | , | |
局部_text = 外部接口_测试 (“易语言DLL调用测试”) | .常量 |
局部_text = 局部_text + 外部接口_测试 (“易语言DLL调用测试”) | .常量 |
局部_text = 局部_text + 外部接口_测试 (“易语言DLL调用测试”) | .常量 |
局部_text = 局部_text + 外部接口_测试 (“易语言DLL调用测试”) | .常量 |
局部_text = 局部_text + 外部接口_测试 (“易语言DLL调用测试”) | .常量 |
输出结果: * 易语言DLL调用测试 易语言DLL调用测试 易语言DLL调用测试 易语言DLL调用测试 以上方法可以解决,可以正确显示处理结果,但相对比较麻烦,尤其是对于较多类似数据处理的时候,就显得很麻烦。 办法2: 增加一个对调用进行二次处理的内部子程序,每次将数据接收并且返回,这样也可以达到效果,并且这个办法相对更加实用一些,代码如下: 程序集名 | 保 留 | 保 留 | 备 注 | .程序集 | 窗口程序集1 | | | , , | | . | 变量名 | 类 型 | 数组 | 备 注 |
.子程序名 | 返回值类型 | 公开 | 备 注 | .子程序 | __启动窗口_创建完毕 | , | | , | | , | |
.变量名 | 类 型 | 静态 | 数组 | 备 注 | .局部变量 | 局部_text | , | 文本型 | , | | , | | , | |
局部_text = 外部接口_测试_二次处理 (“易语言DLL调用测试”) + “ ”+ 外部接口_测试_二次处理 (“易语言DLL调用测试”) + “ ”+ 外部接口_测试_二次处理 (“易语言DLL调用测试”) + “ ”+ 外部接口_测试_二次处理 (“易语言DLL调用测试”) | .常量 |
.子程序名 | 返回值类型 | 公开 | 备 注 | .子程序 | 外部接口_测试_二次处理 | , | 文本型 | , | | , | | .参数名 | .类 型 | .参考 | .可空 | .数组 | .备 注 | .参数 | 参数_文本 | , | 文本型 | , | | | | , | | 输出结果:* 易语言DLL调用测试 易语言DLL调用测试 易语言DLL调用测试 易语言DLL调用测试 可见这样也可以得到正确结果,这种方式就可以将调用放在一条语句中,所以推荐这种处理方法。 相关文件下载 | 本页面地址:http://www./news/bc/e/2009093012125172.html
|
调用子程序一样啊 .版本 2 .支持库 spec
.子程序 _按钮1_被单击 .局部变量 A, 数据类型1 .局部变量 sss, 整数型
A.姓名 = “袁群” A.年龄 = 45 A.身高 = 1.71 调用子程序 (&parse_data2, , sss, 取变量地址 (A))
' parse_data2 (取变量地址 (A))
.子程序 parse_data2, 整数型 .参数 参数, 整数型 .局部变量 V, 数据类型1
置入代码 ({ 139, 93, 8, 139, 3, 137, 69, 252 }) 输出调试文本 (V.姓名, V.年龄, V.身高) 返回 (0)
|