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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2011, 01:25   #1
Unconnected
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 55
По умолчанию Записать бинарник из строки

Привет всем.
Есть строка "кракозябров", которые на самом деле являются exe-файлом, эта строка получается при скачке файла с сервера. Надо их записать в файл, чтобы получился обратно рабочий exe. Как это сделать? BlockWrite-ом не получилось..

Последний раз редактировалось Unconnected; 11.07.2011 в 01:28.
Unconnected вне форума Ответить с цитированием
Старый 11.07.2011, 01:54   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
BlockWrite-ом не получилось..
Это с чего вдруг? Код в студию.
p51x вне форума Ответить с цитированием
Старый 11.07.2011, 03:02   #3
Unconnected
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 55
По умолчанию

Я не знаю, как заполнять его (writebuffer) входные параметры из строки..

Последний раз редактировалось Unconnected; 11.07.2011 в 03:56.
Unconnected вне форума Ответить с цитированием
Старый 11.07.2011, 08:50   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Данные в String?

Код:
var
  Src: AnsiString;
  Dst: TStream;
...
  Dst.WriteBuffer(Pointer(Src)^, Length(Src));
Код:
var
  Src: AnsiString;
  Dst: File;
...
  BlockWrite(F, Pointer(Src)^, Length(Src));
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.07.2011, 09:16   #5
Unconnected
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 55
По умолчанию

Код:
procedure str2exe(src,p:ansistring);
var
  Dst:File;
begin
  assignfile(dst,p);
  rewrite(dst);
  BlockWrite(dst, Pointer(Src)^, Length(Src));
  closefile(dst);
end;
На строке BlockWrite вылетает с ошибкой I\O error 1784. Мол, тип буффера ему неправильный..
Или, может, надо было не assign, а как-то по другому.
Unconnected вне форума Ответить с цитированием
Старый 11.07.2011, 09:19   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

F1:
Цитата:
RecSize is an optional expression that can be specified only if F is an untyped file. If F is an untyped file, RecSize specifies the record size to be used in data transfers. If RecSize is omitted, a default record size of 128 bytes is assumed.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.07.2011, 09:27   #7
Unconnected
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 55
По умолчанию

Ну файл тут untyped-нетипизированный, значит, нужно явно указать.. чтобы одной порцией записалось.
Код:
rewrite(dst,length(src));
- так?
Unconnected вне форума Ответить с цитированием
Старый 11.07.2011, 09:36   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1)
Цитата:
Ну файл тут untyped-нетипизированный, значит, нужно явно указать.. чтобы одной порцией записалось.
нет
Вы же размер записываемого буфера указываете в байтах, значит, нужно указать, что размер записываемой информации 1 байт:
Код:
rewrite(dst,1);
2) А чем Вам TFileSteam не угодил?! Он же удобнее, проще (а возможно, и эффективнее).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.07.2011, 09:59   #9
Unconnected
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 55
По умолчанию

Цитата:
Вы же размер записываемого буфера указываете в байтах, значит, нужно указать, что размер записываемой информации 1 байт:
Да, точно. Всем спасибо, заработало)
TFileStream юзать не могу, т.к. обхожусь без Classes, пишу на KOL. Там тоже конечно есть аналоги, но тут удобнее со строками скорее всего..

Кстати, вопрос по близкой теме: если, допустим, таким макаром записать файл и следующей командой в программе его запустить (shellexecute), - возможна ли ситуация, что файл типа не успел записаться и не запустится?
Unconnected вне форума Ответить с цитированием
Старый 11.07.2011, 10:21   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Кстати, вопрос по близкой теме: если, допустим, таким макаром записать файл и следующей командой в программе его запустить (shellexecute), - возможна ли ситуация, что файл типа не успел записаться и не запустится?
а вы закройте файл перед запуском.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись в бинарник и access violation reading location Farrel Общие вопросы C/C++ 2 23.03.2011 20:13
компиляция в чистый бинарник Hell Knight Общие вопросы C/C++ 5 23.03.2011 19:50
файловый поток. Открыть\создать бинарник Darth.Vader Общие вопросы C/C++ 16 29.12.2009 22:04
txt в бинарник и обратно cowboy Общие вопросы Delphi 9 16.09.2009 10:54
Как выяснить каким образом обрабатывается бинарник yarilo Помощь студентам 1 22.04.2009 09:57