![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Да, действительно ошибка позорная. Перепутал биты с байтами
. У меня BufSize - Int64. Так что выходит 8 байт. |
|
#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 хранятся все строки.
|