![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как в dll избежать exception
nester © (2004-06-25 12:32:00)Я на KOL написал плагин под IE. В этом плагине создается поток отдельный. Если в этом потоке возникает эксцепшн то вылетает весь IE.
try except стоит. Если эксцепшен возникает не в потоке, то IE не вылетает (ну естественно тоже в try-except). Что за грабли? как такое пофиксить?
Для тех кому интересно, то в потоке запрашиваю вебстраничку с помощью Indy(сам под кол адаптировал) и если нет подключения к инету то естественно эксцепшн, try не спасает.
SPeller (2004-07-05 04:41:00) [1]Звиняюсь:
procedure ThreaPingExecute( Dummy: Pointer; Sender: PThread );
SPeller (2004-07-05 04:39:00) [2]
procedure ThreaPingExecute ( Dummy: Pointer; Self: PThread );
И пофиг что ты их не используешь — программе ведь надо приводить регистры в порядок после отработки функции.
nester (2004-07-03 14:45:00) [3]2Сокол Зоркий, не помогло:))) вернулся обратно к VCL.
2Владимир. Я читал дето про такое, но ни разу не пробовал. но щас в нете поищу, но так на вскидку... dll-ку да еще и поток то в ней да по шагам то... страшно становиться:)))
Да, товариши. небольшое уточнение, если в try ставить деление на ноль то не вылетает Ж)))) Вылетает только если гетом брать индевой компонентой, похоже в том месте где она райзет эксцепшен нетворк анричебл.
Vladimir Kladov (2004-07-03 14:27:00) [4]А Self? А то он неявно использоваться может. Вообще, есть ведь возможность войти в отладку dll и по шагам посмотреть, что там приключается.
nester (2004-07-03 13:57:00) [5]Спасибо зоркий сокол, щас проверю, но пока вериться с трудомс:))) я то сендер нигде не использую
Gandalf (2004-07-02 19:15:00) [6]Зоркий сокол дело говорит...
SPeller (2004-07-02 05:28:00) [7]http://kol.mastak.ru/FAQ.htm#10
RA (2004-07-01 20:19:00) [8]Если ничего не получится, попробуй вынести
падающий код "за поток" методом Synchronize.
nester (2004-06-27 23:16:00) [9]Кот в студии: :)
procedure ThreaPingExecute;
var
i: integer;
begin
try
i:= 5/0;
except
end;
end;
...
ThreadPing:= NewThread;
ThreadPing.AutoFree:= true;
ThreadPing.OnExecute:= TOnThreadExecute(MakeMethod(nil,@ThreaPingExecute));
ThreadPing.Resume;
...
код искусственный, надеюсь остальной код не потребуется? а то както в ломы выдирать все лишнее, чтобы понятнее было.
В двух словах еще раз: есть дллка для IE. в одном из мест ее вызывается ThreadPing:= .... т.е. создается тред. В треде искуственно вызываю ошибку делением на ноль, но защищаю траем. Вердикт: IE дохнет падла. Делаю тоже самое на VCL
и все работает. То же самое на VCL:
TPluginStartUpThread = class(Classes.TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
...
procedure TPluginStartUpThread.Execute;
begin
try
i:= 5/0;
except
end;
end;
...
with TPluginStartUpThread.Create(false) do
FreeOnTerminate:= true;
так IE даже не икается:))
SPeller (2004-06-26 07:06:00) [10]Код в студию.
nester (2004-06-26 02:15:00) [11]HET
RA (2004-06-25 18:53:00) [12]А замены системных модулей ты используешь?
nester (2004-06-25 13:53:00) [13]ХеХе, для чистоты эксперимента переписал тоже самое на VCLовском треде - все работает без проблем. Но блин, а с КОЛовским тогда что?
nester (2004-06-25 13:40:00) [14]Да
SPeller (2004-06-25 12:58:00) [15]err подключен?