![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как можно что то запихать в Exe файл? [D5, Win95/98, WinME]
k-sergey © (2002-10-30 11:41:00)Как можно что то запихать в Exe файл?
ну как бы сохранение данных программы в самом exe фйле...
Помогите кто знает...!
пишите на мыло k-sergey@mail.ru
KME (2002-10-31 14:39:00) [1]Зайдите на www.delphixfiles.narod.ru. Там все написано!
F1 (2002-10-31 14:31:00) [2]Чем с этим париться, лучше про криптографию почитай, и шифруй данные, которые ни кто не должен видеть :)
KSergey (2002-10-31 14:26:00) [3]> MegaVolt (31.10.02 13:13)
> А теперь как это всё сделать в реалтайме и для заранее не
> извесного текстового файла?
А интернет на что? Попадалось и такое. Правда компилятор нужен, но в принципе формат res-файлов думаю не бешено хитрый - прорвемся, если что.
Но не забудьте, что речь упорно про незапущеныйexe-шник. А по другому - а нафиг оно надо?
KSergey (2002-10-31 14:22:00) [4]> k-sergey (31.10.02 13:04)
> а мне надо пример хотябы....например как сохранить значение
> какой-нибудь переменной программы после её завершения, в
> самом exe файле? киньте пример на мыло K-Sergey@mail.ru
Да мне много что надо, и что?
Много раз саказано: нельзя так сделать. Ну НЕЛЬЗЯ! Единственный выход (вот если уж в exe-шник приспичило) - то надо еще один делать и его запускать, а он уже будет в первый дописывать как угодно (хоть и в ресурсы - примеры есть, см. интернет). Но, как верно заметил Zemal © (31.10.02 13:18)- а нафига?! Чем, напрмер, ini-файл не нравится? Хочется что-то спрятать - ну так зашифруйте в том же инишнике - вот и все!
Кто-то межет объяснить ценль? Может тогда и средство легче подберем, а?
Zemal (2002-10-31 13:18:00) [5]Что за хрень? От кого инфу прятать собрались? Зачем именно в экзэшник? Что? Текстового или ини-файла нехватает? Что вы спорите-то? Экзешник никак неполучится изменить, т.к. винды его блокируют на запись!!! Читать и запускать вторую копию - это пожалуста, а вот изменить, пока прога экспонирована в памяти, никак невыйдет... ну может быть и выйдет, если грохнуть ядро системы или как-то блокировать его, но это уже другая история... :). Вирусы что-ли писать надумали? К чему такой геморой?
MegaVolt (2002-10-31 13:13:00) [6]А теперь как это всё сделать в реалтайме и для заранее не извесного текстового файла?
k-sergey (2002-10-31 13:04:00) [7]Да....дискуссия...
а мне надо пример хотябы....например как сохранить значение какой-нибудь переменной программы после её завершения, в самом exe файле? киньте пример на мыло K-Sergey@mail.ru
KSergey (2002-10-31 12:17:00) [8]Я до кучи сюда добавлю еще про чтение из ресурсов, т.к., по-моему, это наиболее правильно.
Путь таков (если кто не в курсе)
Делаем файл который надо в ресурсы запихать. Пусть, например, это будет какой-нибудь текст. Файл Text.txt. Потом в любом текстовом редакторе делаем файл text.rc следующего содержания:
TEXTDATA USERDATA Text.txt
Далее в командной строке набираем
brcc32.exe text.rc
Должно пройти без сообщений об ошибках. Ошибки - исправляем. В результате должен получиться компилрованный файл ресурсов Text.RES.
Теперь собственно кусок кода в дельфи:
....
implementation
{$R *.DFM} // это было
{$R Text.RES} // а вот эту строчку добавляем
....
procedure TForm1.Button2Click(Sender: TObject);
var
Buffer: PChar;
ResStream: TResourceStream;
begin
GetMem(Buffer, 100);
try
ResStream := TResourceStream.Create(HInstance, "TEXTDATA", pChar("USERDATA"));
try
ResStream.Read (Buffer^, 100);
Memo1.Lines.Text := Buffer;
finally
ResStream.Free;
end;
finally
FreeMem(Buffer);
end;
end;
Ну тут я навернул через буфер - это чтобы показать, что куда то это все можно сгрузить. Для помещения в Memo по идее можно проще поступить. Но не в этом суть. Важно, что мы прочитали текст!
Еще один пример можно посмотреть http://people.alt.ru/computers/brsoft/delphi/DEL30.html
ЬупфМщде (2002-10-30 16:56:00) [9]Я же написал ясно и чётко что работает и именно так как написал KSergey. У меня приложение во время работы читает файл с ехешником в поток к нему дописывает всё что мне нужно и записывает под другим именем. А при запуске этого приложения оно автоматически извлекает данные из своего хвоста и исспользует их :)
F1 (2002-10-30 16:48:00) [10]Все понятно!!!
Я когда так же делал не указал fmShareDenyNone
Вот меня и отругали неподетски.
KSergey (2002-10-30 16:44:00) [11]> F1 © (30.10.02 14:22)
> А о копировании как-то не подумал /:(
Да при чем тут, блин, копирование? Про копирование я сказал к тому, что при копировании файл необходимо прочитать, а раз копируется - значит и читать можно. Вот пример, наконец. Точно работает.
procedure TForm1.Button1Click(Sender: TObject);
var
FStream: TFileStream;
Buffer: PChar;
begin
GetMem(Buffer, 100);
try
FStream := TFileStream.Create(Application.ExeName, fmOpenRead + fmShareDenyNone);
try
FStream.Read (Buffer^, 99);
Memo1.Lines.Text := Buffer;
finally
FStream.Free;
end;
finally
FreeMem(Buffer);
end;
end;
Ну в Memo, понятно, не все 99 байт скопируются, но это уже отдельная тема. Факт в том, что сам exe-шник читает себя запросто.
F1 (2002-10-30 14:22:00) [12]>KSergey © (30.10.02 14:12)
>Вранье наглое. Читать можно сколько угодно
Согласен, стормозил, я пытался:
St:=TFileStream.Create(прям сам ехешник,fmOpenRead);
Так он меня отругал неподетски.
А о копировании как-то не подумал /:(
F1 (2002-10-30 14:16:00) [13]>KSergey © (30.10.02 14:10)
>ресурся впихиваются на этапе линковки
Как я понял, так не пойдет.
Я вот вспомнил, что у есть hInstance-указатель на начало спроецированного exe-шника в памяти процесса. А оттуда можно читать(насколько я знаю), а если нужно писАть, то в копию.
KSergey (2002-10-30 14:12:00) [14]> F1 © (30.10.02 14:00)
> А я не знаю, как там в 98, а вот в 2000, XP сто пудово не
> работает даже чтение.
Вранье наглое. Читать можно сколько угодно. (равно как и копировать внешними программами запущеный exe-шник)
KSergey (2002-10-30 14:10:00) [15]Люди!!! Есть же отличный способ и отличное место - ресурсы. Туда можно совершенно законно и стандартными методами пихать/читать все что угодно! Любые пользовательсие данные!
Лично мне известен только одино неудобство такого подхода: ресурся впихиваются на этапе линковки, понятно, и если пихать в ресурсы сильно большие данные (ну там 100Мб, например, а что?) - то при отладке надоедает ждать каждый раз перекомписяции/перелинковки. Ну тут выход наверное такой: отлаживем на небольшом объеме модельных данных, а как все готоро - пересобираем с реальными данными. В принципе любой из предложенных способов страдает тем же. Зато тут все законно ;)
F1 (2002-10-30 14:00:00) [16]>MegaVolt (30.10.02 13:26)
>cutter-pro (30.10.02 13:27)
А я не знаю, как там в 98, а вот в 2000, XP сто пудово не работает даже чтение.
Хотя он ведь делается MemoryMapped, может быть его читать сразу из памяти, только вот где эта память???
Кстати, даже размер файла нельзя узнать :(
cutter-pro (2002-10-30 13:27:00) [17]>F1 Насчет блокировки на запись - это ты правильно подметил. Надо подумать... А вот насчет блокировки даже на чтение - позволю себе с тобой не согласиться - в w98se файл читается без проблем.
Насчет w95, wme, wnt, w2000, wxp - понятия не имею, да и честно говоря не имею желания пробовать.
MegaVolt (2002-10-30 13:26:00) [18]А для чего я написал что необходимо иметь копию? А на счёт того что винды блокируют доступ даже на чтение это не совсем так :) Я собственноручно проверял совет который привёл выше покрайней мере по 98! Всё прекрасно извлекалось :)
F1 (2002-10-30 12:34:00) [19]А как насчет того, что винды блокируют запущенный exe-шник даже на чтение???
MegaVolt (2002-10-30 12:09:00) [20]Есть ещё один очень простой вариант но для него неужно иметь копию ехешника: Дописываем в конец ехешника то что вы хотите а далее например в самый конец дописываете ссылку на конец исходного ехешника. Работа с таким файлом возможна и из самого ехешника: первым делом лезем в конец файла-4 байта (размер integer) читаем указатель и далее перемещаемся в файле на позицию указанную в указателе и получаем начало наших данных.