聚爆ipad破解版:TEmbeddedWB如何处理内存泄漏,以及与OleCrtls.pas内存泄漏补丁冲突的解决方案
来源:百度文库 编辑:中财网 时间:2024/05/05 09:41:47
前文已经讲过了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
Index: EmbeddedWB.pas
===================================================================
--- EmbeddedWB.pas (版本 681)
+++ EmbeddedWB.pas (工作副本)
@@ -2583,7 +2583,7 @@
begin
FUserAgentInt := FUserAgent;
Control.OnAmbientPropertyChange(DISPID_AMBIENT_USERAGENT);
- _Release;
+ //_Release;
end;
end;
end;
Index: EwbCore.pas
===================================================================
--- EwbCore.pas (版本 681)
+++ EwbCore.pas (工作副本)
@@ -1337,7 +1337,7 @@
with (Application as IOleControl) do
begin
OnAmbientPropertyChange(DISPID_AMBIENT_USERMODE);
- _Release;
+ //_Release;
end;
end;
@@ -1374,7 +1374,7 @@
with (Application as IOleControl) do
begin
OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL);
- _Release;
+ //_Release;
end;
end;
@@ -1438,7 +1438,7 @@
with (Application as IOleControl) do
begin
OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL);
- _Release;
+ //_Release;
end;
end;
Index: EWBTools.pas
===================================================================
--- EWBTools.pas (版本 681)
+++ EWBTools.pas (工作副本)
@@ -1003,7 +1003,7 @@
ScreenImg.SaveToFile(FileName);
Result := True;
finally
- ViewObject._Release;
+ //ViewObject._Release;
end;
except
Result := False;
@@ -3049,7 +3049,7 @@
try
Result := CmdTarget.Exec(PtrGuid, Value1, Value2, vaIn, vaOut);
finally
- CmdTarget._Release;
+ //CmdTarget._Release;
end;
except
end;
Index: IEDownload.pas
===================================================================
--- IEDownload.pas (版本 681)
+++ IEDownload.pas (工作副本)
@@ -6,7 +6,7 @@
// Freeware Component *
// for Delphi by *
// Eran Bodankin *
-// and Per Linds?Larsen *
+// and Per Linds?Larsen *
// *
// *
// Updated versions: *
@@ -895,7 +895,7 @@
Result := S_OK;
FBSCBTimer.Enabled := True; {Timeout timer}
FTimedOut := False;
- Self._Release;
+ //Self._Release;
end;
function TBSCB.OnResponse(dwResponseCode: DWORD; szResponseHeaders,
@@ -1493,9 +1493,9 @@
else if (Assigned(FSender.FOnConnect)) then
FSender.FOnConnect(Self, HR, Registering_new_moniker +
ResponseCodeToStr(HR));
- m_pPrevBSCB._Release;
+ //m_pPrevBSCB._Release;
m_pPrevBSCB := nil;
- FBindCtx._Release;
+ //FBindCtx._Release;
FBindCtx := nil;
Dec(FSender.FRefCount);
end;
@@ -1512,7 +1512,7 @@
FSender.FOnStopBinding(Self, HRESULT, szError);
Result := HRESULT;
- Binding._Release; {Release the binding we called on StartBinding}
+ //Binding._Release; {Release the binding we called on StartBinding}
FSender.FState := sStopped;
if Assigned(FSender.FOnStateChange) then
Index: MenuContext.pas
===================================================================
--- MenuContext.pas (版本 681)
+++ MenuContext.pas (工作副本)
@@ -370,7 +370,7 @@
end;
finally
ShellMalloc.Free(FolderID);
- ShellMalloc._Release;
+ //ShellMalloc._Release;
end;
end;
finally
@@ -416,7 +416,7 @@
FreeMem(ItemPIDLs);
end;
ShellMalloc.Free(FolderID);
- ShellMalloc._Release;
+ //ShellMalloc._Release;
end;
function NextPIDL(PIDL: PItemIDList): PItemIDList;
Index: RichEditBrowser.pas
===================================================================
--- RichEditBrowser.pas (版本 681)
+++ RichEditBrowser.pas (工作副本)
@@ -828,7 +828,7 @@
begin
if IUnknown(Obj) <> nil then
begin
- IUnknown(Obj)._Release;
+ //IUnknown(Obj)._Release;
IUnknown(Obj) := nil;
end;
end;
Symbian 如何处理内存泄漏
谁知道Symbian 如何处理内存泄漏
氨气泄漏处理
vc 内存泄漏 如何排除 请帮忙看一下
什么是内存泄漏?
何谓“内存泄漏”?
如何防止微波泄漏?
氯气泄漏 如何自救?
如何处理内存溢出
硫化氢泄漏如何保护自己
物理内存丢失如何处理。
安装Visual Studio后内存泄漏?
关于内存泄漏(内存丢失)的问题!
什么是泄漏电流,如何测量那?
静密封点泄漏率台帐如何编写
如何使电脑的质料不泄漏
如何知道微波炉是否有微波泄漏?
MP3播放器内存不对劲如何处理
如何辨别内存的处理频率
告急!内存不够,如何处理。十二万分谢谢!!!
内存冲突如何处理?高手救命!!
对数据进行udp封装时,出现内存泄漏,怎么办?
内存泄漏是什么意思,怕暴露什么东西,MFC代码是什么
JAVA防止内存的泄漏什么意思,内存还能泄露?