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

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

SFX


Ghost del vonte ©   (2013-01-11 07:19:00) 

Доброго времени суток всем!

Господа, прошу помощи... и вот по какому делу:

Как в exe заготовку вшить таблицу архива?
Я не стал заморачиваться над склейкой таблицы и самого архива в один файл, писал исключительно для себя, поэтому мне лишний файл таблицы не мешает... появилась острая необходимость в sfx, сам архиватор таскать все время не охота... всю голову уже сломал, вся надежда на вас...

Великий Гугл, предложил мне три варианта:

1) Таблицу конвертнуть в ресурсный файл! собственно это и есть сам вопрос, как вшить его?

2) Таблицу преобразовать в массив и записать в пас файл, тогда как пас файл затолкать а exe? :)

3) Открыть заготовку в потоке, поставить указатель в конец, и дописать туда саму таблицу... опять же, как поставить указатель на начало таблицы?

Остался самый простой и радикальный метод: создать распаковщик,
который будет идти один ко всем архивам, вроде так проще всего,
но мне интересен сам процесс, ведь как-то создают другие sfx, а также
слайд шоу, и т.п...

Вы скажите мне хотя бы какие функции надо юзать, а там я уж сам
попытаюсь разобраться, с помощью гугла разумеется!

Всем спасибо за ответы!


brother   (2013-01-15 16:35:00) [1]

и чтоб колеса квадратные)


brother   (2013-01-15 16:35:00) [2]

> Зачем изобретать новый велосипед?

ну любит народ все свое)


Rouse_   (2013-01-15 15:34:00) [3]


> Ghost del vonte ©   (15.01.13 14:22) [16]
> Свое, написанное собой, гораздо приятнее чужого...

Зачем изобретать новый велосипед? Проще взять старый и немного погнуть ;)


Ghost del vonte   (2013-01-15 14:22:00) [4]


> icWasya ©   (14.01.13 13:03) [14]


Спасибо, погляжу... идея мне нравится!


> Rouse_ ©   (14.01.13 16:22) [15]


Свое, написанное собой, гораздо приятнее чужого...
Архиватор предназначен для фото, звуков, текстов, и заточен именно под этот тип файлов, хоть поддерживает и все остальные... его суть: отображать содержимое архива так, как отображают изображения программы для просмотра изображений)) Ну и помимо этого еще куча всего...

Всем спасибо!


Rouse_   (2013-01-14 16:22:00) [5]


> 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 модуль, насколько я помню, можно использовать свободно без нарушения лицензий.


icWasya   (2013-01-14 13:03:00) [6]

Прочитать структуру заголовка исполняемого файла. В примерах с Дельфи вроде должен быть проект, читающий ресурсы. Где-то в  недрах заголовка находится информация об размере файла. Всё что дальше - это будет ваша таблица.


Ghost del vonte   (2013-01-13 07:19:00) [7]


> А ну так это-ж не архив. Возьми все это и запакуй в ZIP
> - будет архив.


Как не архив? Ладно, объясню поподробнее:

У меня свой тип архива, архиватор создает архив в двух файлах,
в одном сжатые файлы (пока zlib, скачал с сайта 7z исходники LZMA - изучаю),
а во втором таблица, в которой указаны позиции файлов в архиве, их размеры, имена, папки...

появилась необходимость в SFX... архиватор упаковывает папку в архив,
извлекает заготовку, и в нее нужно вшить таблицу...

так вот как вшить то ее?

Я думаю два варианта:

1) Дописывать в конец заготовки таблицу, как поставить потом указатель на нее?
2) таблицу конвертировать в ресурсный файл (это я умею), и вшить ресурсный файл в уже скомпилированную заготовку, как это делает Resource Hacker...

Подскажите, как можно осуществить это?


Rouse_   (2013-01-12 15:46:00) [8]


> Таблица - файл, в котором описаны имена файлов, их позиции
> в архиве, их размеры...

А ну так это-ж не архив. Возьми все это и запакуй в ZIP - будет архив.


Ghost del vonte   (2013-01-12 04:31:00) [9]


> Rouse_ ©   (12.01.13 02:20) [10]


Таблица - файл, в котором описаны имена файлов, их позиции в архиве, их размеры... тоесть, при создании архива, у меня в один поток сжимаются необходимые файлы, а в другом заносится информация, об их размерах, позиции, имена... вот мне необходимо в заготовку вшить такую таблицу...


Rouse_   (2013-01-12 02:20:00) [10]


> Нет, я хочу только таблицу вшить...

Что такое в твоем понятии таблица?


Ghost del vonte   (2013-01-12 01:58:00) [11]


> icWasya


Спасибо! Значит, третий вариант таки актуален...
Нет, я хочу только таблицу вшить... итак, я открываю заготовку в потоке,
дописываю в конец потока таблицу, а как потом, открыв "себя", найти указатель на нее? Можете поподробнее? Я просто любитель, для себя пишу...

И, речь идет о своем архиваторе, написанным собой, для себя же...

Всем откликнувшимся глубокая благодарность!


Rouse_   (2013-01-11 18:47:00) [12]


> icWasya ©   (11.01.13 16:33) [7]

для SFX писать размеры оверлея не надо, ибо эти данные уже содержатся внутри архива. Т.е. банально пишем тело распаковщика (который самостоятельно выходит на позицию оверлея, зная размер SFX стаба) и сразу за ним тело архива - профит.


icWasya   (2013-01-11 16:33:00) [13]

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, а затем загрузить из него картинку.
Или создать файл, и скопировать часть потока туда.
Для архивов - поищи компоненты для работы с ними. в инете полно даже с исходниками.
Удачи


QAZ10   (2013-01-11 15:34:00) [14]


> Ghost del vonte ©   (11.01.13 10:48) [3]

а чем винраровский сфх не устраивает ?


Rouse_   (2013-01-11 13:54:00) [15]

SFX, это обычный экзешник, к которому оверлеем дописывается тело архива, который он должен распаковать.
Что такое "таблица архива" и зачем ее совать в ресурсы - мне не понятно.


RWolf   (2013-01-11 13:24:00) [16]

Restorator.


Ghost del vonte   (2013-01-11 10:48:00) [17]

Нет, я возможно не так описал...

Вшить надо в уже скомпилированный EXEшник, тоесть я таблицу конвертирую в ресурсный файл, этот файл надо вшить в заготовку... а заготовка уже запрограммирована на открытие таблицы и распаковки архива...


O'ShinW   (2013-01-11 08:48:00) [18]

Как вшиваю исходники в программу, дабы не потерялись

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


MBo   (2013-01-11 08:09:00) [19]

создать текстовый файл с расширением .rc и вписать в него строчку наподобие:

MY_MUSIC RT_RCDATA "a.mp3"

По порядку - название ресурса, тип ресурса, имя файла

Извлечение (один из способов):

Res := TResourceStream.Create(hInstance, 'MY_MUSIC', PСhar('RT_RCDATA'));


Наверх

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