Форум: "Начинающим";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];
ВнизSFX Найти похожие ветки
← →
Ghost del vonte © (2013-01-11 07:19) [0]Доброго времени суток всем!
Господа, прошу помощи... и вот по какому делу:
Как в exe заготовку вшить таблицу архива?
Я не стал заморачиваться над склейкой таблицы и самого архива в один файл, писал исключительно для себя, поэтому мне лишний файл таблицы не мешает... появилась острая необходимость в sfx, сам архиватор таскать все время не охота... всю голову уже сломал, вся надежда на вас...
Великий Гугл, предложил мне три варианта:
1) Таблицу конвертнуть в ресурсный файл! собственно это и есть сам вопрос, как вшить его?
2) Таблицу преобразовать в массив и записать в пас файл, тогда как пас файл затолкать а exe? :)
3) Открыть заготовку в потоке, поставить указатель в конец, и дописать туда саму таблицу... опять же, как поставить указатель на начало таблицы?
Остался самый простой и радикальный метод: создать распаковщик,
который будет идти один ко всем архивам, вроде так проще всего,
но мне интересен сам процесс, ведь как-то создают другие sfx, а также
слайд шоу, и т.п...
Вы скажите мне хотя бы какие функции надо юзать, а там я уж сам
попытаюсь разобраться, с помощью гугла разумеется!
Всем спасибо за ответы!
← →
MBo © (2013-01-11 08:09) [1]создать текстовый файл с расширением .rc и вписать в него строчку наподобие:
MY_MUSIC RT_RCDATA "a.mp3"
По порядку - название ресурса, тип ресурса, имя файла
Извлечение (один из способов):
Res := TResourceStream.Create(hInstance, "MY_MUSIC", PСhar("RT_RCDATA"));
← →
O'ShinW © (2013-01-11 08:48) [2]Как вшиваю исходники в программу, дабы не потерялись
1.
создать файл SOURCE.RC с содержимым SRC RCDATA "SOURCE.RAR"
2.
создать батник(пусть IncludeSource.bat) с содержимым
rem Создать файл, который надо вшить, как архив всех файлов в каталоге, исключая exe (dcu и проч, но это вырезал сейчас, можно добавить, при необходимости)
"C:\Program Files\WinRAR\rar.exe" a Source *.* -x*.exe
rem преобразовать в ресурс
brcc32.exe SOURCE.RC
запустить батник
3.
в файле *.dpr, где-то в начале,
if UpperCase(ExtractFileName(paramstr(0))) = "GIVEMESRC.EXE" then
SaveSource;
где SaveSource, процедура, объявленная тут-же, в *.dpr
procedure SaveSource;
{$R SOURCE.RES} // включить файл как ресурс
var
stream: TStream;
FileStream: TFileStream;
begin
stream := TResourceStream.Create(Hinstance, "SRC", RT_RCDATA);
FileStream := TFileStream.Create(application.ExeName+"-source.rar", fmCreate);
try
FileStream.CopyFrom(stream, 0);
finally
FileStream.Free;
stream.Free;
end;
end;
------
Теперь достаточно переименовать exe в GIVEMESRC.EXE и запустить, что бы он дал свои исходники. А так как и доку, и ini, и т.п. ложу обычно в тот же каталог, к исходникам - то и доку (и прочее) легко восстанавливаю.
Надо только не забывать запускать периодически IncludeSource.bat
← →
Ghost del vonte © (2013-01-11 10:48) [3]Нет, я возможно не так описал...
Вшить надо в уже скомпилированный EXEшник, тоесть я таблицу конвертирую в ресурсный файл, этот файл надо вшить в заготовку... а заготовка уже запрограммирована на открытие таблицы и распаковки архива...
← →
RWolf © (2013-01-11 13:24) [4]Restorator.
← →
Rouse_ © (2013-01-11 13:54) [5]SFX, это обычный экзешник, к которому оверлеем дописывается тело архива, который он должен распаковать.
Что такое "таблица архива" и зачем ее совать в ресурсы - мне не понятно.
← →
QAZ10 (2013-01-11 15:34) [6]
> Ghost del vonte © (11.01.13 10:48) [3]
а чем винраровский сфх не устраивает ?
← →
icWasya © (2013-01-11 16:33) [7]1) как создать
Ну например так//открыть один файловый поток за запись
var
SFX:TStream;
S:TStream;
L,Count:Integer;
SFX:=TFileStream("NewSFX.EXE",fmCreate);
Count:=0;
//открыть другой файловый поток за чтение
// файл SFX.EXE должен уже существовать
S:=TFileStream("SFX.EXE",fmRead);
L:=S.Size;
SFX.CopyFrom(S,L);// скопируем
SFX.Write(L,SizeOf(L));//затем запишем длину
S.Free;
//затем для каждого дополнительного файла
S:=TFileStream("File1",fmRead);
L:=S.Size;
SFX.Write(L,SizeOf(L));//вначале запишем длину
SFX.CopyFrom(S,L);// скопируем
SFX.Write(L,SizeOf(L));//затем запишем длину
S.Free;
Count:=Count+1;
S:=TFileStream("File2",fmRead);
L:=S.Size;
SFX.Write(L,SizeOf(L));//вначале запишем длину
SFX.CopyFrom(S,L);// скопируем
SFX.Write(L,SizeOf(L));//затем запишем длину
S.Free;
Count:=Count+1;
SFX.Write(Count,SizeOf(Count));//затем запишем количество файлов
SFX.Free; // и закончили
2)что за SFX.EXE
это должен написать сам.
Эта программа должна уметь -
//открыть себя в файловом потоке на чтение
SFX:=TFileStream.Create(ParamStr(0),fmOpenRead);
//установить указатель на конец файла -4
SFX.Seek(-SizeOf(Count),soEnd);
//прочитать количество записаных файлов
SFX.Read(Count,SizeOf(Count));//
далее сдвигая позицию в потоке находим начало каждого "файла" и его размер
Что с ними делать дальше - дело вкуса.
Например скопировать часть потоку в TMemoryStream, а затем загрузить из него картинку.
Или создать файл, и скопировать часть потока туда.
Для архивов - поищи компоненты для работы с ними. в инете полно даже с исходниками.
Удачи
← →
Rouse_ © (2013-01-11 18:47) [8]
> icWasya © (11.01.13 16:33) [7]
для SFX писать размеры оверлея не надо, ибо эти данные уже содержатся внутри архива. Т.е. банально пишем тело распаковщика (который самостоятельно выходит на позицию оверлея, зная размер SFX стаба) и сразу за ним тело архива - профит.
← →
Ghost del vonte © (2013-01-12 01:58) [9]
> icWasya
Спасибо! Значит, третий вариант таки актуален...
Нет, я хочу только таблицу вшить... итак, я открываю заготовку в потоке,
дописываю в конец потока таблицу, а как потом, открыв "себя", найти указатель на нее? Можете поподробнее? Я просто любитель, для себя пишу...
И, речь идет о своем архиваторе, написанным собой, для себя же...
Всем откликнувшимся глубокая благодарность!
← →
Rouse_ © (2013-01-12 02:20) [10]
> Нет, я хочу только таблицу вшить...
Что такое в твоем понятии таблица?
← →
Ghost del vonte © (2013-01-12 04:31) [11]
> Rouse_ © (12.01.13 02:20) [10]
Таблица - файл, в котором описаны имена файлов, их позиции в архиве, их размеры... тоесть, при создании архива, у меня в один поток сжимаются необходимые файлы, а в другом заносится информация, об их размерах, позиции, имена... вот мне необходимо в заготовку вшить такую таблицу...
← →
Rouse_ © (2013-01-12 15:46) [12]
> Таблица - файл, в котором описаны имена файлов, их позиции
> в архиве, их размеры...
А ну так это-ж не архив. Возьми все это и запакуй в ZIP - будет архив.
← →
Ghost del vonte © (2013-01-13 07:19) [13]
> А ну так это-ж не архив. Возьми все это и запакуй в ZIP
> - будет архив.
Как не архив? Ладно, объясню поподробнее:
У меня свой тип архива, архиватор создает архив в двух файлах,
в одном сжатые файлы (пока zlib, скачал с сайта 7z исходники LZMA - изучаю),
а во втором таблица, в которой указаны позиции файлов в архиве, их размеры, имена, папки...
появилась необходимость в SFX... архиватор упаковывает папку в архив,
извлекает заготовку, и в нее нужно вшить таблицу...
так вот как вшить то ее?
Я думаю два варианта:
1) Дописывать в конец заготовки таблицу, как поставить потом указатель на нее?
2) таблицу конвертировать в ресурсный файл (это я умею), и вшить ресурсный файл в уже скомпилированную заготовку, как это делает Resource Hacker...
Подскажите, как можно осуществить это?
← →
icWasya © (2013-01-14 13:03) [14]Прочитать структуру заголовка исполняемого файла. В примерах с Дельфи вроде должен быть проект, читающий ресурсы. Где-то в недрах заголовка находится информация об размере файла. Всё что дальше - это будет ваша таблица.
← →
Rouse_ © (2013-01-14 16:22) [15]
> Ghost del vonte © (13.01.13 07:19) [13]
Зачем изобретать свое? Возьми в качестве стаба ZIP.SFX от WinRar.
Для создания ZIP архива любой набор классов, хоть даже мой: http://rouse.drkb.ru/components.php#fwzip
потом по шагам - делаешь ZIP архив, после чего выполняешь вот такой код:var
SFX, Tmp: TFileStream;
begin
// создаем результирующий стрим
SFX := TFileStream.Create("s:\tmp\sfx.exe", fmCreate);
try
// добавляем SFX стаб
Tmp := TFileStream.Create("s:\tmp\zip.sfx", fmOpenRead or fmShareDenyWrite);
try
SFX.CopyFrom(Tmp, 0);
finally
Tmp.Free;
end;
// к нему оверлеем сам архив
Tmp := TFileStream.Create("s:\tmp\tmp.zip", fmOpenRead or fmShareDenyWrite);
try
SFX.CopyFrom(Tmp, 0);
finally
Tmp.Free;
end;
finally
SFX.Free;
end;
end.
собственно все и без заморочек. Сам SFX модуль, насколько я помню, можно использовать свободно без нарушения лицензий.
← →
Ghost del vonte © (2013-01-15 14:22) [16]
> icWasya © (14.01.13 13:03) [14]
Спасибо, погляжу... идея мне нравится!
> Rouse_ © (14.01.13 16:22) [15]
Свое, написанное собой, гораздо приятнее чужого...
Архиватор предназначен для фото, звуков, текстов, и заточен именно под этот тип файлов, хоть поддерживает и все остальные... его суть: отображать содержимое архива так, как отображают изображения программы для просмотра изображений)) Ну и помимо этого еще куча всего...
Всем спасибо!
← →
Rouse_ © (2013-01-15 15:34) [17]
> Ghost del vonte © (15.01.13 14:22) [16]
> Свое, написанное собой, гораздо приятнее чужого...
Зачем изобретать новый велосипед? Проще взять старый и немного погнуть ;)
← →
brother © (2013-01-15 16:35) [18]> Зачем изобретать новый велосипед?
ну любит народ все свое)
← →
brother © (2013-01-15 16:35) [19]и чтоб колеса квадратные)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.003 c