Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.19;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
1-61092
elgato
2002-09-09 21:09
2002.09.19
StringGrid


1-61161
dzmitry_
2002-09-07 11:33
2002.09.19
Вставка в TRichEdit объектов


1-61178
Ahmad
2002-09-08 09:45
2002.09.19
Работа с выделенным текстом


1-61104
Diman-Far
2002-09-10 08:25
2002.09.19
Помогите как создать динамически метку


1-61136
Andy BitOff
2002-09-06 14:03
2002.09.19
Виртуальный Grid