ГлавнаяСтатьиПрограммирование → самораспаковывающийся sfx архив используя 7zip и innosetup
самораспаковывающийся sfx архив используя 7zip и innosetup E-mail
User Rating: / 0
PoorBest 
Written by xternalx   
Wednesday, 14 July 2010 21:06

Некоторое время назад мне нужно было одну мою программку, состоящую из нескольких файлов запаковать в один .exe файл. Если бы я пользовался winrar, проблемы бы не возникло, там довольно "гибкая" настройка параметров sfx модуля. Но я давно уже отказался от winrar в пользу 7zip т.к. этот архиватор обеспечивает более сильную степень сжатия, и кроме того, этот архиватор бесплатный и с открытым исходным кодом.

 

На помощь мне пришел замечательный инсталлятор InnoSetup. По правде говоря, можно было обойтись одним только InnoSetup, но мне было лень прописывать инструкции распаковки в temp каждого файла :)) Поэтому при помощи 7zip сделал обычный sfx архив, а при запуске exeшника innosetup, этот инсталлятор распаковывал в temp sfx архив, а потом уже распаковывал в фоне сам sfx архив, и запускал exe-файл программы. В общем, это выглядело так:

 

Готовый вид

Как создавать sfx архив 7zip здесь я описывать не буду, а вот код InnoSetup приведен ниже:

[Setup]
; название программы. Оно нигде не будет отображаться
AppName=Make PPPoE
; версия
AppVerName=Make PPPoE ver 0.2
; куда устанавливать. {pf} - алиас для папки Program Files
; на целевой машине
DefaultDirName={pf}\mkpppoe
; не покаывать диалог создания группы приложения в меню Пуск
DisableProgramGroupPage=yes
; иконка деинсталлятора
UninstallDisplayIcon={app}\Shell.exe
; иконка инсталлятора
SetupIconFile=N002.ico
; где положить скомпиллированный установщик
OutputDir=.
 
; собственно, файл, который необходимо будет запустить после старта инсталлера
[Files]
; исходный файл будет распакован в temp на целевой машине
Source: "mkpppoe.exe"; DestDir: "{tmp}"; Flags: dontcopy  deleteafterinstall

 

[Code]
function InitializeSetup(): Boolean;
var   ErrorCode: Integer;
begin
//распаковать временный файл. это тот самый sfx архив
ExtractTemporaryFile('mkpppoe.exe');
// если архив распаковался
if FileExists(ExpandConstant('{tmp}\mkpppoe.exe')) then
begin
// запускаем его, и сразу говорим куда распаковывать его содержимое
ShellExec('', ExpandConstant('{tmp}\mkpppoe.exe'), ExpandConstant('x -ao -y -o{tmp}\shelltemp'), '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
// запускаем целевую программу, ради которой все затеивалось
ShellExec('', ExpandConstant('{tmp}\shelltemp\shell.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
end
// говорим инсталлятору что нужно завершить работу
Result := FALSE;
end;

 

Вот собственно, и все. Все легко, просто и понятно ;)

Last Updated on Wednesday, 14 July 2010 21:06
 

Add comment


Security code
Refresh