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

Вниз

Почему в длл не работает 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"
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;
и что ? что-то не так ? alla вызывается. сообщение это отладчика, в exe не будет, показывает что exception в raiseAV примерно как если бы MOV EAX,[0] был в ехе, то на нёмбыло бы это сообение

==============================
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)

Вынужден с вами согласится. Щас можно холивар развести про то надо ли проверять или нет. :)

Из модуля system
procedure TObject.Free;
begin
 if Self <> nil then
   Destroy;
end;



Страницы: 1 вся ветка

Текущий архив: 2004.09.19;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.044 c
14-1094037222
Layner
2004-09-01 15:13
2004.09.19
Являются ли сведения ОКПО тайной?


14-1093666950
menart
2004-08-28 08:22
2004.09.19
3-й номер RSDN-MAGAZINE


1-1093964958
Lord de Mon
2004-08-31 19:09
2004.09.19
Типы


3-1093008038
dolmat
2004-08-20 17:20
2004.09.19
Значение null в 0 или ""


14-1094029648
miwa
2004-09-01 13:07
2004.09.19
"Мобильная революция" началась ;o))