Ветеран
Сообщения: 1133
Благодарности: 581
|
Профиль
|
Отправить PM
| Цитировать
Цитата A1EXXX:
у меня последняя от Restools. »
|
Написал на основе .dll'ки, т.к. при частом запуске cmd для проверки процесса, не всегда удаётся нажать на кнопку Отмена в момент распаковки.
Пример
Код: 
#define MyAppName "Test"
#define MyAppVerName "Test"
#define MyAppExeName "Test.exe"
[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
DirExistsWarning=no
;DisableReadyPage=true
ShowLanguageDialog=auto
OutputBaseFilename=setup
OutputDir=.
UninstallDisplayIcon={app}\{#MyAppExeName}
DefaultGroupName={#MyAppName}
InternalCompressLevel=none
Compression=none
[UninstallDelete]
Name: {app}; Type: filesandordirs
[Languages]
Name: eng; MessagesFile: compiler:Default.isl
Name: rus; MessagesFile: compiler:Languages\Russian.isl
[Files]
; измените на своё место расположение dll'ки, у меня она расположена
; C:\Program Files\Inno Setup 5\Libraries\*
Source: C:\Program Files\Inno Setup 5\Libraries\ISTask.dll; Flags: dontcopy
Source: C:\Program Files\FreeArc\bin\Arc.exe; Flags: dontcopy
[CustomMessages]
ExtrError=Произошла ошибка во время извлечения данных. Установка будет прервана.
[Code]
function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload setuponly';
function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload setuponly';
// запускает указанный файл, с параметрами указанными в CmdShow
function WinExec(lpCmdLine: PChar; uCmdShow: Cardinal): Cardinal;
external 'WinExec@kernel32.dll stdcall';
var
SecondProgressBar: TNewProgressBar;
ExtractAllArc: Boolean;
procedure InitializeWizard();
begin
WizardForm.FileNameLabel.Hide;
WizardForm.StatusLabel.Top:=ScaleY(81);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.StatusLabel.Width:=ScaleX(262);
WizardForm.ProgressGauge.Top:=ScaleY(100);
WizardForm.ProgressGauge.Left:=ScaleX(155);
WizardForm.ProgressGauge.Width:=ScaleX(262);
SecondProgressBar := TNewProgressBar.Create(WizardForm);
with SecondProgressBar do
begin
Parent := WizardForm.InstallingPage;
Left := ScaleX(0);
Top := ScaleY(100);
Width := ScaleX(150);
Height := ScaleY(21);
Min := 0;
Max := 13; //задается как (кол-во распаковываемых архивов * 3) + 1
end;
end;
procedure WaitProgUntilTerminated;
var
i: Integer;
begin
// проверим запустился ли файл, если нет, то
if not RunTaskA('Arc.exe', False) then
for i:= 0 to 500 do
// подождём пока файл запустится
if not RunTaskA('Arc.exe', False) then
begin
Sleep(10); // ждём максимум 5 сек.
Application.ProcessMessages;
end
else Break;
// если запущен, то ждём завершения
while RunTaskA('Arc.exe', False) do
begin
Sleep(10);
Application.ProcessMessages;
end;
end;
procedure PlsInsertNextDisk(num: Integer; CheckedFile: string);
var
Capt: string;
begin
CheckedFile:= ExpandConstant(CheckedFile);
if not FileExists(CheckedFile) then
begin
Capt:= 'Пожалуйста, вставьте диск %n, содержащий файл %f и нажмите ОК для продолжения установки.';
StringChange(Capt, '%n', inttostr(num));
StringChange(Capt, '%f', ExtractFileName(CheckedFile));
MsgBox(Capt, mbInformation, MB_OK);
PlsInsertNextDisk(num, CheckedFile);
end;
end;
procedure ExtractArc(arcArchName, arcDestDir:string);
var
ResultCode: Integer;
begin
WizardForm.StatusLabel.Caption:= SetupMessage(msgStatusExtractFiles);
// запускаем файл
ResultCode:= WinExec(AddQuotes(ExpandConstant('{tmp}\arc.exe')) + ' x ' +
AddQuotes(ExpandConstant(arcArchName)) + ' -y -dp' +
AddQuotes(ExpandConstant(arcDestDir)), SW_HIDE);
if (ResultCode < 33) then
begin
MsgBox(ExpandConstant('{cm:ExtrError}'), mbCriticalError, MB_OK);
SecondProgressBar.Hide;
if RunTaskA('Arc.exe', False) then KillTaskA('Arc.exe');
DelTree(ExpandConstant('{app}'), True, True, True);
Abort;
end
else
begin
SecondProgressBar.Position:= SecondProgressBar.Position + 3;
WaitProgUntilTerminated;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption:= SetupMessage(msgStatusExtractFiles);
ExtractTemporaryFile('arc.exe');
SecondProgressBar.Position:= SecondProgressBar.Position + 1;
ExtractArc('{src}\Project.arc','{app}');
ExtractArc('{src}\data-2.arc','{app}');
PlsInsertNextDisk(2, '{src}\data-3.arc'); //если data4.arc не найден в корне диска, просим второй диск
ExtractArc('{src}\data-3.arc','{app}');
ExtractArc('{src}\data-4.arc','{app}');
PlsInsertNextDisk(1, '{src}\data-1.arc'); //снова просим первый диск
ExtractAllArc:= True; // сообщим, что все архивы распаковали
end;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then
if ExtractAllArc then
Cancel:= True
else
if ExitSetupMsgBox then
begin
if RunTaskA('Arc.exe', False) then KillTaskA('Arc.exe');
DelTree(ExpandConstant('{app}'), True, True, True);
KillTaskA(ChangeFileExt(ExtractFileName(ParamStr(0)), '.tmp'));
end
else
Cancel:= False;
end;
|
-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.
Последний раз редактировалось Serega, 24-11-2009 в 22:50.
Причина: орфография
Отправлено: 22:33, 24-11-2009
| #488
|