Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
ВнизПочему в длл не работает try except?? Найти похожие ветки
← →
bloodman © (2004-09-02 21:36) [0]Когда происходит исключение в блоке try except , то все равно показывается AV и програ вылетает( try except в dll) .
← →
GuAV © (2004-09-02 21:41) [1]AV не надо ловить, его надо избегать!
← →
bloodman © (2004-09-02 21:46) [2]это понятно . вот например код:
ResStream :=nil;
try
try
ResStream:=TResourceStream.CreateFromID(HInstance,1,RT_RCDATA);
except
//error
end;
IF ResStream <> nil Then
begin
MyIcon:=TIcon.Create;
MyIcon.LoadFromStream(ResStream);
imge.AddIcon(MyIcon);
MyIcon.Free;
end;
finally
ResStream.Free;
end;
Если убрать try except , то если не будет ресурса, то выскачит AV и как быть?
← →
YurikGL © (2004-09-02 21:58) [3]А ты наверно из делфи прогу запускаешь. Дык надо ж сам ехе-к запускать. Тогда никаких AV/
← →
bloodman © (2004-09-02 22:44) [4]ага щазз. поэтому я и спрашиваю. Если бы все так просто было. к тому же дельфи нормально с try except работает когда в ней запускаешь , не в этом дело короче.
← →
Fay © (2004-09-02 22:53) [5]Не понял 2 вещи
1) почему RT_RCDATA?
2) Чем не устраивает LoadIcon?
← →
bloodman © (2004-09-02 23:01) [6]1) почему RT_RCDATA? просто мне так нужно .
2) Чем не устраивает LoadIcon? это был пример для
GuAV © (02.09.04 21:41) [1]
где нельзя избежать AV
Так что try except действительно не работает в dll?
← →
Fay © (2004-09-02 23:04) [7]Я чё-то не пойму вопрос.
Tools->debugger options->Language Exceptions->Stop on Delphi Exceptions убирал?
← →
GuAV © (2004-09-02 23:10) [8]
> Так что try except действительно не работает в dll?
А проверь
try
raise Exception.Create("");
except
end;
===================================
AV не надо ловить, его надо избегать!
← →
Fay © (2004-09-02 23:14) [9]>> 1) почему RT_RCDATA? просто мне так нужно
Для чего?!
← →
bloodman © (2004-09-02 23:28) [10]Fay © (02.09.04 23:14) [9]
В том проекте откуда я взял , там иконку хранил ,из кода как буудто не понятно...
GuAV © (02.09.04 23:10) [8]
как избежать AV в случае [2] если хранить иконки в ресурсах.(например храня в RCDATA)
← →
GuAV © (2004-09-02 23:29) [11]Короче, сам тест сделал. except работает.
// DLL
procedure raiseAV;
asm
MOV EAX, [0]
end;
procedure raiseAVh;
begin
try
raiseAV;
except
end;
end;
exports raiseAV, raiseAVh;
begin
end.
// EXE
procedure raiseAV; external "project1.dll"
procedure raiseAVh; external "project1.dll"
procedure TForm1.Button2Click(Sender: TObject);
begin
raiseAVh
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
raiseAV
end;
А избежать AV можно - не орбращатся к ресурсу к-рого нет.
← →
bloodman © (2004-09-02 23:32) [12]>А избежать AV можно - не орбращатся к ресурсу к-рого нет.
как ты это узнаешь ?
1)а ты пнапиши в except код какой-нибудь .
2) и в функциях Button... напиши try raiseAV except alla end;
Что происходит?
← →
GuAV © (2004-09-02 23:38) [13]
> как ты это узнаешь ?
EnumResourceNames. Хотя имхо доджен и так знать.
← →
bloodman © (2004-09-02 23:41) [14]а что со 2-м вопросом?
← →
GuAV © (2004-09-02 23:51) [15]
> 1)а ты пнапиши в except код какой-нибудь .
> 2) и в функциях Button... напиши try raiseAV except alla
> end;
> Что происходит?procedure raiseAV; external "project1.dll"
и что ? что-то не так ? alla вызывается. сообщение это отладчика, в exe не будет, показывает что exception в raiseAV примерно как если бы MOV EAX,[0] был в ехе, то на нёмбыло бы это сообение
procedure raiseAVh; external "project1.dll"
procedure TForm1.Button2Click(Sender: TObject);
begin
raiseAVh
end;
procedure alla;
begin
Form1.Caption:="zzz";
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
try
raiseAV
except
alla
end;
end;
==============================
AV не надо ловить, его надо избегать !
← →
bloodman © (2004-09-03 00:51) [16]а у меня блин не работает если в блоке try есть эксепшн то сразу либо вылетает на try программы если он есть либо вообще вылетет..
странно.
← →
Digitman © (2004-09-03 08:41) [17]
> bloodman
что-то ты мудришь ...
try
ResStream:=TResourceStream.CreateFromID(HInstance,1,RT_RCDATA);
try
MyIcon:=TIcon.Create;
try
MyIcon.LoadFromStream(ResStream);
imge.AddIcon(MyIcon);
finally
MyIcon.Free;
end;
finally
ResStream.Free;
end;
except
on e: Exception do
ShowMessage("Обнаружено и обработано исключение " + e.ClassName + #10 + e.Message);
end;
← →
bloodman © (2004-09-03 16:25) [18]А разве стрим на nil проверять не надо? Зачем это:
try</B
MyIcon:=TIcon.Create;
Разве бывает что TIcon нельзя создать?
← →
GuAV © (2004-09-03 16:30) [19]
> А разве стрим на nil проверять не надо?
не надо. если не будет создана, то AV
> Разве бывает что TIcon нельзя создать?
да. Ticon например содержит поля => памяти может нехватить.
Любой конструктор может не состоятся.
← →
GuAV © (2004-09-03 16:32) [20]
> будет создана, то AV
то есть какое нафиг AV? Не AV, другое исключение какое нить.
← →
Digitman © (2004-09-03 16:32) [21]
> bloodman © (03.09.04 16:25) [18]
> А разве стрим на nil проверять не надо?
а зачем ? ты сам себе в состоянии это вразумительно объяснить ?
какие у тебя сомнения, приводящие к такой необходимости ?
> Зачем это:
> try
> MyIcon:=TIcon.Create;
> Разве бывает что TIcon нельзя создать?
ну а почему нет ? все что угодно может случиться ..
к тому же этот try относится к finally, в котором ResStream будет БЕЗУСЛОВНО уничтожен, ЧТО БЫ НИ СЛУЧИЛОСЬ между try..finally
← →
bloodman © (2004-09-03 18:13) [22]GuAV © (03.09.04 16:30) [19]
Это понятно что любой может не создаться, ты каждый конструктор в try заносишь?
Digitman © (03.09.04 16:32) [21]
В моем коде просто без проверки не получится. Буду использовать твой. Он мне больше понавился =) спасибо.
← →
Mim1 © (2004-09-03 19:13) [23]
> ResStream :=nil;
> try
> try
> ResStream:=TResourceStream.CreateFromID(HInstance,1,RT_RCDATA);
> except
> //error
> end;
> IF ResStream <> nil Then> begin
> MyIcon:=TIcon.Create;
> MyIcon.LoadFromStream(ResStream);
> imge.AddIcon(MyIcon);
> MyIcon.Free;
> end;
> finally
> ResStream.Free;> end;
Во втором выделеным жирным болке нехватает проверки на nil;
← →
bloodman © (2004-09-03 19:21) [24]ВО а говорили не нужна проверка...
← →
Mim1 © (2004-09-03 19:23) [25]Где?
← →
Mim1 © (2004-09-03 19:25) [26]Тока без рифмы гусары, здесь дамы иногда бывают.
← →
bloodman © (2004-09-03 19:30) [27]вообщем понял ... дырямые у мя алгоритмы получаются... :(
А зачем там проверка на nil разве free ее не выполняет?
← →
Mim1 © (2004-09-03 19:41) [28]незнаю что он выполнет (тут когдато псали что выполняет, убедится можно в исходниках, мне лень), но вызывать метод несуществующего класса не есть гут.
← →
Mim1 © (2004-09-03 19:42) [29]
> вызывать метод несуществующего класса не есть гут.
Несуществующего объекта ессно
← →
bloodman © (2004-09-03 19:52) [30]Это понятно. Ладно .СПАСИБО ВСЕМ! .
← →
GuAV © (2004-09-04 00:04) [31]Mim1 © (03.09.04 19:13) [23]
> ResStream.Free;> end;
>
> Во втором выделеным жирным болке нехватает проверки на nil;
Да Вы что ? Именно там она есть !
Хотя код всё равно кривой, а некривой привел Digitman.
← →
Mim1 © (2004-09-04 06:43) [32]
> [31] GuAV © (04.09.04 00:04)
Вынужден с вами согласится. Щас можно холивар развести про то надо ли проверять или нет. :)
Из модуля systemprocedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.036 c