Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2009, 16:54   #1
inndim
Пользователь
 
Регистрация: 08.06.2008
Сообщений: 74
По умолчанию Проблема с Blockwrite

Подскажите пожалуйста как мне быть, хочу изменить в файле пару байтов таким вот макаром:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
Ch:Byte;
F:File of Byte;
begin
 Assignfile(F,'datafile.bpl');
 Reset(F);
 Seek(F,$478AEE);
 Ch:=$74;
 Blockwrite(F,Ch,1);
 Seek(F,$478B0E);
 Blockwrite(F,Ch,1);
 closefile(f);
end;
но в итоге ничего не меняется, а файл становится в 2 раза больше по размеру т.е. был 2.2мб а становится 4.6.
Хотя если брать простой ехе файл, и описанным выше способом поменять в нужных местах нужные байты, то всё нормально меняется, а вот с bpl ну никак.
Как с этим бороться?
вот ссылка примером и bpl файлом http://www.onlinedisk.ru/file/98378/

Последний раз редактировалось rpy3uH; 11.03.2009 в 20:05.
inndim вне форума Ответить с цитированием
Старый 11.03.2009, 19:53   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Такое, оказывается, тоже компилируется, но вообще всегда было:
если file of smth, то Write,
если просто file, то BlockWrite.
Попробуй просто Write(f, Ch), либо f:file и Reset(f,1).
Somebody вне форума Ответить с цитированием
Старый 11.03.2009, 20:42   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот Вы странный человек!

как по Вашему, что делает операция
Код:
Seek(F,$478AEE);
???

она устанавливает файловый указатель на позицию (смещение) 4688622 байт от начала файла.
После записи по этому смещению Вы и получаете файл такого размера!
Корректируйте смещение, по которому хотите изменять данные! (p.s. кстати, прежде чем что-то записать - неплохо проверить, что размер файла совпадает с нужным, и что по указанному смещению находятся нужные байты... Это просто повысит "дуракозащищённость" Вашей программы!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.03.2009, 15:49   #4
inndim
Пользователь
 
Регистрация: 08.06.2008
Сообщений: 74
По умолчанию

Somebody
Не помогает увы.
Serge_Bliznykov
Цитата:
она устанавливает файловый указатель на позицию (смещение) 4688622 байт от начала файла.
Тогда я совсем запутался, ведь 478AEE я беру из дизассемблера, т.е. открываю datafile.bpl в дизассемблере hiew, нахожу нужную строку и она имеет адрес 00478AEE, бррр..., надо подумать.
inndim вне форума Ответить с цитированием
Старый 12.03.2009, 18:56   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Это, похоже, адрес, по которому это будет в памяти загруженной проги, а не смещение в exe.
Somebody вне форума Ответить с цитированием
Старый 12.03.2009, 19:49   #6
CahekG
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 28
По умолчанию

Ехе после загрузки в память в соответствии с заголовком распределяется в памяти и может занимать объём превышающий сам файл, а так-же начинаться не с 0 адреса. Смещение проще Hex редактором найти при просмотре файла, а потом уже его указать в seek(f, .... )
CahekG вне форума Ответить с цитированием
Старый 12.03.2009, 22:27   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

inndim, господа Somebody и CahekG абсолютно правы (для подробностей читаем описание формата executable 32/ PE32)

а Вы попробуйте в HIEW (в режиме кода) нажать Ctrl-F5 и выбрать BASE +00000000

ну получилось смещение от начала файла??..
если нет - записывайте байтики и потом просто ищите их (не переходите в режим дизассемблера!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.03.2009, 08:38   #8
inndim
Пользователь
 
Регистрация: 08.06.2008
Сообщений: 74
По умолчанию

Somebody, CahekG
Спасибо вам большое за информацию к размышлению.

Serge_Bliznykov
Всё сделал в HIEW как вы написали, и о чудо, всё наконец-то получилось!
Спасибо вам за помощь, и снимаю шляпу.
inndim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37