打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Delphi退出报错参考资料(1)

Delphi退出报错参考资料(1)

465人阅读 评论(0) 收藏 举报

关于在delphi写的程序在退出时出现Runtime Error的解决办法

作者:sabason
QQ:19699100
email:sabason@126.com



    这两天在破解一外挂程序,发现自己用delphi写的dll在外挂程序退出时出现Runtime Error,网上一查有一篇文章为<<Delphi中利用SEH屏蔽退出时的Runtime Error>>的提出用SEH来

解决,其实就是跳过,但我觉得这样不好,内存泄露严重,于时就下定决定解决这个问题。经过对程序调试终于查出问题所在,并完美解决了。现总结并将解决过程写给大家,给有同样

困扰的朋友一个借鉴.
   首先问题出在退出才现,那么应该想到先从程序的退出运行的程序查起,具体到我的程序就是dll的 Dll_Process_Detach: UnStart;先下断点运行程序,然后断在此处理,这时用f7

跟进,最终发现在运行到某处理就出Runtime Error,...............这中间的思考我就不说了,直接说解决相关的吧。
    解决方法如下:
    在delphi退出程序出错的调试方法是,将classes单元的路径加入到工程的debug search patch中 也加入到search source path中,这样让classes单元可以下断点,
断点的位置可以选在如下开始的地方
finalization
  UnRegisterModuleClasses(HInstance);
  GlobalNameSpace.BeginWrite;
  FreeIntConstList;
  RemoveFixupReferences(nil, '');
  FreeAndNil(GlobalFixupList);
  FreeAndNil(GlobalLists);
  FreeAndNil(RegGroups);
  GlobalNameSpace := nil;
  RemoveModuleUnloadProc(ModuleUnload);
  FreeAndNil(SyncList);
  DoneThreadSynchronization;
  FreeAndNil(FindGlobalComponentProcs);
原理是上面这段程序就是对程序退出处理delphi的类注册在内存中的资源的释放,然后由于我们在delphi写的dll中用到了getmemory的话就会,在堆中占用这个系统classes单元的类注

册的list.add(item),其中某个item附近,从而破坏了其对象数据,其实不叫破坏,因为如果破坏了的话,程序也不可能能正常运行,而只是在退出时出现什么Runtime Error,但就是这

种原因使之在finalization中的程序在运行到freemem时就出错了,我估计应该是delphi的内存管理有问题吧,至少有bug。通过下断点用排除法,来确定出错的具体位置,然后在

ollydbg来调试下出错内存地址访问的硬件断点就可以看清具体原因了。
  对于这种问题,可能要仔细分析delphi的内存管理了,那样太费时间了,我找了个简单的方法来解决这个问题,那就是我在dll中不用getmemory,在而要用到的内存空间估计好,然后

在代码段中直接以公共变量型式声明如  SaveMyLicInfo:array[0..$2000] of char; CurrAllocMem:pointer=nil;然后用currallocmem来记录已用的内存地址,实现自己的mygetmemory

处理动态内存。这样处理后终于在退出程序时不出现Runtime Error了
   总结,这个错误网上有人用<<Delphi中利用SEH屏蔽退出时的Runtime Error>>这篇文来解决,但我觉得不太好,这样出现很多内存泄露!其实还有其解决办法,主要还是要搞清出错的

原因,然后就可以想出对应的方法解决了。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
delphi Dll 中封装多窗体
Delphi正则表达式使用方法(TPerlRegEx)
Delphi中关于资源释放(Free,Relealse,FreeAndNil)
Delphi的"Invalid pointer operation"异常的解决办法 - D...
DELPHI的BPL使用(收藏)
Delphi中Create(nil),Create(self),Create(Application)区别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服