![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Вообщем допустим есть скомпиленный exe - мне нужно как-то в него подшить текстовую информацию при этом не побив файл. Как можно сделать?
Вообщем есть проект небольшой. Надо чтобы одна программа могла вшить в exe скрипт, и потом этот exe'шник мог прочитать скрипт с себя. Последний раз редактировалось UltraBloxX, 31.12.2009 в 14:27. |
#2
|
||||
|
||||
![]() Дописываете в конец файла скрипт, а затем его длинну.
При считывании, сперва читаете длинну ( последние байты ). Затем отсчитываете ее от конца файла и читаете. |
#3
|
|||
|
|||
![]() Сейчас попробовал сделать две проги для эксперимента с хранением данных в exe. Записывается в exe вроде нормально, но при чтении вторая прога без звука крэшится. Код записывающей программы:
Код:
procedure TForm1.Button1Click(Sender: TObject); begin Script := TStringList.Create; Script.Add('Test'); AssignFile(F,ExtractFilePath(ParamStr(0)) + 's.exe'); Reset(F); BufSize := SizeOf(Script); Seek(F,FileSize(F)); BlockWrite(F,Script,BufSize); Bf := BufSize; BufSize := BufSize + 64; Seek(F,FileSize(F)); BlockWrite(F,Bf,64); CloseFile(F); end; Код считывающей программы: Код:
procedure TForm1.Button1Click(Sender: TObject); begin AssignFile(F,(ParamStr(0))); FileMode := 0; Reset(F); Seek(F,FileSize(F)-64); BlockRead(F,BufSize,64); BufSize := BufSize + 64; Bf := FileSize(F)-BufSize; Seek(F,Bf); BlockRead(F,Script,BufSize); ShowMessage('Script Line 0: ' + Script.Strings[0]); CloseFile(F); end; F - нетипизированный файл Последний раз редактировалось UltraBloxX, 31.12.2009 в 16:20. |
#4
|
||||
|
||||
![]() Что-то Ты там намутил. И там и там + 64.
А sizeOf(Integer) = 4 байтам. Вот несколько ссылок, разбирайся http://www.cyberforum.ru/delphi-begi...read78060.html http://www.kansoftware.ru/?did=30 Удачи и с Новым Годом !!! |
#5
|
|||
|
|||
![]() Да, действительно ошибка позорная. Перепутал биты с байтами
![]() |
#6
|
|||
|
|||
![]() Теперь образовалась другая проблема - После считывания Script с себя (TStringList), при обращении к нулевому элементу (Script.Strings[0]) Access Violation, при этом Script создан. Вообщем в каком виде вшивать скрипт следует?
|
#7
|
||||
|
||||
![]() Так.
Если еще не разобрался, лучше прикрепи тестовый проект, а то у меня сегодня кнопка создания новых проектов плохо жмется. И скажи в какой Delphi работаешь ( в В 2009-2010 есть особенности ). Надеюсь ссылки использовал - в одной ( если там работающий код ) прям для твоего случая было. |
#8
|
|||
|
|||
![]() Код считывающей программы (юнит полностью)
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; F: File; BufSize,Bf: Int64; Script, S2: TStringList; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin //Script := TStringList.Create; //S2 := TStringList.Create; AssignFile(F,(ParamStr(0))); FileMode := 0; Reset(F); Seek(F,FileSize(F)-SizeOf(Int64)); BlockRead(F,BufSize,SizeOf(Int64)); Seek(F,FileSize(F)-(BufSize + SizeOf(Int64))); BlockRead(F,S2,BufSize); ShowMessage('Script Line 0: ' + S2.Strings[0]); CloseFile(F); end; end. Среда: Delphi 2009 Проблема возникает на этой строке: ShowMessage('Script Line 0: ' + S2.Strings[0]); Нужно много строк записать, по ссылке было для дописывания одной строки. |
#9
|
|||
|
|||
![]() Код считывающей программы (юнит полностью)
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; F: File; BufSize,Bf: Int64; Script, S2: TStringList; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin //Script := TStringList.Create; //S2 := TStringList.Create; AssignFile(F,(ParamStr(0))); FileMode := 0; Reset(F); Seek(F,FileSize(F)-SizeOf(Int64)); BlockRead(F,BufSize,SizeOf(Int64)); Seek(F,FileSize(F)-(BufSize + SizeOf(Int64))); BlockRead(F,S2,BufSize); ShowMessage('Script Line 0: ' + S2.Strings[0]); CloseFile(F); end; end. Среда: Delphi 2009 Проблема возникает на этой строке: ShowMessage('Script Line 0: ' + S2.Strings[0]); А именно Access Violation. Как я понял присвоить TStringList не получится. Нужно много строк записать, по ссылке было для дописывания одной строки. Последний раз редактировалось UltraBloxX, 01.01.2010 в 17:58. |
#10
|
||||
|
||||
![]() Сегодня все-же удалось нажать кнопку создания нового проекта
Прикрепляю. Там два проекта один записывает из Memo в выбранный файл, второй при запуске считывает из себя. Функции находятся в acRW модуле. Их взял по ссылке http://www.cyberforum.ru/delphi-begi...read78060.html Только подкорректировал для юникода. Писал в 2010 думаю у Вас пойдет. Последний раз редактировалось s0Creator, 03.01.2010 в 09:59. |
#11
|
|||
|
|||
![]() А проекты пустые...
Код:
unit STMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} end. |
#12
|
||||
|
||||
![]() Перезалил архив в предыдущем сообщении ( видно запаковал до сохранения )
|
#13
|
|||
|
|||
![]() Спасибо за помощь. Не знал что в свойстве Text хранятся все строки.
|