使用TWebBrowser时存在内存泄漏问题的解决方案 我会带着你远行 2022-06-14 10:07 160阅读 0赞 用TWebBrower不断打开多个网页,多某些版本的操作系统上运行一段时间后,发现占用系统内存达几百M,直到关闭程序后,占用的内存才能释放。 这个问题在网有很多讨论,比较多人的建议办法是用SetProcessWorkingSetSize(GetCurrentProcess(),-1,-1)处理一下,这个变通的办法貌似可行。 然后在[http://www.winu.cn/space-14160-do-blog-id-270.html][http_www.winu.cn_space-14160-do-blog-id-270.html]出现别一个解决办法,当中提到OLE中存在内存泄露,通过重写OLE函数得以解决问题。 弃而不舍的zhongs终于找到问题的所在,未经验证,抄袭如下: 把TWebBrowser= class(TOleControl)修改为TWebBrowser= class(TrsOleControl) unit rsOleCtrls; interface uses OleCtrls; type TrsOleControl = class (TOleControl) protected function GetIDispatchProp(Index: Integer): IDispatch; function GetIUnknownProp(Index: Integer): IUnknown; end; implementation \{ TOleControlFix \} function TrsOleControl.GetIDispatchProp(Index: Integer): IDispatch; var Temp: TVarData; begin GetProperty(Index, Temp); // Result := IDispatch(Temp.VDispatch); \*\*\*\*\* Change to: Pointer(Result) := Temp.VDispatch; //this avoids the extra AddRef end; function TrsOleControl.GetIUnknownProp(Index: Integer): IUnknown; var Temp: TVarData; begin GetProperty(Index, Temp); // Result := IDispatch(Temp.VUnknown); \*\*\*\*\* Change to: Pointer(Result) := Temp.VUnknown; //this avoids the extra AddRef end; end. 另一种修改源文件的方法如下: zhongs建议在TWebBrowser和TOleControl的继承关系中间加入一个修正此问题的中间类... 但是经我观察, 我认为TOleControl存在的缺陷会广泛波及其它既有的和将来可能有的自动化控件, 所以我的建议是对OleCtrls.pas进行如下修改: function TOleControl.GetIDispatchProp(Index: Integer): IDispatch; var Temp: TVarData; begin GetProperty(Index, Temp); //Result := IDispatch(Temp.VDispatch); Pointer(Result) := Temp.VDispatch; end; function TOleControl.GetIUnknownProp(Index: Integer): IUnknown; var Temp: TVarData; begin GetProperty(Index, Temp); //Result := IUnknown(Temp.VUnknown); Pointer(Result) := Temp.VUnknown; end; 并且要记住重新编译OleCtrls.pas 相关链接: http://blog.csdn.net/ScriptBaby/archive/2007/05/20/1618486.aspx http://blog.csdn.net/ScriptBaby/article/details/1618486 [http_www.winu.cn_space-14160-do-blog-id-270.html]: http://www.winu.cn/space-14160-do-blog-id-270.html
相关 Java内存泄漏问题及其解决方案 Java内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,导致系统可用内存逐渐减少。这种情况如果长期存在,会严重影响系统的性能和稳定性。 解决Java内存泄漏的方法: 淩亂°似流年/ 2024年10月08日 07:51/ 0 赞/ 63 阅读
相关 Java内存泄漏问题及其解决方案 Java内存泄漏是指在Java应用中,长时间存在且无法释放的内存空间。如果不妥善处理,会严重影响系统的性能和稳定性。 解决Java内存泄漏的方法主要包括: 1. **避免动 柔光的暖阳◎/ 2024年10月07日 17:54/ 0 赞/ 59 阅读
相关 Java内存泄漏:问题与解决方案 在Java编程中,内存泄漏是一个常见的问题。简单来说,内存泄漏就是程序申请了内存后,无法释放导致可用内存越来越少。以下是问题和解决方案的概述: 1. 问题: - 对象长 落日映苍穹つ/ 2024年10月07日 00:15/ 0 赞/ 62 阅读
相关 Java内存泄漏问题及解决方案 Java内存泄漏是指在程序运行过程中,长时间占用大量内存但无法释放的情况。这可能会导致系统资源耗尽,甚至影响系统的稳定性和性能。 解决Java内存泄漏的方法有: 1. ** 拼搏现实的明天。/ 2024年09月26日 05:54/ 0 赞/ 68 阅读
相关 Java内存泄漏问题及解决方案 Java内存泄漏主要指程序在申请内存后,无法释放已申请的内存空间,导致系统可用内存逐渐减少。 解决Java内存泄漏的方法包括: 1. **避免静态内存泄露**:对于非线程环 小灰灰/ 2024年09月23日 11:24/ 0 赞/ 71 阅读
相关 Java内存泄漏问题解决方案 Java内存泄漏是程序在执行过程中,申请的内存没有被释放,导致系统可用内存逐渐减少的问题。以下是一些解决内存泄漏的策略: 1. **垃圾回收机制**:Java通过垃圾回收机制 古城微笑少年丶/ 2024年09月18日 06:21/ 0 赞/ 120 阅读
相关 Java内存泄漏问题解决方案示例 在Java中,内存泄漏通常是指程序长时间占用大量内存,但无法释放。以下是一些解决内存泄漏的策略: 1. **垃圾回收**:Java采用自动垃圾回收机制来帮助管理内存。如果发现 港控/mmm°/ 2024年09月17日 18:54/ 0 赞/ 63 阅读
相关 Java内存泄漏:问题与解决方案 在Java编程中,内存泄漏是一个常见的问题。简单来说,内存泄漏就是程序在申请内存后,无法释放已申请的内存空间,导致系统可用内存持续减少。 解决Java内存泄漏的方法包括: Myth丶恋晨/ 2024年09月12日 00:03/ 0 赞/ 93 阅读
相关 使用TWebBrowser时存在内存泄漏问题的解决方案 用TWebBrower不断打开多个网页,多某些版本的操作系统上运行一段时间后,发现占用系统内存达几百M,直到关闭程序后,占用的内存才能释放。 这个问题在网有很多讨论,比较多人 我会带着你远行/ 2022年06月14日 10:07/ 0 赞/ 161 阅读
还没有评论,来说两句吧...