TEmbeddedWB如何处理内存泄漏,以及与OleCrtls.pas内存泄漏补丁冲突的解决方案

前文已经讲过了OleCtrls.pas是如何内存泄漏以及解决方案,但是我们发现该内存泄漏的问题,早已被TEmbeddedWB发现,TEmbeddedWB在Version 14.67.8版本的解决方案并不修改OleCtrls.pas文件,而是每次执行内存泄漏的地方,额外的写上一句_Release;使得引用计数无条件减少1,该方案有点绕路子,而且会与修正问题本质的方案(修改OleCtrls.pas)发生冲突,而且一旦Borland修正了OleCtrls.pas的问题,那么TembeddedWB也就无法正常使用了。更具有讽刺意义的是TEmbeddedWB并没有在所有地方都这样做,那么它也没有解决全部的内存泄漏。

参看部分代码:

procedure TEmbeddedWB.SetUserAgentInt;
var
  Control: IOleControl;
begin
  
if FUserAgent <> FUserAgentInt then
  
begin
    RestoreUserAgentReg;
    
if DefaultInterface.QueryInterface(IOleControl, Control) = 0 then
      
with (Application as IOleControl) do
      
begin
        FUserAgentInt :
= FUserAgent;
        Control.OnAmbientPropertyChange(DISPID_AMBIENT_USERAGENT);
        
//_Release;
      
end;
  
end;
end;

于是已经修改OleCtrls.pas的用户将无法正常使用TEmbeddedWB Version 14.67.8 以及附近的版本,在TEmbeddedWB 早期版本例如:14.64是不存在被动修复方案的,所以已经修改OleCtrls.pas的用户可以正常使用TEmbeddedWB 14.64以及附近的版本。

TEmbeddedWB Version 14.67.8我已经作了一个补丁,删除TEmbeddedWB 额外增加的所有_Release调用。这是一个SVN的补丁文件,请看:

 

Code
posted @ 2009-05-25 15:33  庄园  阅读(4504)  评论(3编辑  收藏  举报