![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| pascal |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 16.7.2003 Где: Россия - Уфа Репутация: нет Всего: 1 |
Может кто знает почему когда я вызываю Fail в конструкторе класса, которой создаёться вне try при завершении программы возникает ошибка...
Пример:
если я в dpr проекте попытаюсь создать объект и если Fail будет выполнена, то либо при создании проекта будет ошибка, либо при завершении работы возникнет ошибка, причём в модуле system в процедуре UnsetExceptionHandler... Например:
будет ошибка а если вот так
или так
то всё ок... Но почему??? (для тех кто не знает: Fail может быть вызвана в функции типа constructor и она удаляет созданный объект из памяти и TObject.Create возврощает nil) PS: Не надо предлагать перенсти этот фрагмент кода в try, как это в работоспособных примерах, меня суть ошибки интересует... |
||||||||
|
|||||||||
| p0s0l |
|
||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
В D7 сразу видно, что компилится по-левому, т.к. esp не восстанавливается...
Пример:
Компилится так:
Видно, что после add esp, -$10 надо бы его как-то восстановить, но Fail без раздумьев прыгает на pop esi, pop ebx, ret так и не восстановив esp... Остюда и вся лажа... Для данного случая можно сделать свой Fail:
add esp, $14 - это из-за того, что в конструкторе делали add esp, -$10 и вызывали MyFail (4 байта в стеке)... Добавлено @ 06:56 pascal, тебе же может надо будет делать не $14, а побольше (но кратно 4). Посмотри у себя, насколько портится esp... Добавлено @ 06:58 А, да, еще может не только pop esi, pop ebx делать надо, но и еще какой-нибудь pop - посмотри код твоего конструктора (в отладке View->Debug Windows->CPU window)... -------------------- С уважением, г-н Посол. |
||||||
|
|||||||
| pascal |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 16.7.2003 Где: Россия - Уфа Репутация: нет Всего: 1 |
нет, в чём то другом дело... делаю так
всё равно не работает, ошибка там же... то есть вот так
всё равно там же ошибка Это сообщение отредактировал(а) pascal - 29.3.2004, 15:25 |
||||
|
|||||
| pascal |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 16.7.2003 Где: Россия - Уфа Репутация: нет Всего: 1 |
> DB := TDB.Create;
при выполнении последней строки изменяються регистры: EAX - 00466A74 -> 00000000 EBX - 7FFDF000 -> 0012FFA0 ECX - 0012FF9C -> 00000000 EDX - 0012FF01 -> 00000000 ESI - 00000000 -> 004671C2 EDI - 00000000 -> 0012FF48 |
|||
|
||||
| pascal |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 16.7.2003 Где: Россия - Уфа Репутация: нет Всего: 1 |
вроде работает, но как всётаки без этого обойтись??? |
|||
|
||||
| p0s0l |
|
||||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
pascal, ошибка-то возникает в конструкторе, зачем push и pop делать где-то там, в далеке ? Что, каждый раз так будешь делать ? Я же привел пример, как исправить сам конструктор (вместо Fail делать MyFail)... Приведи асм-листинг самого конструктора (начиная с begin) - я тебе напишу, как у тебя будет выглядеть MyFail. Ошибка возникает, как я сказал, из-за того, что esp при Fail не восстанавливается, а значит pop esi и pop ebx (в приведенном примере) восстанавливаются совсем по-левому, и, самое главное, ret происходит неизвестно куда, может в космос, из-за этого и появляется исключение... Добавлено @ 13:30
Ага, зачем try..except заменять на asm-аналог ? Быстрее try-except написать, чем всё это, и будет то же самое... -------------------- С уважением, г-н Посол. |
||||||||
|
|||||||||
| pascal |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 16.7.2003 Где: Россия - Уфа Репутация: нет Всего: 1 |
Я придумал, вот так работает
тока в теле try слишком сильно сбиваеться esp и восстановить его весьма сложно то есть вот так уже работать не будет
или
|
||||||
|
|||||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
А зачем pop dword ptr fs:[0] ? Это же в случае try..except...
Просто add esp, $10 не работает ? -------------------- С уважением, г-н Посол. |
|||
|
||||
| pascal |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 16.7.2003 Где: Россия - Уфа Репутация: нет Всего: 1 |
Неа, не работает... В FS:[0] Delphi переодически esp сохраняет... а сам esp и с "add esp, $10" и без него не меняеться в результате... |
|||
|
||||
| p0s0l |
|
||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Если ты пользуешь try - тогда и сохраняет...
Esp в обоих случаях будет одинаковым, к твоему сведению 1. add esp, $10 2. add esp, $0c; pop dword ptr fs:[0] Так что что-то ты там намудрил, или неправильно понял... pop dword ptr fs:[0] не восстанавливает esp, а заносит по этому адресу fs:[0] dword из стека. Вот способ Fail, работающий хоть в try..except, хоть без него:
-------------------- С уважением, г-н Посол. |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |