Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.004 c
2-1358365235
lordalexander
2013-01-16 23:40
2013.10.06
не могу понять почему ошибка


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


15-1355480016
azlk52
2012-12-14 14:13
2013.10.06
Запрет приложение вконтакте


15-1366807381
O'ShinW
2013-04-24 16:43
2013.10.06
Способности человека. Летучая мышь / Смерш


6-1269679629
syserg
2010-03-27 11:47
2013.10.06
Получить список имен файлов на сайте





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский