Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 3308|回复: 7

WINCE 下动态加载DLL的奇葩问题,请高手不吝赐教。

[复制链接]

该用户从未签到

发表于 2014-6-4 21:01:30 | 显示全部楼层 |阅读模式
系统:WINCE6.0
编译环境:Lazarus 1.2.2  FPC 2.6.4
硬件平台:三星 2416

问题描述:循环加载一个动态链接库(动态链接库由Lazarus创建),代码如下:

var
  H : THANDLE;
  I : Integer;
begin
  for I := 0 to 100 do begin
    H := LoadLibrary(PWideChar(WideString('iptools.dll')));
    if H <> 0 then begin
      Memo1.Lines.Add('Load Lib OK :'+IntToStr(I));
      if FreeLibrary(H) then
        Memo1.Lines.Add('     Free Lib OK');
    end
    else
      Memo1.Lines.Add('Load Lib Error :'+IntToStr(I));
  end;  

以上代码,只是加载和释放dll不调用DLL内的方法,循环到55次时,循环停止。



回复

使用道具 举报

该用户从未签到

发表于 2014-6-4 22:27:46 | 显示全部楼层
55次的时候没有出错 ?
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2014-6-5 11:01:17 | 显示全部楼层
没有错误信息,放到线程内报系统异常,确认后程序退出。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2014-6-5 13:23:41 | 显示全部楼层
有没有人遇到同样的问题呢?把源码发上来,大家看看。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

x
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2014-6-6 16:21:50 | 显示全部楼层
本帖最后由 逍遥派掌门人 于 2014-6-6 16:25 编辑

1、Memo1里面有没有出错信息?

2、释放出错了,仍然要进行下一次的调用,这显然不合理。

3、两次循环运行之间最好加点延时时间隔开。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2014-6-6 18:23:40 | 显示全部楼层
多谢楼上回复,楼上可以下载附件在模拟器里运行试试看。

1. memo1里只显示加载次数和释放是否成功信息;
2.楼上说释放dll出错?代码中没有调用dll中的方法,而且DLL里也没有初始化的代码,怎么会释放出错?
3.两次循环之间加间隔,我觉得意义不大。

实际应用时是在线程内,每隔一段时间调用读取GPIO的动态链接库。
估计是Bug,希望下个版本有改善。
现在只能临时改成一次加载后不释放,程序退出时一次性释放;

今天又发现第二个问题:
  1. 服务端在wince上:tcp server 加 Sqlite数据库(SQLite动态链接库版本 3.7.15.2);
  2. 客户端从wince上取Sqlite数据库中的数据;
  3. 服务端收到客户端命令,动态创建和释放SQLiteconnection 、SQLtransaction和 SQLQuery 将查询的数据发送给客户端。
   发现有内存溢出问题,无奈了。。。最后只好把 SQliteconnection 和 SQLtransaction 改为公共对象,服务端接收客户端命令后 只动态创建和释放SQlQuery无内存溢出问题。

Lazarus 好东西也好磨人!!!起步艰辛啊,基本是摸着石头过河!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2014-6-7 00:47:46 | 显示全部楼层
摸着石头过河的确比较恰当。在wince下使用TOpenDialog 没搞定,不得不用不太熟悉的vc++,算是通过了,但是还是想在lazarus中解决这个问题。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-11-6 09:33:44 | 显示全部楼层

RE: WINCE 下动态加载DLL的奇葩问题,请高手不吝赐教。

hello5544 发表于 2014-6-6 18:23
多谢楼上回复,楼上可以下载附件在模拟器里运行试试看。

1. memo1里只显示加载次数和释放是否成功信息; ...

你说的SQLite的问题,我在WinCE项目里面,没有发现这样的情况。只是需要注意2点,第一,SQLite的这些组件,绝对不可以跨线程使用,否则会内存溢出,这个问题困扰了我很久,惨痛的教训;第二,最好不要频繁的Commit,否则也容易出问题。结合上面2点,我自己封装了一个类,在一个线程内持续监听,模拟Client/Server的结构,向其它模块提供数据库服务,整个项目就这样一个SQLiteConnection、一个SQLTransaction、一个SQLQuery。目前使用了2年了,没有问题了。
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 09:53 , Processed in 0.030075 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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