Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
TERMINAL
27-02-2013, 16:24
Gnom_aka_Lexander, Есть архив 90мб, я его распаковал и скомпилировал=на выходе получается размер 240мб, если сжимаю на максимуме зипом, тоже получается 90мб. А режим ультра может ошибки выдавать при распаковке на старых компах?
Gnom_aka_Lexander
27-02-2013, 16:26
TERMINAL, секции Setup и Files покажи тогда.
P.S. Можешь в личку, если опасаешься чего-то. не глядя на эти секции невозможно определить почему у тебя не жмутся файлы.
А режим ультра может ошибки выдавать при распаковке на старых компах? »
Нет,не должен. С чего-бы?
TERMINAL
27-02-2013, 16:49
Gnom_aka_Lexander, спасибо-разобрался.
Прошу мне помочь кое в чём.
Я в установщике использую опцию выбор компонентов.
[Components]
Name: g0; Description: Half - Life 2 Cinematic Mod Models Setup; Types: full custom; Flags: disablenouninstallwarning checkablealone fixed
Name: g0\c8; Description: Установить доп контент и так далее; Types: full custom; Flags: dontinheritcheck
[Files]
Source: "E:\Setup Final ex\addons\MM\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c8
И при компиляции всё благополучно создаётся. Но эти самые компоненты ужимаются стандартными средствами inno setup.
Мне же нужно чтобы при выборе компонента он подхватывался из файла bin(arc) , допустим компонент1.bin и ужимал я его сам.
Дайте мне какой пример. Или обьясните как сделать. »
Johny777
для чтения ини используй сразу вложенность функций Ini := ConvertStringToIniFile(TextFileFromInternetToString('http://tululu.org/txt.php?id=38061'));
PS: в данном случае качается не ини. Это просто пример »
:bow:
insombia
как убрать кнопку отмены isdone чтобы стандартная отвечала за отмену? »
Ты думаешь что автор сделал отдельную кнопку отмены, чтобы потешить своё самолюбие? Типа: -"Раз сделал свою библиотеку, дай-ка и прикручу свою кнопочку"!
Могу предложить альтернативное решение, но при распаковке, при нажатии на кнопку отмена, архивы будут продолжать распаковываться и если пользователь будет долго думать, то архивы уже распакуются :teeth: Проще сделать её точно такую же, как и оригинальная кнопка "Отмена" ибо без неё - будет уже косяк!
Если всё ещё настаиваешь, то можно сделать как-то так (на примере версии ISDone 0.6d):
Убераешь кнопку MyCancelButton
В процедуре: CurStepChanged убераешь: WizardForm.CancelButton.Hide
В процедуре: HideControls убераешь: MyCancelButton.Hide
За место процедуры: CancelButtonOnClick вставляешь это:
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel:=False;
Confirm:=False;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = idYes
then begin
if not ISDoneError then begin
SuspendProc;
Cancel:=True;
end else begin
ISDoneCancel:=1;
ResumeProc;
end;
end;
end; Не говорю что это единственное решение, так как нет предела для совершенства...
cliff99
Я автор популярного (как все утверждают) »
Нет лучше рекламы, чем самореклама! :4u:
Как мне однажды ответили на соседнем форуме: -"Тебе скажи - ты потом сделаешь RePack и будешь всем хвастаться". :tongue: Мне кажется - сейчас как раз тот случай.
:off:
Ну и я в свою очередь, как фанат Half-Life скажу. Этот мод как сказка - чем дальше, тем модели всё страшнее... И у автора (Juergen Vierheilig) явно что-то не в порядке... - сделал из Half-Life какую-то порнуху.
В версии ISFreeArcExtract v.4.1 от Shegorat всё досконально ясно:
[ArcFiles]
Source: {src}\*.bin; DestDir: {app}; Disk: 1;
Source: {src}\Data2.bin; DestDir: {app}\data; Disk: 1; Components: Russian;
Source: {src}\Data3.bin; DestDir: {app}\data2; Disk: 1; Components: English;
Source: {src}\Data4.bin; DestDir: {app}\data3; Disk: 2;
Source: {src}\Data5.bin; DestDir: {app}\data4; Disk: 2; Components: Russian;
Source: {src}\Data6.bin; DestDir: {app}\data5; Disk: 2; Components: Russian;
Source - Name of the archive
DestDir - Destination directory for unpacking archives
Components - Names of components that need for unpacking archive
Tasks - Names of tasks that need for unpacking archive
Disk - Number of the disk that contains the archive
Password - Acrhive password, if archive is encrypted (temporary not supported by unarc.dll)
FilesList - Path to textfile with filenames which need to unpack from archives (temporary not supported by unarc.dll)
Чёрт побери. Я не рекламирую ничего. Я даю понять что на доброе дело пойдёт ваша помощь.
Вот и всё.
Johny777
27-02-2013, 19:42
cliff99, вот тебе пример простой распаковки архива FreeArc в зависимости от выбранных компонентов на этапе ssPostInstall с отображением прогресса распаковки
я просто упростил и немного изменил код из шапки. Надеюсь это то что тебе нужно :)
пример без кнопки отмены
[Setup]
AppName=FreeArc Example
AppVerName=FreeArc Example 3.3
DefaultDirName={pf}\FreeArc Example
OutputDir=.
[Components]
Name: "main"; Description: "Main Files";
Name: "help"; Description: "Help Files";
[Files]
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy
[Code]
const
CP_ACP = 0;
CP_UTF8 = 65001;
function FreeArcExtract (callback: Longword; cmd1, cmd2, cmd3, cmd4, cmd5, cmd6, cmd7, cmd8, cmd9, cmd10: String): integer; external 'FreeArcExtract@files:unarc.dll cdecl';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpDefaultChar: Integer; lpUsedDefaultChar: Integer): Longint; external 'WideCharToMultiByte@kernel32.dll stdcall';
function AnsiToUtf8(const strSource: String): String;
var
WideCharBuf: String;
begin
SetLength( WideCharBuf, Length( strSource + chr(0) ) * 2 );
SetLength( Result, Length( strSource + chr(0) ) * 2 );
MultiByteToWideChar( CP_ACP, 0, strSource + chr(0), -1, WideCharBuf, Length(WideCharBuf) );
WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, Result, Length(Result), 0, 0);
end;
function ArcCallBack(what: PAnsiChar; WriteSize, FileSize: Integer; str: PAnsiChar): Integer;
begin
if (WriteSize <> 0) and (FileSize <> 0) then with WizardForm do
begin
ProgressGauge.Max := FileSize;
ProgressGauge.Position := WriteSize;
StatusLabel.Caption := 'Filesize:' + #32 + IntToStr(FileSize) + #32 + 'MB,' + #32 + 'Extracted:' + #32 + IntToStr(WriteSize) + #32 + 'MB';
end;
Application.ProcessMessages;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
WizardForm.ProgressGauge.Position := 0;
if IsComponentSelected('main') then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('C:\Users\FreeArc\FaT-170.mp4.arc'), '', '', '', '', '');
if IsComponentSelected('help') then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('другой архив'), '', '', '', '', '');
end;
end;
с кнопкой отмены:
[Setup]
AppName=FreeArc Example
AppVerName=FreeArc Example 3.3
DefaultDirName={pf}\FreeArc Example
OutputDir=.
[Components]
Name: "main"; Description: "Main Files";
Name: "help"; Description: "Help Files";
[Files]
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy
[Code]
const
CP_ACP = 0;
CP_UTF8 = 65001;
var
CancelCode: Integer;
function FreeArcExtract (callback: Longword; cmd1, cmd2, cmd3, cmd4, cmd5, cmd6, cmd7, cmd8, cmd9, cmd10: String): integer; external 'FreeArcExtract@files:unarc.dll cdecl';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpDefaultChar: Integer; lpUsedDefaultChar: Integer): Longint; external 'WideCharToMultiByte@kernel32.dll stdcall';
function AnsiToUtf8(const strSource: String): String;
var
WideCharBuf: String;
begin
SetLength( WideCharBuf, Length( strSource + chr(0) ) * 2 );
SetLength( Result, Length( strSource + chr(0) ) * 2 );
MultiByteToWideChar( CP_ACP, 0, strSource + chr(0), -1, WideCharBuf, Length(WideCharBuf) );
WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, Result, Length(Result), 0, 0);
end;
function ArcCallBack(what: PAnsiChar; WriteSize, FileSize: Integer; str: PAnsiChar): Integer;
begin
if (WriteSize <> 0) and (FileSize <> 0) then with WizardForm do
begin
ProgressGauge.Max := FileSize;
ProgressGauge.Position := WriteSize;
StatusLabel.Caption := 'Filesize:' + #32 + IntToStr(FileSize) + #32 + 'MB,' + #32 + 'Extracted:' + #32 + IntToStr(WriteSize) + #32 + 'MB';
end;
Application.ProcessMessages;
Result:= CancelCode;
end;
procedure CancelFreeArcextracting(Sedner: TObject);
begin
CancelCode := -127;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
WizardForm.ProgressGauge.Position := 0;
with TButton.Create(nil) do
begin
Parent := WizardForm.InstallingPage;
Caption := SetupMessage(msgButtonCancel);
SetBounds(ScaleX(100), ScaleY(100), ScaleX(75), ScaleY(25));
OnClick := @CancelFreeArcextracting;
end;
if IsComponentSelected('main') and (CancelCode <> -127) then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('C:\Users\Âîâà\Desktop\FreeArc\FaT-170.mp4.arc'), '', '', '', '', '');
if IsComponentSelected('help') and (CancelCode <> -127) then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('äðóãîé àðõèâ'), '', '', '', '', '');
end;
end;
теперь из-за тебя я знаю немного фриарк модуль. Спасибо! :)
библиотеку найдёшь тут http://freearc.org/download/InnoSetup/FreeArc4InnoSetup3_5.zip
Johny777,
Спасибо. Библиотека у меня уже встроена и настроена.
Теперь просто компоненты привяжу.
Мне нужны были эти строки.
Name: "main"; Description: "Main Files"; Name: "help"; Description: "Help Files"; и if IsComponentSelected('main') then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('C:\Users\FreeArc\FaT-170.mp4.arc'), '', '', '', '', ''); if IsComponentSelected('help') then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('другой архив'), '', '', '', '', '');
insombia
27-02-2013, 21:37
Вот решил поделится своим скриптом,все кто хочет можете качать,скрипт без каких либо наворотов с подсказками в коде для новичков
http://i54.fastpic.ru/thumb/2013/0228/bc/6331cf79ee4ceaea16916fa55f21f4bc.jpeg (http://fastpic.ru/view/54/2013/0228/6331cf79ee4ceaea16916fa55f21f4bc.jpg.html) http://i53.fastpic.ru/thumb/2013/0228/c1/22882b9b9af11e06e76bd249f336f4c1.jpeg (http://fastpic.ru/view/53/2013/0228/22882b9b9af11e06e76bd249f336f4c1.jpg.html) http://i54.fastpic.ru/thumb/2013/0228/10/3304584494edca148626db5bd84dcb10.jpeg (http://fastpic.ru/view/54/2013/0228/3304584494edca148626db5bd84dcb10.jpg.html) http://i54.fastpic.ru/thumb/2013/0228/f1/47ede4a7a9b367c1afffaa9a5057d3f1.jpeg (http://fastpic.ru/view/54/2013/0228/47ede4a7a9b367c1afffaa9a5057d3f1.jpg.html)
cкрипт (http://rghost.ru/44180567)
P.S. большое спасибо Rikill/Wr0ng1eR за помощь
Обновил скрипт добавил текстурированные кнопки,музыку и на всякий случай srep самый новый
вот тебе пример простой распаковки архива FreeArc в зависимости от выбранных компонентов на этапе ssPostInstall с отображением прогресса распаковки
я просто упростил и немного изменил код из шапки. Надеюсь это то что тебе нужно »
Спасибо за помощь огромное.
Johny777,
Я похоже рано обрадовался. Я сколько мучаюсь, но так и не могу подключить свой arc архив к твоим примерам.
Он мои архивы просто не подхватывает.
Мне нужно, чтобы при выборе компонента main/ Распаковывался соответственно архив main.arc лежащий в корне.
\\\
setup.exe
main.arc -------
data.bin
Johny777
28-02-2013, 04:26
cliff99,
Он мои архивы просто не подхватывает. »
не проблема, используй: AnsiToUtf8(AddBackslash(ExpandConstant('{src}')) + 'main.arc')
константа {src} - путь к "рядом с экзешником инсталла"
Спасибо за помощь огромное. »
для этого есть кнопка "Полезное сообщение" под каждым сообщением :)
GoshaPolo
28-02-2013, 12:45
Вот решил поделится своим скриптом,все кто хочет можете качать,скрипт без каких либо наворотов с подсказками в коде для новичков »
Спасибо, интересно посмотреть готовое решение. Только вот вопрос совсем уж новичка, который никогда не сталкивался с распаковкой архивов. Как добавить архив для распаковки?
Gnom_aka_Lexander
28-02-2013, 13:53
За место процедуры: CancelButtonOnClick вставляешь это: »
Если открыть справку, которая идет к библиотеке, то там про функцию SuspendProc тоже написано. Она как раз-таки приостанавливает текущий поток распаковки или выполнения программы. Все что нужно в вашем примере - перенести ее в самое начало. Ну и переменную CurPage обязательно задействовать, во избежании ошибки. Тоесть как-то так это будет:
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then
begin
Cancel:=False;
Confirm:=False;
SuspendProc;
if ExitSetupMsgBox then ISDoneCancel:=1;
ResumeProc;
end;
end;Cancel:=True; в данном случае так делать нельзя, ибо при отмене должно выполнится удаление того, что успело распаковаться. А этого не произойдет, если провести полную отмену.
insombia
28-02-2013, 13:54
GoshaPolo в справке к исдону все есть но вот пример,в файле isdone.iss найди строку
if not ISArcExtract ( 0, 00, ExpandConstant('{src}\data.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
выделеное жирным это файл который нужно распаковать
Gnom_aka_Lexander не мог бы ты пожалуйста в тот скрипт что я выложил это вставить?
Gnom_aka_Lexander
28-02-2013, 14:08
insombia, ты и сам это можешь. удалить все,что связано с кастомной кнопкой отмены и вставить этот код отмены. ничего сложного, я принципиально в чужих скриптах не ковыряюсь, с некоторого времени, уж больно это вас расслабляет: "а, там есть тот, кто за меня сделает все, можно самому и не париться с этой ересью типа справок, шапки форума и гугла".
P.S. ради интереса глянул. Действительно, разобраться там -целое дело. В таком точно ковыряться не буду.
Gnom_aka_Lexander
28-02-2013, 16:14
используй встроенную функцию IsWin64. она, собственно, именно для того и предназначена, чтоб проверять битность системы.
habib2302, как вариант:
[Code]
begin
if Is64BitInstallMode then
MsgBox('Installing in 64-bit mode', mbInformation, MB_OK)
else
MsgBox('Installing in 32-bit mode', mbInformation, MB_OK);
end;
Gnom_aka_Lexander
28-02-2013, 17:02
alert30, Ты неправ. если заглянешь в справку,то увидишь, что Is64BitInstallMode определяет именно тип установки а не битность системы. Битность системы определяет только IsWin64.
Gnom_aka_Lexander
28-02-2013, 17:15
habib2302, смотря что тебе нужно. хотя в обоих секциях-и в [Run] и в [Files] есть параметр Check. Соответственно,то что на х32 нужно,там ставишь Check: not IsWin64,где нужно х64,там Check: IsWin64 Логично-же? в коде,соответственно -
if IsWin64 then
// тут действие,если х64 система
else
// тут действие если х32 система
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.