![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Alix |
|
||||
![]() L45 ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 4.5.2005 Где: Pskov/Spb Репутация: 7 Всего: 23 |
пардон, а как он тогда работает? (я не спорю, просто интересно). Прув слов Rrader'a и немного полезной инфы:
Это сообщение отредактировал(а) Alix - 29.12.2009, 19:56 -------------------- Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой High tech. Low live. (с) Gardner Dozois |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Обратите внимание на
procedure Base64Encode(const InBuffer; InSize: Cardinal; var OutBuffer); overload; register; Возможно эта директива что-то меняет в передаче параметров (хотя это больше похоже на порт с паскаля) -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Директива register есть соглашение:
Register в Delphi подразумевается по умолчанию, поэтому мы даже не пишем ее. Это __fastcall. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
// load InSize (stored in EBX)
Судя по комменту следует EBX заменить на EDX -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
А так и работает... затирая вам память... А ещё лучше - на InSize, как это сделано (правильно, кстати) в Base64Decode. Добавлено @ 22:08 P.S. Столкнулся с этим в поддержке EurekaLog. Мы получили баг-отчёт с memory corruption на ровном месте. К счастью была предоставлена воспроизводимая демка, и я по ней вышел на этот код, который когда-то был взят с Delphi3000 и встроен в EurekaLog. Вместе с багом. Удивительно, что это работало несколько лет. Окей, наверняка кто-то сталкивался с загадочными багами, но причину найти не могли. Вот она, сила copy&paste. Добавлено @ 22:14 P.P.S. Конкретно в варианте с EurekaLog EBX оказывался равен OutSize из Base64EncodeStr (вместо InSize; InSize <= OutSize). Соответственно, Base64Encode кодировала больше данных, чем было нужно (заодно портя память, т.к. выходной буфер был предназначен только для содержания кодированных InSize байт, а не OutSize байт). Например, вместо взятия, скажем, 11-ти байт с входного буфера и записи их в 16-ти байтный выходной буфер, эта функция брала 16 байт из исходного буфера (ага, шанс на AV не сработал) и записывала 24 байта в выходной буфер (который имел размер 16 байт). Добавлено через 14 минут и 1 секунду Кстати, сишный fastcall не совместим с register: он использует только два регистра (ECX и EDX) вместо трёх и имеет другую семантику. Это сообщение отредактировал(а) CodeMonkey - 29.12.2009, 22:16 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Ну тогда бы билдер не смог компилироваться с делфи. Везде где делфийские вызовы у него __fastcall, так что либо билдер обманывает либо MS __fastcall отличается от билдеровского. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Могу ошибаться, но в 16-ти битном Паскале вроде бы не было соглашения register. Возможно, это был порт с Delphi 1. Хз. Добавлено через 1 минуту и 16 секунд Вы меня неверно поняли. Я не говорил про билдеровский __fastcall. Я говорил про MS-ский fastcall. Это разные вещи. Про что я и сказал. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Здесь имелось в виду, что __fastcall в Delphi - это register (свое зарезервированное слово), по аналогии с другими компиляторами, где __fastcall прописывается как есть. Соглашение о вызове так и называется - fastcall. Причем у __fastcall есть несколько вариантов (мне известно 4). Наверное, мне стоило убрать два нижних подчеркивания, потому что к Delphi они здесь особого отношения не имеют, зато вводят в заблуждение ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |