Показать полную графическую версию : [архив] Скрипты Inno Setup. Помощь и советы [часть 2]
semiono, на все вопросы
сначала читаем хэлп, потом пишем код
есть еще вариант, к сожалению наиболее часто используемый, тупо копируем чужой код и не вникаем
ЗЫ в хэлпе есть ответы процентов на 60 вопросов. на твой
И чем отличается Exec() от ShellExec() »
в том числе. с примерами использования
Из хелпа
Example:
var
ResultCode: Integer;
begin
// Launch Notepad and wait for it to terminate
if Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode) then
begin
// handle success if necessary; ResultCode contains the exit code
end
else begin
// handle failure if necessary; ResultCode contains the error code
end;
end;
begin
// мне было бы понятнее и достаточным так -
Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
// и всё!!! Но бывает что это тоже не работает, а я паскаль не знаю к сожалению.
end;
А такое меня обычно вообще в ступор приводит :)
function ShellExec(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean;
Если взять современный ассемблер, то все эти безумные типы на паскаль приводяться лишь к dd dw db ;- а классов вообще нет ))))
Ответ знаю, надо учиться!
И чем отличается Exec() от ShellExec(), первый я так и не смог использовать »
Exec - запускает исполняемый файл
ShellExec используется для запуска не исполняемого файла (не .exe и не .bat файла) (например открыть файл readMe.txt)
function Exec (const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
Описание:
Выполняет указанные исполняемые файлы. Параметр Wait указывает, возвратить значение функции немедленно или подождать, пока запущенный процесс завершится или освободится. Возвращает True если выполнение файла прошло успешно, иначе False. Если возвращено True и Wait=ewWaitUntilTerminated, то ResultCode возвращает код выхода для процесса. Если возвращено False, ResultCode выдает ошибку. Используй SysErrorMessage(ResultCode) для получения описания ошики.
function ShellExec (const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean;
Описание:
Открывает указанный файл или выполняет другое действие, указанное в Verb. В Filename может быть указан документ или папка. Параметр Wait указывает, возвратить значение функции немедленно или подождать, пока запущенный процесс завершится или освободится. Возвращает True, если файл открыт успешно, иначе False. Если возвращено False, ErrorCode выдаст ошибку. Используй SysErrorMessage(ErrorCode) для получения описания ошики.
Я пожалуй всё написал! Наверное без логических ошибок.
[Kode]
procedure InitializeWizard();
begin
try DeleteFile(ExpandConstant('{sd}\dopuslib.tmp'))
except Exit; end;
end;
procedure CurPageChanged(CurPageID: Integer);
var
ResultCode: Integer;
begin
ExtractTemporaryFile('pkill.exe');
if CurPageID = wpReady then
begin
Exec(ExpandConstant('{tmp}\pkill.exe'), 'dopus.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
Exec(ExpandConstant('{tmp}\pkill.exe'), 'dopusrt.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
if FileExists(ExpandConstant('{reg:HKLM32\Software\VST,Proton.bin|{pf}}\DOpus\dopuslib.dll')) then
try
RenameFile(ExpandConstant('{reg:HKLM32\Software\VST,Proton.bin|{pf}}\DOpus\dopuslib.dll'), ExpandConstant('{sd}\dopuslib.tmp'))
except Exit; end;
try
DelTree(ExpandConstant('{reg:HKLM32\Software\VST,Proton.bin|{pf}}\DOpus'), False, True, True);
except
Beep; Beep; Exit; end; end;
end;
procedure DeinitializeSetup();
...
Хотя я бы хотел ещё циклы подключить, вообще не знаю как это зделать.
Например, чтобы троекратно запустить
Exec(ExpandConstant('{tmp}\pkill.exe'), 'dopus.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
но при этом не писать три раза эту строку.
Или например вызвать эту строку после такого кода -
RenameFile(ExpandConstant('{reg:HKLM32\Software\VST,Proton.bin|{pf}}\DOpus\dopuslib.dll'), ExpandConstant('{sd}\dopuslib.tmp'))
except
Для усиления работы. Или задержки при выполнении практически невозможны? Я имею ввиду, что если
файл должен быть переименован, то это выполниться безкомпрописно?
Я даже на autoit подстраховывался, хотя так никто не делает, но для скриптов это возможно оправдано -
WinWait()
WinWait()
WinWait()
Send()
:) ?
Ещё по существу, можно ли отпралять файл в корзину?
RenameFile(ExpandConstant('{pf}\DOpus\dopuslib.dll'), ExpandConstant('{sd}\Recycled\dopuslib.tmp'))
Или это заглючит? Причём тут лучше бы переменная была {Recycled} иначе для NTFS не валидно!
brodovski
15-03-2010, 10:19
здравствуйте у меня такая проблема "#ifdef UNICODE ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup " вообще незнаю что уже делать,и другие версии Inno Setup ставил,это скрипт для разархивирования FreeArc,помогите пожалуйста(((
alex2010
15-03-2010, 16:00
вот код на цвет изменения цвета инстала:
[code_]
procedure InitializeWizard();
begin
WizardForm.Font.Color:=Clgreen;
WizardForm.WelcomeLabel1.Font.Color:=ClRed;
WizardForm.FinishedHeadingLabel.Font.Color:=ClRed;
WizardForm.PageNameLabel.Font.Color:=ClRed;
end;
но "Доступно места на диске" не меняется:
http://10pix.ru/img1/3993/998796.th.jpg (http://10pix.ru/view/3993/998796/)
может стоит еще что-нибудь дописать, чтобы цвет изменился?
вот код на цвет изменения цвета инстала: »
Ну так этот код для стандартных элементов инсталла, а у вас создан кастомный.
Измените цвет текста этого лейбла и все (FreeSpaceLabel:= TLabel.Create(WizardForm))
alex2010
15-03-2010, 19:03
YURSHAT, спасибо. только я все равно не понял где это прописывать :), но просмотрел код "подсчет свободного места на ЖД"
и увидел там:
begin
SelectDirText_1.Font.Color:= ClBlack;. изменил black на green и все стало как надо
Мне недавно понадобилось найти в файле нужный параметр и дописать к нему своё значение. »
Спасибо! Как можно этот код использовать вызывая его многократно!!?
Например, грубо говоря я читаю реестр
$1 = RegRead(HKLM\Software\Classes\exefile\DefaultIcon)
$2 = RegRead(HKLM\Software\Classes\dllfile\DefaultIcon)
$3 = RegRead(HKLM\Software\Classes\sysfile\DefaultIcon)
(пишу наугад, на синтаксис не обращайте внимание)
Как мне эти переменные $(1,2,3) поочерёдно вписывать в файл с заменой,
найти A и заменить на $1, найти B и заменить на $2...
То-есть условие поиска должно изменятся разумеется...
Но ведь весь код поиска для этого глупо переписывать, особенно если переменных штук десять и более.
??? Очень хотелось бы такой код поглядеть! Это было бы ещё полезнее для пользования.
И пожалуйста полный пример напишите вместе с RegRead() кодом корректно?
Процедура может быть DeInitializate Install ~ в конце кароче установки...
?!
Chelluga
15-03-2010, 23:46
Здравствуй народ.
Кто знает, где найти такую тему (см. вложение)?
alex2010
16-03-2010, 01:07
что нужно подправить в скрипте, чтоб при выборе "создать ярлык на рабочем столе" создавались ярлыки?
СКРИПТ НИЖЕ
с созданием ярлыков на рабочем столе разобрался:
косяк в том, если даже поставить галку на создание ярлыков на раб. столе и в след. меню("меню папки пуск") убрать галку с "не создавать ярлыки в меню пуск", то ярлыки не создадутся ни в меню пуск, ни на рабочем столе. почему так?
mariolast
16-03-2010, 23:41
Подскажите пример скриптика, который бы при выборе Удаления программы вызывал бы окошко с чекбоксами,в которых можно проставлять галочки напротив компонентов или файлов, которые нужно удалить или выполнить программу какую то после нажатия кнопки Далее.
И еще подспутно поинтересуюсь, кто то пробовал обьединить скрипты по разпаковке Фриарк и 7z файлов?
alex2010,
будут создаваться только те ярлыки, которые можно выбрать через Tasks.. как то так.
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Icons]
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
в этом случае можно создавать ярлыки через секцию [Сode]
Здравствуйте! Подскажите, пожалуйста, простейший пример переименования файла в папке назначения? Я так понял, это делается с помощью функции RenameFile, но как?
function RenameFile(const OldName, NewName: string): Boolean;
Habetdin
18-03-2010, 14:42
nik1967, пример, переименование файла main.dll в backup.dll после установки:
[code]
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpFinished then
if FileExists(ExpandConstant('{app}\main.dll')) then
RenameFile(ExpandConstant('{app}\main.dll'), ExpandConstant('{app}\backup.dll'));
end;
Habetdin, спасибо большое :good:! Чуть-чуть переделал:
[_code]
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then
begin
if FileExists(ExpandConstant('{app}\main.dll')) then
RenameFile(ExpandConstant('{app}\main.dll'), ExpandConstant('{app}\name.dll'))
end;
а то ошибку выдавало.
alex2010
18-03-2010, 19:52
подскажите код, чтоб было вот так:
http://10pix.ru/img1/780811/1019268.th.jpg (http://10pix.ru/view/780811/1019268/)
или почему это не работает в моем скрипте?(см. 6 постов выше)
или почему это не работает в моем скрипте?(см. 6 постов выше) »
Посмотрите мой оригинальный скрипт Need for Speed™ Undercover+ FreeArc (http://forum.ru-board.com/topic.cgi?forum=5&topic=31936&start=2172)
alex2010
18-03-2010, 22:01
YURSHAT,в твоем скрипте работает.
скопировал код с твоего скрипта:
//************************************************ [Начало - FreeArc] ***************************************************//
type
#ifdef UNICODE ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
#define A "W"
#else
#define A "A" ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
PAnsiChar = PChar; // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже)
#endif
#if Ver < 84018176
AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif
TMyMsg = record
hwnd: HWND;
message: UINT;
wParam: Longint;
lParam: Longint;
time: DWORD;
pt: TPoint;
end;
TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
TArc = record Path: string; OrigSize: Integer; Size: Extended; end;
var
FileNamelbl, ExtractFile: TLabel;
lblExtractFileName: TLabel;
CancelCode, n, UnPackError, StartInstall: Integer;
Arcs: array of TArc;
msgError: string;
lastMb: Integer;
baseMb: Integer;
totalUncompressedSize: Integer; // total uncompressed size of archive data in mb
LastTimerEvent: DWORD;
Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';
function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';
Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';
function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';
procedure AppProcessMessage;
var
Msg: TMyMsg;
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;
Function Size64(Hi, Lo: Integer): Extended;
Begin
Result:= Lo;
if Lo<0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
for Hi:= Hi-1 Downto 0 do
Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
End;
// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировку
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
nRet : longint;
begin
SetLength( Result, Length( strSource ) );
nRet:= OemToChar( strSource, Result );
end;
// Converts ANSI encoded string into UTF-8
// Преобразует строку из ANSI в UTF-8 кодировку
function AnsiToUtf8( strSource: string ): string;
var
nRet : integer;
WideCharBuf: string;
MultiByteBuf: string;
begin
strSource:= strSource + chr(0);
SetLength( WideCharBuf, Length( strSource ) * 2 );
SetLength( MultiByteBuf, Length( strSource ) * 2 );
nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);
Result:= MultiByteBuf;
end;
// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
CancelCode:= -127;
end;
var origsize: Integer;
// The callback function for getting info about FreeArc archive
function FreeArcInfoCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
begin
if string(what)='origsize' then origsize := Mb else
if string(what)='compsize' then else
if string(what)='total_files' then else
Result:= CancelCode;
end;
// Returns decompressed size of files in archive
function ArchiveOrigSize(arcname: string): Integer;
var
callback: longword;
Begin
callback:= WrapFreeArcCallback(@FreeArcInfoCallback,4); //FreeArcInfoCallback has 4 arguments
CancelCode:= 0;
AppProcessMessage;
try
// Pass the specified arguments to 'unarc.dll'
Result:= FreeArcExtract (callback, 'l', '--', AnsiToUtf8(arcname), '', '', '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
if Result >= 0 then Result:= origsize;
except
Result:= -63; // ArcFail
end;
end;
// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
FSR: TFindRec;
Begin
Result:= 0;
if FindFirst(ExpandConstant(dir), FSR) then begin
try
repeat
// Skip everything but the folders
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
n:= GetArrayLength(Arcs);
// Expand the folder list
SetArrayLength(Arcs, n +1);
Arcs[n].Path:= ExtractFilePath(ExpandConstant(dir)) + FSR.Name;
Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
Result:= Result + Arcs[n].Size;
Arcs[n].OrigSize := ArchiveOrigSize(Arcs[n].Path)
totalUncompressedSize := totalUncompressedSize + Arcs[n].OrigSize
until not FindNext(FSR);
finally
FindClose(FSR);
end;
end;
End;
// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;
// Converts milliseconds to human-readable time
// Конвертирует милисекунды в человеко-читаемое изображение времени
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
if detail {hh:mm:ss format} then
Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
else if Ticks/3600 >= 1000 {more than hour} then
Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
else if Ticks/60 >= 1000 {1..60 minutes} then
Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
else Result:= IntToStr(Ticks/1000) +s {less than one minute}
End;
// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
percents, Remaining: Integer;
s: String;
begin
if GetTickCount - LastTimerEvent > 1000 then begin
// This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
// ....
// End of code executed by timer
LastTimerEvent := LastTimerEvent+1000;
end;
if string(what)='filename' then begin
// Update FileName label
lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
end else if (string(what)='write') and (totalUncompressedSize>0) and (Mb>lastMb) then begin
// Assign to Mb *total* amount of data extracted to the moment from all archives
lastMb := Mb;
Mb := baseMb+Mb;
// Update progress bar
WizardForm.ProgressGauge.Position:= Mb;
// Show how much megabytes/archives were processed up to the moment
percents:= (Mb*1000) div totalUncompressedSize;
s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalUncompressedSize)]);
if GetArrayLength(Arcs)>1 then
s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))])
ExtractFile.Caption := s
// Calculate and show current percents
percents:= (Mb*1000) div totalUncompressedSize;
s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalUncompressedSize - Mb)/Mb)) else Remaining:= 0;
if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
s:= s + '. '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
end;
FileNameLbl.Caption := s
end;
AppProcessMessage;
Result:= CancelCode;
end;
// Extracts all found archives
function UnPack(Archives: string): Integer;
var
totalCompressedSize: Extended;
callback: longword;
FreeMB, TotalMB: Cardinal;
begin
// Display 'Extracting FreeArc archive'
lblExtractFileName.Caption:= '';
lblExtractFileName.Show;
ExtractFile.caption:= cm('ArcTitle');
ExtractFile.Show;
FileNamelbl.Caption:= '';
FileNamelbl.Show;
// Show the 'Cancel unpacking' button and set it as default button
btnCancelUnpacking.Caption:= WizardForm.CancelButton.Caption;
btnCancelUnpacking.Show;
LoadButtonImage(btnCancelUnpacking,bidbtnCancelUnpacking);
ButtonLabel[bidbtnCancelUnpacking].Left := ButtonPanel[bidbtnCancelUnpacking].Width div 2 - ButtonLabel[bidbtnCancelUnpacking].Width div 2;
ButtonLabel[bidbtnCancelUnpacking].Top := ButtonPanel[bidbtnCancelUnpacking].Height div 2 - ButtonLabel[bidbtnCancelUnpacking].Height div 2;
WizardForm.ActiveControl:= btnCancelUnpacking;
WizardForm.ProgressGauge.Position:= 0;
// Get the size of all archives
totalUncompressedSize := 0;
totalCompressedSize := FindArcs(Archives);
WizardForm.ProgressGauge.Max:= totalUncompressedSize;
// Other initializations
callback:= WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4 arguments
StartInstall:= GetTickCount; {время начала распаковки}
LastTimerEvent:= GetTickCount;
baseMb:= 0
for n:= 0 to GetArrayLength(Arcs) -1 do
begin
lastMb := 0
CancelCode:= 0;
AppProcessMessage;
try
// Pass the specified arguments to 'unarc.dll'
Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
except
Result:= -63; // ArcFail
end;
baseMb:= baseMb+lastMb
// Error occured
if Result <> 0 then
begin
msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
case Result of
-1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
-127: msgError:= cm('ArcBreak'); //Cancel button
-63: msgError:= cm('ArcFail');
end;
// MsgBox(msgError, mbInformation, MB_OK); //сообщение показывается на странице завершения
Log(msgError);
Break; //прервать цикл распаковки
end;
end;
// Hide labels and button
FileNamelbl.Hide;
lblExtractFileName.Hide;
ExtractFile.Hide;
btnCancelUnpacking.Hide;
ButtonPanel[bidbtnCancelUnpacking].Hide;
ButtonImage[bidbtnCancelUnpacking].Hide;
ButtonLabel[bidbtnCancelUnpacking].Hide;
end;
procedure CurStepChanged2(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
FileNameLabel.Hide
UnPackError:= UnPack(Archives)
if UnPackError = 0 then
SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
else
begin
// Error occured, uninstall it then
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n); //откат установки из-за ошибки unarc.dll
SetTaskBarTitle(SetupMessage(msgErrorTitle))
WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
end;
end;
end;
// стандартный способ отката (не нужна CurPageChanged), но архивы распаковываются до извлечения файлов инсталлятора
// if CurStep = ssInstall then
// if UnPack(Archives) <> 0 then Abort;
Procedure CurPageChanged5(CurPageID: Integer);
Begin
if (CurPageID = wpFinished) and (UnPackError <> 0) then
begin // Extraction was unsuccessful (распаковщик вернул ошибку)
// Show error message
FinishedHeadingLabel.Caption:= ExpandConstant('{cm:Finished4}');
FinishedLabel.Caption:= SetupMessage(msgSetupAborted)+#13#13+ExpandConstant('{cm:Finished3}');
end;
End;
procedure InitializeWizard7();
begin
with WizardForm.ProgressGauge do
begin
// Create a label to show current FileName being extracted
lblExtractFileName:= TLabel.Create(WizardForm);
lblExtractFileName.parent:=WizardForm.InstallingPage;
lblExtractFileName.autosize:=false;
lblExtractFileName.Left:= ScaleX(65);
lblExtractFileName.Top:= ScaleY(275);
lblExtractFileName.Width:= ScaleX(625);
lblExtractFileName.Height:= ScaleY(20);
lblExtractFileName.Caption:= '';
lblExtractFileName.Transparent := True;
lblExtractFileName.Font.Name:= 'Georgia'
lblExtractFileName.Font.Size:= 10;
lblExtractFileName.Font.Style:= [fsBold, fsItalic];
lblExtractFileName.Hide;
// Create a label to show percentage
ExtractFile:= TLabel.Create(WizardForm);
ExtractFile.parent:=WizardForm.InstallingPage;
ExtractFile.autosize:=false;
ExtractFile.Left:= ScaleX(82);
ExtractFile.Top:= ScaleY(350);
ExtractFile.Width:= ScaleX(625);
ExtractFile.Height:= ScaleY(20);
ExtractFile.Alignment := taCenter;
ExtractFile.caption:= '';
ExtractFile.Transparent := True;
ExtractFile.Font.Name:= 'Georgia'
ExtractFile.Font.Size:= 10;
ExtractFile.Font.Style:= [fsBold, fsItalic];
ExtractFile.Hide;
FileNamelbl:= TLabel.Create(WizardForm);
FileNamelbl.parent:=WizardForm.InstallingPage;
FileNamelbl.autosize:=false;
FileNamelbl.Left:= ScaleX(82);
FileNamelbl.Top:= ScaleY(380);
FileNamelbl.Width:= ScaleX(625);
FileNamelbl.Height:= ScaleY(20);
FileNamelbl.Alignment := taCenter;
FileNamelbl.caption:= '';
FileNamelbl.Transparent := True;
FileNamelbl.Font.Name:= 'Georgia'
FileNamelbl.Font.Size:= 10;
FileNamelbl.Font.Style:= [fsBold, fsItalic];
FileNamelbl.Hide;
end;
// Create a 'Cancel unpacking' button and hide it for now.
btnCancelUnpacking:=TButton.create(WizardForm);
btnCancelUnpacking.Parent:= WizardForm;
btnCancelUnpacking.SetBounds(WizardForm.CancelButton.Left, WizardForm.CancelButton.top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
btnCancelUnpacking.Hide;
end;
//************************************************ [Конец - FreeArc] ***************************************************//
при установке, там где должна начаться распаковка архива, сразу появляется "программа установлена на ваш комп. Нажмите завершить, чтобы продолжить". т.е. распаковка архива не происходит. где допущена ошибка?
при установке, там где должна начаться распаковка архива, сразу появляется "программа установлена на ваш комп. Нажмите завершить, чтобы продолжить". т.е. распаковка архива не происходит. где допущена ошибка? »
Судя по признакам скрипт просто не цепляет архивы
ЗЫ. Сегодня этот скрипт будет уже не актуальным, так как я выложу новую версию...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC