Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.10.06;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
2-1358348219
lordalexander
2013-01-16 18:56
2013.10.06
Сровнение Мемо


15-1367129093
Neuro System
2013-04-28 10:04
2013.10.06
Помогите решить академические задачи


2-1358407010
Cobalt
2013-01-17 11:16
2013.10.06
Почему компилируется?


2-1358417243
Pcrepair
2013-01-17 14:07
2013.10.06
Замена указателей на Локал.Перем при работе функции в потоке


2-1358524343
Proshka
2013-01-18 19:52
2013.10.06
Строки после обновления