Форум: "KOL";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизКак в dll избежать exception Найти похожие ветки
← →
nester (2004-06-25 12:32) [0]Я на KOL написал плагин под IE. В этом плагине создается поток отдельный. Если в этом потоке возникает эксцепшн то вылетает весь IE.
try except стоит. Если эксцепшен возникает не в потоке, то IE не вылетает (ну естественно тоже в try-except). Что за грабли? как такое пофиксить?
Для тех кому интересно, то в потоке запрашиваю вебстраничку с помощью Indy(сам под кол адаптировал) и если нет подключения к инету то естественно эксцепшн, try не спасает.
← →
SPeller © (2004-06-25 12:58) [1]err подключен?
← →
nester (2004-06-25 13:40) [2]Да
← →
nester (2004-06-25 13:53) [3]ХеХе, для чистоты эксперимента переписал тоже самое на VCLовском треде - все работает без проблем. Но блин, а с КОЛовским тогда что?
← →
RA (2004-06-25 18:53) [4]А замены системных модулей ты используешь?
← →
nester (2004-06-26 02:15) [5]HET
← →
SPeller © (2004-06-26 07:06) [6]Код в студию.
← →
nester (2004-06-27 23:16) [7]Кот в студии: :)
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 даже не икается:))
← →
RA © (2004-07-01 20:19) [8]Если ничего не получится, попробуй вынести
падающий код "за поток" методом Synchronize.
← →
SPeller © (2004-07-02 05:28) [9]http://kol.mastak.ru/FAQ.htm#10
← →
Gandalf © (2004-07-02 19:15) [10]Зоркий сокол дело говорит...
← →
nester (2004-07-03 13:57) [11]Спасибо зоркий сокол, щас проверю, но пока вериться с трудомс:))) я то сендер нигде не использую
← →
Vladimir Kladov (2004-07-03 14:27) [12]А Self? А то он неявно использоваться может. Вообще, есть ведь возможность войти в отладку dll и по шагам посмотреть, что там приключается.
← →
nester (2004-07-03 14:45) [13]2Сокол Зоркий, не помогло:))) вернулся обратно к VCL.
2Владимир. Я читал дето про такое, но ни разу не пробовал. но щас в нете поищу, но так на вскидку... dll-ку да еще и поток то в ней да по шагам то... страшно становиться:)))
Да, товариши. небольшое уточнение, если в try ставить деление на ноль то не вылетает Ж)))) Вылетает только если гетом брать индевой компонентой, похоже в том месте где она райзет эксцепшен нетворк анричебл.
← →
SPeller © (2004-07-05 04:39) [14]
procedure ThreaPingExecute( Dummy: Pointer; Self: PThread );
И пофиг что ты их не используешь — программе ведь надо приводить регистры в порядок после отработки функции.
← →
SPeller © (2004-07-05 04:41) [15]Звиняюсь:
procedure ThreaPingExecute( Dummy: Pointer; Sender: PThread );
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c