Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];




Вниз

Сохранение данных в EXE 


Kon   (2002-03-23 01:50) [0]

Не подскажет ли кто-нибудь из уважаемых мастеров, как сохранять некоторые данные в самом EXE-файле исполняемой программы. И как их при ее запуске считывать? Спасибо.



wicked   (2002-03-23 02:13) [1]

насколько я понял, ты пишешь программы под windows... тогда ответом будет "никак", так как операционка блокирует на запись и удаление исполняемый файл программы...
как альтернатива - можно записывать в реестр, он для того и создан...



Kon   (2002-03-23 02:22) [2]

То есть я не могу хранить какой-нибудь ARRAY, описанный в теле программы, в ее файле,а как же тогда сохраняются файлы с данными компонентов ClientDataset в самом EXE???



McLaren   (2002-03-23 09:25) [3]

Создавай дополнительный процесс, который дождется завершения твоей проги, потом запишет в ехе шник и закроется.



perov   (2002-03-23 09:32) [4]

данные можно хранить в ресурсах
и даже есть функции для сохранения ресурсов
но я ими не пользомался, так что экспериментируй... :)



Anatoly Podgoretsky   (2002-03-23 09:35) [5]

Можешь все хранить, только закрой сначала программу.



Alex_LG   (2002-03-23 17:44) [6]

IMHO чел спрашивает КУДА КОНКРЕТНО всё это запихнуть можно (ресурсы там, заголовой exe-шника или что там ещё есть...), и при помощи КАКИХ ИМЕННО функций/процедур потом это считывать? А записывать собирается с помощью другой утилы.



Kon   (2002-03-24 12:05) [7]

Совершенно верно. Ведь Delphi позволяет хранить, например, изображения в самом теле EXE. Как этого же добиться для своих данных.



lipskiy   (2002-03-24 14:03) [8]

Я пробовал делать такую вещь. Работает, но сам алгоритм некрасивый и кривой.
При запущенном ехешнике его самого можно скопировать рядом с другим именем. Приписать к этой копии в конец любой кусок данных (проверял - ехешник все равно работать будет). Перед завершением программы создать батник, который удалить основной ехешник, и переименует копию в основной. При следующем запуске можно считать данные как обычные бинарные.
Правда антивирусники могут ругаться на такие файлы с дописками - подозревают их на зараженные, что, в общем-то, недалеко от истины :)



Alex_LG   (2002-03-24 14:09) [9]

как считывать - по моему, можно сделать так: в начале блока своих данных ставишь какую-то метку - скажем, переменную String="MyLabel" ; потом уже из самой программы во время исполнения открываешь самого себя (ехе-шник) и ищешь эту метку - после неё соответственно идут твои данные
а в коде прсто место под них забей - после этой самой метки
тогда при чтении blockread читай впеременную такого же типа

а вот КУДА ЗАПИСЫВАТЬ и КАК МЕСТО ПОД ЗАПИСЬ найти - этого не знаю, могу предположить два варианта: либо в заголовок ехе-шника, либо в место ресурсов, место под которые опять же забей {$R ресурс.RES} опять же в начале ресурса - метка

короче - примерно такие идеи. сам не пробовал, хотя и собираюсь



Alex_LG   (2002-03-24 14:12) [10]

2lipskiy:
записывать кстати можно ещё создавая длл-ку и запуская её через rundll32.exe - так же можно и потереть самого себя



stexen   (2002-03-24 15:09) [11]

Да взял че надо и записал на конец потом считал нормально должно работать



DenKop   (2002-03-24 15:22) [12]

В закрытый EXE записывается так:
procedure TForm1.Button1Click(Sender: TObject);
var
FileHandle:integer;
s:string[10];
begin
if edit1.text<>"" then
begin
s:=edit1.Text;
FileHandle := FileOpen("1.exe",fmOpenReadWrite);
FileSeek(FileHandle,SizeOf(s),2);
FileWrite(FileHandle,s,SizeOf(s));
FileClose(FileHandle);
end;
end;

А читается так:
procedure TForm1.Button2Click(Sender: TObject);
var
FileHandle:integer;
s:string[10];
begin
FileHandle := FileOpen("1.exe",fmOpenReadWrite);
FileSeek( FileHandle,-SizeOf(s),2);
FileRead(FileHandle,s,SizeOf(s));
ShowMessage(s);
FileClose(FileHandle);
end;

Ну а для сохранения array вместо SizeOf(s) вставляешь
SizeOf(a[1])*KolvoElementovMassiva
Так способ годится только для сохранения массивов стандартных типов (Integer,Real,String etc.) для структурированных типов не проверял.



Kon   (2002-03-25 01:13) [13]

Спасибо всем, но уж больно все как-то коряво (это не претензия ко всем сочувствующим, а просто странно, что нет ничего проще)



Suntechnic   (2002-03-25 07:03) [14]

Что то я не понял о чём этот флейм? Человеку не надо изменять данные, ему надо их просто хранить, так по крайней мере следует из вопроса, тогда ответ один: ресурсы.

>Kon (25.03.02 01:13)
Да всё на самом деле не так уж и сложно. Если тебе не надо менять эти данные, тогда ресурсы это то, что тебе надо. Ресурсы на самом деле это всего лишь бинарные данные, т.е., естественно, они могут быть такими, какими ты их сам захочешь видеть. Стандартные типы ресурсов существуют только для облегчения работы с наиболее часто используемыми ресурсами. Всё что тебе надо, это создать свой тип ресурса и положить туда свои данные, а дальше работать с ними с помошью API ф-ций
FindResource, FindResourceEx, LockResource, LoadResource или можно использовать для этих целей класс TResourceStream. Но опять же повторюсь, данные будут доступны только для чтения.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.019 c
6-9587            Romul                 2002-01-22 14:47  2002.04.04  
Синхронное или асинхронное соединение


3-9394            SashaG                2002-03-12 08:59  2002.04.04  
Пытаюсь св-ву Filter TTable сделать так:


1-9562            Man-In-Red            2002-03-23 18:20  2002.04.04  
Как из любого файла (директория и имя его находятся в Edit`e1), вытащить его значок и поместить в Image1?


1-9528            MaratA                2002-03-23 19:07  2002.04.04  
Delphi виснет через несколько запусков проги


14-9639           ev                    2002-02-20 17:29  2002.04.04  
сравнение ГИС