Показать сообщение отдельно
  #5  
Старый 22.02.2013, 06:29
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Боюсь схлопотать банку, но на 100% уверен что ТС`у это всё нужно исключительно в мирных, не хакерских целях, чисто для расширения кругозора (вона какой он хороший - телефонный справочник пишет О), а посему пжлст, сильно не бейте :+)
Цитата:
Сообщение от sorockinalex
...вот вспомнил, что лет 5 назад так делал программку - телефонный справочник, состоящий из одного exe-файла...
Такое было возможно и 15 лет назад, как уже заметил УК angvelem, основываясь на принципе выдёргивания данных справочника из ресурсов екзешки. Но это был, так сказать, CD-вариант: новые записи сделать так нельзя. Про это вагоны инфы существует.
Цитата:
...В общем, я каким-то образом записывал в конец этого exe файла из самого себя же...
А может данные хранились в реестре?-О) Что-то дописать к работающему коду невозможно т.к. на время выполнения он "подливается" к swap-файлу, а это значит, что при дефиците свободной оперативки или простоя блок (массив используемых переменных) с данными программы винда сбрасывает в хранилище, а сам код сборки уничтожается из памяти до возобновления процесса, недостающие куски потом считываются из физического файла на диске. Изменение его структуры во время выполнения приведёт к катастрофе, поэтому ося считает это куском файла подкачки, запрещая любые действия с ним. Так что, это всё прогерские байки или фантазии :-)
Цитата:
А также было обновление самого себя же - копировал поверх, закрывал и открывал снова...
Такое можно вытворять или батником (*.bat) почти на ДОСовском уровне (будут некоторые ограничения, типа длинных имён и кодировки, устарело), вот пример, как таким способом удалить самого себя:
Код:
...
var
  BatchFile: TextFile;
  BatchFileName : string;
  TempMem : PChar;
begin
  BatchFileName := changefileext(paramstr(0), '.bat');
  AssignFile(BatchFile, BatchFileName);
  Rewrite(BatchFile);
  Writeln(BatchFile,':try');
  Writeln(BatchFile,'del "' + ParamStr(0) + '"');
  Writeln(BatchFile,'if exist "' + ParamStr(0) + '" goto try');
  Writeln(BatchFile,'del "' + BatchFileName + '"');
  CloseFile(BatchFile);
  GetMem (TempMem,70);
  GetShortPathName (pchar(BatchFileName), TempMem, 70);
  BatchFileName:=TempMem;
  FreeMem(TempMem);
  winexec(Pchar(BatchFileName),sw_hide);

// http://forum.sources.ru
либо с помощью стороннего файла управления содержимым справочника, который будет запускаться при завершении работы, принимать на себя все изменения записей и после "отпускания" основного файла операционкой дописывать к нему новьё. Но к сожалению, "принцип одного окна" здесь невозможен.
Цитата:
...Знаю, многие будут говорить, что это в принципе невозможно! Но ведь я -то делал!!! Реально программа работала!
Ошибаетесь, скажут не многие, а все! Ну и чтобы немного освежилась память, чтоб удалось "вспомнить всё", вот пример добавления в конец файла текста:
Код:
...
var
txt: string;
b: byte;
i: integer;
begin

...

txt:= 'проверка';
with TFileStream.create('Моя софтина', fmOpenWrite or fmShareDenyWrite) do
try
Seek(0, soFromEnd);
for i:=1 to length(txt) do begin b:= Byte(txt[i]);Write(b,1);end;
b:=length(txt);
Write(b, 1);
finally
Free;
end;
end;
А вот как это считывать во время работы:
Код:
...
var
  bn: byte;
  txt: string;
  text: pchar;
begin

...

with TFileStream.create(Application.ExeName, fmOpenRead or fmShareDenyWrite) do
try
Seek(-1, soFromEnd);
Read(bn,1);
Seek(-byte(bn)-1, soFromEnd);
GetMem(text, byte(bn));
Read(text^, byte(bn));
txt:= string(text);
SetLength(txt, byte(bn));
FreeMem(text);
finally 
Free; 
end;
end;
Это только принцип, много добавить так не получится.
Ответить с цитированием