Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как можно что то запихать в Exe файл? [D5, Win95/98, WinME]


Страницы:   1 2

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) читаем указатель и далее перемещаемся в файле на позицию указанную в указателе и получаем начало наших данных.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо