![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
![]() Здравствуйте!
Научите пожалуйста как правильно организовать исключения на примере следующей функции: Код:
function ExtractRes(ResType, ResName, ResNewName : String):Boolean; var Res: TResourceStream; begin Result:= False; Res:=TResourceStream.Create(Hinstance, Resname, Pchar(ResType)); Res.SavetoFile(ResNewName); if FileExists(ResNewName) then Result:= True else Result:= False; Res.Free; end; Проблема в том, что в случае если не получается сохранить ресурс программа выдает соответствующее сообщение и после чего дальнейший код не выполняется... а мне нужно вывести сообщение об этом, допустим: Код:
if ExtractRes('EXEFILE','program', GetTempDir+'program.exe') then RichEdit.Text:= 'Файл распакован.' else RichEdit.Text:= 'Файл НЕ распакован.'; В моем случае, если происходит ошибка распаковки ресурса то дальнейший код не выполняется... т.е. сообщения "Файл НЕ распакован." не видно... Помогите грамотно переделать функцию пожалуйста. Буду вам очень признателен. |
#2
|
||||
|
||||
![]() Если дело в эксепшене, то наверное как-то так.
Код:
try // unpack code Res.Free; except Res.Free; Result := false; end; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 31.05.2015 в 15:51. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Alloc (31.05.2015)
|
#3
|
||||
|
||||
![]() Спасибо за ответ.
Я вот попробовал сделать вот так: Код:
try Res:=TResourceStream.Create(Hinstance, PChar('devcon'), PChar('EXEFILE')); try Res.SavetoFile(PChar('devcon.exe')); except on Exception do ShowMessage('Resource not found'); end; finally Res.Free; end; но по прежнему не работает как должно... вроде бы все правильно.. интересно то что если заключить саму функцию в Try; Except - то все работает как надо... Код:
try ExtractRes('RCDATA','devcon', GetTempDir+'devcon.exe'); except on Exception do ShowMessage('ERROR'); end; не могу понять почему... Последний раз редактировалось Alloc, 31.05.2015 в 16:14. |
#4
|
||||
|
||||
![]() Отладчиком пройдись. Где эксепшен кидается? Подозреваю, что на TResourceStream.Create(). Тогда Finally не сильно поможет, его тоже придется на except менять. Как-то так:
Код:
Res := nil; try Res:=TResourceStream.Create(Hinstance, PChar('devcon'), PChar('EXEFILE')); Res.SavetoFile(PChar('devcon.exe')); Res.Free; except on Exception do begin ShowMessage('Resource not found'); if res <> nil then Res.Free; end; end; Код:
Res := nil; try try Res:=TResourceStream.Create(Hinstance, PChar('devcon'), PChar('EXEFILE')); Res.SavetoFile(PChar('devcon.exe')); except on Exception do ShowMessage('Resource not found'); end; finally if res <> nil then Res.Free; end; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 31.05.2015 в 16:26. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Alloc (31.05.2015)
|
#5
|
||||
|
||||
![]() Спасибо большое)) теперь все заработало)
|
#6
|
||||
|
||||
![]() Подскажите пожалуйста, про какую "олдскульную распаковку через WinAPI" Вы говорите?) Буду очень признателен
Последний раз редактировалось Alloc, 31.05.2015 в 20:26. |