Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-61312
Ketmar
2002-08-25 16:30
2002.09.19
FreeReport - оч-чень русская программа! :-))


14-61291
Tornado
2002-08-22 13:49
2002.09.19
Продолжение кина


7-61319
Cherv
2002-07-05 19:16
2002.09.19
Как програмно, на время, отключить клавиатуру или монитор


3-61019
michael_b
2002-08-29 22:20
2002.09.19
Следует ли использовать IBTable?


1-61075
SergeyDN
2002-09-09 11:39
2002.09.19
Как можно из делфей выбрать определённый лист в Excel!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский