![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Настройки внутри *.exe [D7, WinXP]
parovoZZ © (2004-07-27 21:40:00)Возможно ли сохранять данные внутри исполняемого файла?
OSokin (2004-08-03 20:29:00) [1]Да еще можно почитать статейки о программах-заставках... Они такое тоже используют. В основном RCData
Anatoly Podgoretsky (2004-08-02 10:16:00) [2]А зачем, автор про это не спрашивал, задача его не ясна
xShadow (2004-08-02 10:11:00) [3]Anatoly Podgoretsky © (02.08.04 10:04) [42]
Я так думаю надо сразу уточнить, дабы не возникали топом темы "Взял код с этого форума а он не работает".
ALS (2004-08-02 10:07:00) [4]http://www.programmersheaven.com/zone24/cat31/4202.htm
Anatoly Podgoretsky (2004-08-02 10:04:00) [5]xShadow © (02.08.04 09:54) [40]
Разве это препятствие или кто то говорил про открытый ехе
Кириешки (2004-08-02 10:00:00) [6]:)
xShadow (2004-08-02 09:54:00) [7]Кириешки © (02.08.04 09:45) [39]
И это всё применимо к закрытому EXE файлу.
Кириешки (2004-08-02 09:45:00) [8]_________________________
+++++++++++++++++++++++++
Добавить данные в EXE файл и получить их можно ТАК :
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
MemoryStream.Seek(0, soFromBeginning);
// seek to end of File
// ans Ende der Datei Seeken
aStream.Seek(0, soFromEnd);
// copy data from MemoryStream
// Daten vom MemoryStream kopieren
aStream.CopyFrom(MemoryStream, 0);
// save Stream-Size
// die Streamgro?e speichern
iSize := MemoryStream.Size + SizeOf(Integer);
aStream.Write(iSize, SizeOf(iSize));
finally
aStream.Free;
end;
Result := True;
end;
function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
// seek to position where Stream-Size is saved
// zur Position seeken wo Streamgro?e gespeichert
aStream.Seek(-SizeOf(Integer), soFromEnd);
aStream.Read(iSize, SizeOf(iSize));
if iSize > aStream.Size then
begin
aStream.Free;
Exit;
end;
// seek to position where data is saved
// zur Position seeken an der die Daten abgelegt sind
aStream.Seek(-iSize, soFromEnd);
MemoryStream.SetSize(iSize - SizeOf(Integer));
MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize));
MemoryStream.Seek(0, soFromBeginning);
finally
aStream.Free;
end;
Result := True;
end;
procedure TForm1.SaveClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
Memo1.Lines.SaveToStream(aStream);
AttachToFile('Test.exe', aStream);
aStream.Free;
end;
procedure TForm1.LoadClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
LoadFromFile('Test.exe', aStream);
Memo1.Lines.LoadFromStream(aStream);
aStream.Free;
end;
T-Lex (2004-08-01 13:30:00) [9]to xShadow:
> И от добавленного кода размер экзешника измениться!
Чаще не меняется. И если меняется, то не на много. И эти дополнительные строчки можно заранее написать, а потом только цифру смещения изменить. тогда размер не изменится. Ну и вообще, как верно подмечено в [37], конец файла надо искать: seek eof(f)
мимо (2004-07-29 11:07:00) [10]дописать в хвост файла ...append или как там его?
Anatoly Podgoretsky (2004-07-29 10:29:00) [11]xShadow © (29.07.04 10:24) [35]
Платформа НТ позволяет это делать автоматически, называется мапирование
xShadow (2004-07-29 10:24:00) [12]T-Lex (29.07.04 02:04) [34]
И от добавленного кода размер экзешника измениться!
И запишешь уже возможно в другую область!
Лучше всё же хранить данные в реестре + дублировать их в ini файл вот собстенно и всё.
T-Lex (2004-07-29 02:04:00) [13]ответы на...
"зачем":
ну, например, если есть утилитка (этот один *.exe) и ее надо таскать в разные места и т.п. типа, смотрелка каких-либо файлов в директории... ну или мало ли че еще...
ну и, собстно,
"Как":
для начала в тексте программы в любом месте пишешь что-нить типа
s:='++++++++++++++++++++++++++++++++++++++';
После чего компиллируешь. после этого открываешь полученный экзешник через какой-нить hex-editor... (DN, NC,... или че там сейчас народ юзает? :) и ищешь там позицию, откуда начинаются эти плюсы. (допустим это 2030 байт)
После этого опять лезем в исходник и пишем:
var
f: file of byte;
...
assignfile(f,'project.exe');
reset(f); seek(f,2030); write(f,life); write(f,money); write (f,condoms); .....
ну и соответственно так же читаем:
seek(f,2030); read(f,life);....
Вот... Не знаю, на сколько это грамотно... Этот способ придумал сам, когда еще на QBASIC под DOS писал...
parovoZZ (2004-07-28 21:57:00) [14]Ну ясно, спасибо за проявленный интерес.
(2004-07-28 21:16:00) [15]Удалено модератором
Anatoly Podgoretsky (2004-07-28 11:49:00) [16]Да вариант лучше, но дорогой.
Sun bittern (2004-07-28 11:42:00) [17]Anatoly Podgoretsky © (28.07.04 11:01) [29]
Предложенный вами выше вариант Anatoly Podgoretsky © (28.07.04 09:22) [19] все на CD-ROM ныне не в моде. Гораздо лучше иметь дополнительные машины в горячем резерве полностью дублирующие главную. Например, как на АЭС.
Anatoly Podgoretsky (2004-07-28 11:01:00) [18]Главное что это не решается задачи, которая была поставлена так - при удалении папки с программой! parovoZZ © (28.07.04 02:39) [12]
Kerk (2004-07-28 10:50:00) [19]
> Kloun (28.07.04 10:44) [27]
ну-ну. и как ты это ресурс к своему ехе в рантайм добавишь?
Kloun (2004-07-28 10:44:00) [20]человек спрашивал как засунуть настройки в exe-шник - лучший способ, помоему, положить их в ресурсы