Збереження даних в exe
Збереження даних в EXE
Чи не підкаже хто-небудь з поважних майстрів, як зберігати деякі дані в самому EXE-файлі виконуваної програми. І як їх при її запуску зчитувати? Дякуємо.
наскільки я зрозумів, ти пишеш програми під windows. тоді відповіддю буде "ніяк", так як операційка блокує на запис і видалення виконуваний файл програми.
як альтернатива - можна записувати до реєстру, він для того і створений.
Тобто я не можу зберігати якийсь ARRAY, описаний в тілі програми, в її файлі, а як же тоді зберігаються файли з даними компонентів ClientDataset в самому EXE.
Створюй додатковий процес, який дочекається завершення твоєї проги, потім запише в ехе шник і закриється.
дані можна зберігати в ресурсах
і навіть є функції для збереження ресурсів
але я ними НЕ пользомался, так що експериментуй. )
Можеш все зберігати, тільки закрий спочатку програму.
IMHO чол запитує КУДИ КОНКРЕТНО все це запхати можна (ресурси там, заголовой exe-шника або що там ще є.), І за допомогою ЯКИХ САМЕ функцій / процедур потім це зчитувати? А записувати збирається за допомогою іншої утиль.
Абсолютно вірно. Адже Delphi дозволяє зберігати, наприклад, зображення в самому тілі EXE. Як цього ж домогтися для своїх даних.
Я пробував робити таку річ. Працює, але сам алгоритм негарний і кривої.
При запущеному ехешніке його самого можна скопіювати поруч з іншим ім'ям. Приписати до цієї копії в кінець будь-який шматок даних (перевіряв - ехешнік все одно працювати буде). Перед завершенням програми створити батник, який видалити основний ехешнік, і перейменує копію в основний. При наступному запуску можна вважати дані як звичайні бінарні.
Правда антивірусники можуть лаятися на такі файли з дописками - підозрюють їх на заражені, що, в общем-то, недалеко від істини :)
як зчитувати - по моєму, можна зробити так: на початку блоку своїх даних ставиш якусь мітку - скажімо, змінну String = "MyLabel"; потім вже з самої програми під час виконання відкриваєш самого себе (ехе-шник) і шукаєш цю мітку - після неї відповідно йдуть твої дані
а в коді прсто місце під них забий - після цієї самої мітки
тоді при читанні blockread Новомосковськ впеременную такого ж типу
а ось КУДИ ЗАПИСУВАТИ і ЯК МІСЦЕ ПІД ЗАПИС знайти - цього не знаю, можу припустити два варіанти: або в заголовок ехе-шника, або в місце ресурсів, місце під які знову ж забий знову ж на початку ресурсу - мітка
коротше - приблизно такі ідеї. сам не пробував, хоча і збираюся
2lipskiy:
записувати до речі можна ще створюючи длл-ку і запускаючи її через rundll32.exe - так само можна і потерти самого себе
Так взяв че треба і записав на кінець потім вважав нормально повинно працювати
У закритий 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 (25.03.02 01:13)
Так все насправді не так вже й складно. Якщо тобі не треба міняти ці дані, тоді ресурси це те, що тобі треба. Ресурси насправді це всього лише бінарні дані, тобто природно, вони можуть бути такими, якими ти їх сам захочеш бачити. Стандартні типи ресурсів існують тільки для полегшення роботи з найбільш часто використовуваними ресурсами. Все що тобі треба, це створити свій тип ресурсу і покласти туди свої дані, а далі працювати з ними з допомогою API ф-ций
FindResource, FindResourceEx, LockResource, LoadResource або можна використовувати для цих цілей клас TResourceStream. Але знову ж таки повторюся, дані будуть доступні тільки для читання.
Пам'ять: 0.75 MB
Час: 0.033 c