Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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"
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.036 c
1-1094221622
hamster
2004-09-03 18:27
2004.09.19
CRC32


9-1085073095
Proger
2004-05-20 21:11
2004.09.19
Программные маски


14-1094100676
Rule
2004-09-02 08:51
2004.09.19
Вопрос к жителям юга Украины, вчастности Одессы, Кречи и


3-1093323221
kva
2004-08-24 08:53
2004.09.19
InstallShield и BDE


14-1094120536
lipskiy
2004-09-02 14:22
2004.09.19
Посоветуйте программку мониторинга обращений по сети.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский