Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
ВнизAccess Violation после завершения работы приложения Найти похожие ветки
← →
AFrolov (2002-09-03 14:43) [0]Данная неприятная вещь происходит где-то внутри уже после завершения программы. Пытался смотреть, что происходит в секциях Finalization но точки прерывания в там не срабатывают(может быть не там ставил). Помогите советом как с этим бороться можно.
Заранее спвсибо.
← →
Dimk (2002-09-03 15:02) [1]Главную форму руками удаляешь?
В смысле Form1.Free?
← →
neg2001 (2002-09-03 15:03) [2]Скорее всего в процессе работы программы был удалён, автоматически создаваемый компонент. Проверь код.
← →
Слесарь Матерящийся (2002-09-03 15:03) [3]>>>как с этим бороться можно
Качественное кодирование, тщательная отладка.
← →
AFrolov (2002-09-03 15:44) [4]2
> Dimk (03.09.02 15:02)
> Главную форму руками удаляешь?
> В смысле Form1.Free?
Нет конечно.
2
> neg2001 (03.09.02 15:03)
> Скорее всего в процессе работы программы был удалён, автоматически
> создаваемый компонент. Проверь код.
Компоненты явно не где не удаляются т.е вообще ни 1 компонент руками не удаляется. А от если неявно, то где это может быть?
2
> Слесарь Матерящийся (03.09.02 15:03)
> >>>как с этим бороться можно
>
> Качественное кодирование, тщательная отладка.
совершенно согласен. Но вот как эту отладку осуществить?
← →
Alx2 (2002-09-03 16:00) [5]>AFrolov © (03.09.02 14:43)
Текст юнита можно?
← →
oss (2002-09-03 16:06) [6]особенно интересно OnClose, OnCloseQuery
← →
AFrolov (2002-09-03 16:18) [7]procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if CheckVariant(WordApplication) then
begin
if CloseDoc()=IDCANCEL then
begin
Action:=caNone;
end else
begin
Action:=caFree;
CloseDocActions(WordApplication);
end;
end;
end;procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if CheckVariant(WordApplication) then
begin
if CloseDoc()=IDCANCEL then
begin
Action:=caNone;
end else
begin
Action:=caFree;
CloseDocActions(WordApplication);
end;
end;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
var
i:integer;
begin
try
DisconnectADO(ADOConnection1);
ValuesInfo.Destroy();
WordApplication.Disconnect();
RemoveWndHook();
UnmapViewOfFile(PShared);
except
end;
end;
← →
Alx2 (2002-09-03 16:37) [8]>RemoveWndHook();
А сам хук можно? :)
← →
AFrolov (2002-09-03 16:58) [9]library HookDll;
uses
ShareMem,
Windows,
Messages,
SysUtils,
TypesUnit in "TypesUnit.pas";
Const
GlobMapID = "Global Keyboard Hook Demo {917C91AA-88D5-4134-BB91-15161728594D}";
Const iC:array[0..19] of Cardinal = (VK_F1,VK_F2,VK_F3,VK_F4,VK_F5,VK_F6,VK_F7,VK_F8,VK_F9,VK_F10,VK_F11,VK_F12,VK_TAB,VK_PRIOR,VK_NEXT,VK_ESCAPE,VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT);
Var
MapHandle: THandle = 0;
ShareInf: PShareInf = nil;
Count: Integer = 0;
repeat_count: Cardinal = 0;
RC1: Cardinal = 0;
SharedInf:TShareInf;
Procedure DLLEntryPoint(dwReason: DWORD); stdcall;
Begin
Case dwReason Of
DLL_PROCESS_ATTACH:
Begin
MapHandle:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TShareInf), GlobMapID);
ShareInf:=MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TShareInf));
End;
DLL_PROCESS_DETACH:
Begin
UnMapViewOfFile(ShareInf);
CloseHandle(MapHandle);
End
End;
End;
////////////////////////////////////////////////////////////////////////////////
Function WndHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
var
MsgStruct:tagMSG;
PMsgSt,PRemMsgSt:^tagMSG;
tmpHwnd:HWND;
Msg: tagMSG;
ScanCode: Cardinal;
KeyBoardState: TKeyBoardState;
Buf: array[0..2] of char;
MSGParam:WPARAM;
tmp:integer;
ExtendedKey:LPARAM;
PSendStruct:PKeyEvent;
StructHandle: HGLOBAL;
MapH:THandle;
label CallNext;
begin
If Code IN [HC_ACTION, HC_NOREMOVE, MSGF_SCROLLBAR] Then
Begin
end;
CallNext:
Result := CallNextHookEx(ShareInf^.WndHookHandle, Code, ParamW, ParamL)
end;
Function RemoveWndHook: integer; stdcall;
Begin
UnhookWindowsHookEx(ShareInf^.WndHookHandle);
result:=0;
End;
Function SetWindowHook(Wnd: HWND): integer; stdcall;
var
TreadId,ProcessId:Cardinal;
Begin
If ShareInf<>Nil Then
Begin
ShareInf^.AppWndHandle:=Wnd;
TreadId:=GetWindowThreadProcessId(ShareInf^.WND_OF_INTEREST,ProcessId);
ShareInf^.WndHookHandle:=SetWindowsHookEx(WH_GETMESSAGE, @WndHook, HInstance, TreadId);
Result:=ShareInf^.WndHookHandle;
End
Else Result:=0;
End;
////////////////////////////////////////////////////////////////////////////////
procedure EraseSharedInfo();stdcall;
begin
CloseHandle(ShareInf^.hm);
end;
function GetSharedInfoHandle():THandle;stdcall;
begin
GetSharedInfoHandle:=MapHandle;
end;
procedure SetWndOfInterest(wnd:Integer);
begin
SharedInf.WND_OF_INTEREST:=wnd;
end;
Exports
EraseSharedInfo,GetSharedInfoHandle,SetWindowHook,RemoveWndHook,
SetMessages,
SetWndOfInterest;
BEGIN
//If (DLLProc() = Nil) Then
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
END.
← →
Alx2 (2002-09-06 08:37) [10]Алексей, сорри за задержку с ответом. (Командировка была)
Не нравится мне в приведенном коде следующее:
procedure TMainForm.FormDestroy(Sender: TObject);
var
i:integer;
begin
try
DisconnectADO(ADOConnection1); // Вот это место. Скорее всего для AdoConnection1 уже был вынесен приговор к смерти через Free и он уже мертвый . Событие OnDestroy вызывается, кажется, кодга уже все (кто жил на форме) померли. Остальное - по аналогии.
Попробуй выкинуть из FormDestroy обращения к компонентам.
ValuesInfo.Destroy();
WordApplication.Disconnect();
RemoveWndHook();
UnmapViewOfFile(PShared);
except
end;
end;
← →
_Raptor (2002-09-06 09:19) [11]2 AFrolov
Чаще всего это происходит из-за того что ты где-то выделил какие-то ресурсы (например память) и не освободил их перед выходом. Проверь.
← →
Tot (2002-09-06 09:42) [12]По-моему наоборот, чаще происходит, если ты освобождаешь не выделенный ресурс или уже освобождённый.
← →
vasilly (2002-09-06 09:58) [13]:)
Если освобождать уже освобожденый, то среда будет сразу же валится на том месте и найти это не проблема.. речь насколько я понял шла о другом... не так ли?
← →
Alx2 (2002-09-06 10:19) [14]>Событие OnDestroy вызывается, кажется, кодга уже все (кто жил
>на форме) померли. Остальное - по аналогии.
Не прав я. OnDestroy вызывается еще до смерти владеемых компонентов.
Но все равно в OnDestroy это делать ИМХО опасно.
← →
AFrolov (2002-09-06 10:29) [15]Большое спасибо всем за советы.
Попробовал закоментировать все в событии FormDestroy - к сожалению не помогло :-(.
Удалось более менее локализовать место, где происходит ошибка -
модуль SysUtils
в методах класа TMultiReadExclusiveWriteSynchronizer
при попытке выполнения
tls.Close(Thread);
Причем для части потоков эта операция происходит нормально.
← →
Alx2 (2002-09-06 11:09) [16]Трудно мне тогда что-либо сказать. Надо видеть проект "в живую".
← →
Koster (2002-09-09 05:46) [17]Ой лениво перечитывать исходники, скажу только, что ошибки такого рода бывают из-за левых компонент... и когда начинаешь трейсить то делфа вываливается в совершенно левом месте... пользуйтесь Free() вместо Destroy(), а кривые компоненты просматривайте на наличие inherited в Create и Destroy (этим отсутствием грешил например TID3Tag1) и вот программа с таким компонентом может работать а потом заглючит уже когда добавятся другие объекты.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c