Hi,
I just ported an application to ICSv6 and I'm encountering a problem
when closing it down. It gives me an access violation in ntdll.dll,
write of address 00000010
Digging around, I discovered that it comes from the call to
GWndHandlerPool.Lock inside TIcsWndControl.DeallocateHWnd
At the time it is being called, GWndHandlerPool has already been freed
by the finalization section of OverbyteIcsWndControl.pas which ran
before my own finalization section.
In my own section, I'm freeing, indirectly, a class that contains a
TWSocketServer which not active.
I know this comes from the indirect nature of my usage of the class, but
still, the order of finalization clauses should not be relied upon, as
it was always indicated by the Delphi team. In particular, it will be
different and changing when using packages.
I tried this with ICSv7, it shows the same behavior.
I thus propose to FreeAndNil GWndHandlerPool instead of simply freeing
it, and then test if it is Assigned in all places it can be used (or the
associated GWndHandlerCritSect section) when deallocating the window handle.
I placed a "TortoiseSVN" patch file at the end of this message, you
should be able to paste it into a blank .patch file and apply it to the
current version of ICS.
Please let me know what you think, right now this issue is blocking my
upgrade.
Cheers
Olivier
////////////////////////////////////////////////////////////////////////////////////////////
Index: OverbyteIcsWndControl.pas
===================================================================
--- OverbyteIcsWndControl.pas (revision 34841)
+++ OverbyteIcsWndControl.pas (working copy)
@@ -481,16 +481,18 @@
if FHandle = 0 then
Exit; // Already done
- GWndHandlerPool.Lock;
+ if Assigned(GWndHandlerPool) then
+ GWndHandlerPool.Lock;
try
FreeMsgHandlers;
- if Assigned(FWndHandler) and (FWndHandler.FMsgCnt <= 0) then
+ if Assigned(FWndHandler) and (FWndHandler.FMsgCnt <= 0) and
Assigned(GWndHandlerPool) then
GWndHandlerPool.FreeWndHandler(FWndHandler);
FHandle := 0;
FWndHandler := nil;
FThreadID := 0;
finally
- GWndHandlerPool.UnLock;
+ if Assigned(GWndHandlerPool) then
+ GWndHandlerPool.UnLock;
end;
end;
@@ -877,7 +879,8 @@
DestroyWindow(FHandle); // Détruit la fenêtre cachée
FHandle := 0; // On n'a plus de handle !
- EnterCriticalSection(GWndHandlerCritSect);
+ if Assigned(GWndHandlerPool) then
+ EnterCriticalSection(GWndHandlerCritSect);
try
Dec(GWndHandleCount);
if GWndHandleCount <= 0 then
@@ -888,7 +891,8 @@
OverbyteIcsLibrary.UnregisterClass(
IcsWndControlWindowClassName, HInstance);
finally
- LeaveCriticalSection(GWndHandlerCritSect);
+ if Assigned(GWndHandlerPool) then
+ LeaveCriticalSection(GWndHandlerCritSect);
end;
end;
{$ENDIF}
@@ -1269,7 +1273,7 @@
InitializeCriticalSection(GWndHandlerCritSect);
finalization
- GWndHandlerPool.Free;
+ FreeAndNil(GWndHandlerPool);
DeleteCriticalSection(GWndHandlerCritSect);
end.
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be