Форум: "Основная";
Поиск по всему сайту: 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.75 MB
Время: 0.025 c
1-9506            lipskiy               2002-03-21 01:33  2002.04.04  
Как получить текстовое сообщение ошибки, имея ее код?


1-9523            Beginner              2002-03-23 16:12  2002.04.04  
OpenDialog


4-9678            АПИ                   2002-02-03 15:41  2002.04.04  
Решил изучить API, надеюсь на Вашу помощь!


3-9383            Sregnic               2002-03-12 12:43  2002.04.04  
Странность при соединении таблиц.


1-9522            Foxer                 2002-03-22 20:38  2002.04.04  
Еще один вопрос