SFX-архив в Delphi. Методы создания.
exe-шный файл, а потом до него из другой проги дописывать что-то
(по-моему, это что-то называется overlay). Как организовать это
дописывание и чтение exe-шкой этих данных?
Как в Delphi можно сделать что-то навроде SFX-архива, т.е. сделать
exe-шный файл, а потом до него из другой проги дописывать что-то
(по-моему, это что-то называется overlay). Как организовать это
дописывание и чтение exe-шкой этих данных?
Можно добавлять в акцепторный SFX-экзешник резидентный ресурс, который SFX и будет обрабатывать.
Добавление осуществляется
BeginUpdataResource
UpdateResource
EndUpdateResource
Загрузка осуществляется
FindResource
LoadResource
Можно добавлять в акцепторный SFX-экзешник резидентный ресурс, который SFX и будет обрабатывать.
Добавление осуществляется
BeginUpdataResource
UpdateResource
EndUpdateResource
Загрузка осуществляется
FindResource
LoadResource
А можно ли поподробнее и по-русски =))
Как создать этот SFX-экзешник?
Если можно, краткий пример.
А можно ли поподробнее и по-русски =))
Как создать этот SFX-экзешник?
Если можно, краткий пример.
Щас с утчечка скомпилил демку. :)
Посмотри. Правда там бага одна :o - в readme описана.
Ресурс пихаю BeginUpdateResource, UpdateResource, EndResource
Читаю ресурс с помощью стрима TResourceStream - он вызывает FindResource и LoadResource.
Я тут посмотрел как Раровский эСэФиКсЕр устроен - тоже вроде архив в нём как ресурс лежит
У меня все работает, даже текст, загруженный из файла, нормально вносится.
Однако WinRAR'овские архивы, равно как и созданные Total Commander'ом SFX'ы отличаются двумя вещами:
- Модуль распаковки может быть запакован упаковщиком
- Среди ресурсов не видно того, что записывается.
- Если к модулю распаковки в тотале дописать архив zip (а в раре - его формата), просто дописать, т.е. в другой папке дать файлу имя sfx.exe и скопировать в папку с модулем, а при вопросе "Файл существует" нажать "дописать", ТО получится рабочий архив. Так что, по-видимому, там другой метод, т.е. там как-то дописывается информация в конец файла, а потом извлекается.
Может, есть мысли по поводу?
Спасибо!
У меня все работает, даже текст, загруженный из файла, нормально вносится.
Однако WinRAR'овские архивы, равно как и созданные Total Commander'ом SFX'ы отличаются двумя вещами:
- Модуль распаковки может быть запакован упаковщиком
- Среди ресурсов не видно того, что записывается.
- Если к модулю распаковки в тотале дописать архив zip (а в раре - его формата), просто дописать, т.е. в другой папке дать файлу имя sfx.exe и скопировать в папку с модулем, а при вопросе "Файл существует" нажать "дописать", ТО получится рабочий архив. Так что, по-видимому, там другой метод, т.е. там как-то дописывается информация в конец файла, а потом извлекается.
Может, есть мысли по поводу?
Можно поступить также
1) Если Экзешник знает свой размер (такой, что получился срезу после компиляции), дописываем в конец экзешника то, что нам нужно. Экзешник открывает сам себя и из нужной позиции читает. Всё.
2) А если уж совсем безопасно, то кидаем в ресурс к экзешнику его физический размер. А дальше также как в 1)
Только я не знаю, как ОС или АнтиВирь отреагируют на такие манипуляции с исполняемым файлом.
1) Если Экзешник знает свой размер (такой, что получился срезу после компиляции), дописываем в конец экзешника то, что нам нужно. Экзешник открывает сам себя и из нужной позиции читает. Всё.
А можно просто забить. Как правило, размер непосредственно архива намного больше размера модуля распаковки (даже неупакованного). Поэтому достаточно искать с начала файла сигнатуру архива - она есть и у RAR, и у Ziр: откройте архив и посмотрите. Ну, а как программе распаковке определить путь к самой себе, думаю, знаете. Нет - в поиск!
А можно просто забить. Как правило, размер непосредственно архива намного больше размера модуля распаковки (даже неупакованного). Поэтому достаточно искать с начала файла сигнатуру архива - она есть и у RAR, и у Ziр: откройте архив и посмотрите. Ну, а как программе распаковке определить путь к самой себе, думаю, знаете. Нет - в поиск!
Какими функциями можно в Delphi:
- Дописать до существующего файла что-то? Append?
- Найти в файле сигнатуру?
А сама прога не будет ругаться за такое извращение над нею?
Какими функциями можно в Delphi:
- Дописать до существующего файла что-то? Append?
- Найти в файле сигнатуру?
Это уже самостоятельное задание. Кто пищет программу - мы или ты? ;)
А сама прога не будет ругаться за такое извращение над нею?
Если открывать только на чтение - не будет.
Какими функциями можно в Delphi:
- Дописать до существующего файла что-то? Append?
Используй поток TFileStream для чтения и записи в файл. Как с ним развлекаться - RTFM :D
- Найти в файле сигнатуру?
Если сигнатура архива - это строки текста вроде "this is the beginning of my archive" то можно послеовательно грузить в память 30-40КБ как стринг и искать в нём обычным Pos иои PosEx твою строку-сигнатуру. Есть одна тонксть:!!!: - в самом экзешнике эта сигнатура не должна быть явным образом прописана или объявлена как ресурс или константа, иначе мы найдём неправильную точку входа в архив X)- .
Есть одна тонксть:!!!: - в самом экзешнике эта сигнатура не должна быть явным образом прописана или объявлена как ресурс или константа, иначе мы найдём неправильную точку входа в архив X)- .
Необязательно. Если доподлинно известно, что сигнатура присутствует в виде ресурса или константы, можно искать второе ее вхождение.
К слову сказать, сигнатуры RAR и Zip - однобайтовые, а ресурсы Windows хранит в Unicode. Достаточно описать сигнатуры как resourcestring, чтобы они не находились при поиске.