您的位置:逆风者 易语言 易语言精华 正文
 添加时间:2008-03-21 原文发表:2008-03-21 人气:72 来源:bbs.dywt.com.cn

关于易语言连续调用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:

多次调用写法改为:

.版本 2

.子程序 __启动窗口_创建完毕
.局部变量 局部_text, 文本型


局部_text = 外部接口_测试 (“易语言DLL调用测试”)
局部_text = 局部_text + 外部接口_测试 (“易语言DLL调用测试”)
局部_text = 局部_text + 外部接口_测试 (“易语言DLL调用测试”)
局部_text = 局部_text + 外部接口_测试 (“易语言DLL调用测试”)
局部_text = 局部_text + 外部接口_测试 (“易语言DLL调用测试”)
输出调试文本 (局部_text)

输出结果:

* 易语言DLL调用测试  易语言DLL调用测试  易语言DLL调用测试  易语言DLL调用测试

以上方法可以解决,可以正确显示处理结果,但相对比较麻烦,尤其是对于较多类似数据处理的时候,就显得很麻烦。

办法2:

增加一个对调用进行二次处理的内部子程序,每次将数据接收并且返回,这样也可以达到效果,并且这个办法相对更加实用一些,代码如下:

.版本 2

.程序集 窗口程序集1

.子程序 __启动窗口_创建完毕
.局部变量 局部_text, 文本型

局部_text = 外部接口_测试_二次处理 (“易语言DLL调用测试”) + “ ” + 外部接口_测试_二次处理 (“易语言DLL调用测试”) + “ ” + 外部接口_测试_二次处理 (“易语言DLL调用测试”) + “ ” + 外部接口_测试_二次处理 (“易语言DLL调用测试”)
输出调试文本 (局部_text)

.子程序 外部接口_测试_二次处理, 文本型
.参数 参数_文本, 文本型

返回 (外部接口_测试 (参数_文本))

输出结果:

* 易语言DLL调用测试  易语言DLL调用测试  易语言DLL调用测试  易语言DLL调用测试
可见这样也可以得到正确结果,这种方式就可以将调用放在一条语句中,所以推荐这种处理方法。

相关文件下载:
20083111482470524.rar
下载:
rar 文件

相关文章

COM对象,挂接IE的38个事件
10种强制结束进程方法
断链隐藏进程
易用脚本开源了
易语言之过?谁之过?谁之错?
冲值系统,冲值程序,网络验证,外挂验证,服务
易语言做的web系统
电脑配机系统源代码
利用QQ最新版控件捕捉屏幕
控件使用之标签
《易语言远程控制技术教程》
易语言与Flash交互操作
取汇编指令长度模块源码
运行内存中的程序源码(简单版)
利用Grid++Report的报表事件快速将高级表格
编辑框自动完成

相关评论


本文章所属分类:首页 易语言 易语言精华

  热门关键字: