| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 | {	--- TYPES AND VARIABLES ---}type	TProduct = record		File: String;		Title: String;		Parameters: String;		ForceSuccess : boolean;		InstallClean : boolean;		MustRebootAfter : boolean;	end;	InstallResult = (InstallSuccessful, InstallRebootRequired, InstallError);var	installMemo, downloadMessage: string;	products: array of TProduct;	delayedReboot, isForcedX86: boolean;	DependencyPage: TOutputProgressWizardPage;procedure AddProduct(filename, parameters, title, size, url: string; forceSuccess, installClean, mustRebootAfter : boolean);{	Adds a product to the list of products to download.	Parameters:		filename: the file name under which to save the file		parameters: the parameters with which to run the file		title: the product title		size: the file size		url: the URL to download from		forceSuccess: whether to continue in case of setup failure		installClean: whether the product needs a reboot before installing		mustRebootAfter: whether the product needs a reboot after installing}var	path: string;	i: Integer;begin	installMemo := installMemo + '%1' + title + #13;	path := ExpandConstant('{src}{\}') + CustomMessage('DependenciesDir') + '\' + filename;	if not FileExists(path) then begin		path := ExpandConstant('{tmp}{\}') + filename;		if not FileExists(path) then begin			isxdl_AddFile(url, path);			downloadMessage := downloadMessage + '%1' + title + ' (' + size + ')' + #13;		end;	end;	i := GetArrayLength(products);	SetArrayLength(products, i + 1);	products[i].File := path;	products[i].Title := title;	products[i].Parameters := parameters;	products[i].ForceSuccess := forceSuccess;	products[i].InstallClean := installClean;	products[i].MustRebootAfter := mustRebootAfter;end;function SmartExec(product : TProduct; var resultcode : Integer): boolean;{	Executes a product and returns the exit code.	Parameters:		product: the product to install		resultcode: the exit code}begin	if (LowerCase(Copy(product.File, Length(product.File) - 2, 3)) = 'exe') then begin		Result := Exec(product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode);	end else begin		Result := ShellExec('', product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode);	end;end;function PendingReboot: boolean;{	Checks whether the machine has a pending reboot.}var	names: String;begin	if (RegQueryMultiStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager', 'PendingFileRenameOperations', names)) then begin		Result := true;	end else if ((RegQueryMultiStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager', 'SetupExecute', names)) and (names <> ''))  then begin		Result := true;	end else begin		Result := false;	end;end;function InstallProducts: InstallResult;{	Installs the downloaded products}var	resultCode, i, productCount, finishCount: Integer;begin	Result := InstallSuccessful;	productCount := GetArrayLength(products);	if productCount > 0 then begin		DependencyPage := CreateOutputProgressPage(CustomMessage('depinstall_title'), CustomMessage('depinstall_description'));		DependencyPage.Show;		for i := 0 to productCount - 1 do begin			if (products[i].InstallClean and (delayedReboot or PendingReboot())) then begin				Result := InstallRebootRequired;				break;			end;			DependencyPage.SetText(FmtMessage(CustomMessage('depinstall_status'), [products[i].Title]), '');			DependencyPage.SetProgress(i, productCount);			while true do begin				// set 0 as used code for shown error if SmartExec fails				resultCode := 0;				if SmartExec(products[i], resultCode) then begin					// setup executed; resultCode contains the exit code					if (products[i].MustRebootAfter) then begin						// delay reboot after install if we installed the last dependency anyways						if (i = productCount - 1) then begin							delayedReboot := true;						end else begin							Result := InstallRebootRequired;						end;						break;					end else if (resultCode = 0) or (products[i].ForceSuccess) then begin						finishCount := finishCount + 1;						break;					end else if (resultCode = 3010) then begin						// Windows Installer resultCode 3010: ERROR_SUCCESS_REBOOT_REQUIRED						delayedReboot := true;						finishCount := finishCount + 1;						break;					end;				end;				case MsgBox(FmtMessage(SetupMessage(msgErrorFunctionFailed), [products[i].Title, IntToStr(resultCode)]), mbError, MB_ABORTRETRYIGNORE) of					IDABORT: begin						Result := InstallError;						break;					end;					IDIGNORE: begin						break;					end;				end;			end;			if Result <> InstallSuccessful then begin				break;			end;		end;		// only leave not installed products for error message		for i := 0 to productCount - finishCount - 1 do begin			products[i] := products[i+finishCount];		end;		SetArrayLength(products, productCount - finishCount);		DependencyPage.Hide;	end;end;{	--------------------	INNO EVENT FUNCTIONS	--------------------}function PrepareToInstall(var NeedsRestart: boolean): String;{	Before the "preparing to install" page.	See: http://www.jrsoftware.org/ishelp/index.php?topic=scriptevents}var	i: Integer;	s: string;begin	delayedReboot := false;	case InstallProducts() of		InstallError: begin			s := CustomMessage('depinstall_error');			for i := 0 to GetArrayLength(products) - 1 do begin				s := s + #13 + '	' + products[i].Title;			end;			Result := s;			end;		InstallRebootRequired: begin			Result := products[0].Title;			NeedsRestart := true;			// write into the registry that the installer needs to be executed again after restart			RegWriteStringValue(HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', 'InstallBootstrap', ExpandConstant('{srcexe}'));			end;	end;end;function NeedRestart : boolean;{	Checks whether a restart is needed at the end of install	See: http://www.jrsoftware.org/ishelp/index.php?topic=scriptevents}begin	Result := delayedReboot;end;function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;{	Just before the "ready" page.	See: http://www.jrsoftware.org/ishelp/index.php?topic=scriptevents}var	s: string;begin	if downloadMessage <> '' then		s := s + CustomMessage('depdownload_memo_title') + ':' + NewLine + FmtMessage(downloadMessage, [Space]) + NewLine;	if installMemo <> '' then		s := s + CustomMessage('depinstall_memo_title') + ':' + NewLine + FmtMessage(installMemo, [Space]) + NewLine;	if MemoDirInfo <> '' then		s := s + MemoDirInfo + NewLine + NewLine;	if MemoGroupInfo <> '' then		s := s + MemoGroupInfo + NewLine + NewLine;	if MemoTasksInfo <> '' then		s := s + MemoTasksInfo;	Result := send;function NextButtonClick(CurPageID: Integer): boolean;{	At each "next" button click	See: http://www.jrsoftware.org/ishelp/index.php?topic=scriptevents}begin	Result := true;	if CurPageID = wpReady then begin		if downloadMessage <> '' then begin			// change isxdl language only if it is not english because isxdl default language is already english						//if (ActiveLanguage() <> 'en') then begin			//	ExtractTemporaryFile(CustomMessage('isxdl_langfile'));			//	isxdl_SetOption('language', ExpandConstant('{tmp}{\}') + CustomMessage('isxdl_langfile'));			//end;			//isxdl_SetOption('title', FmtMessage(SetupMessage(msgSetupWindowTitle), [CustomMessage('appname')]));			//if SuppressibleMsgBox(FmtMessage(CustomMessage('depdownload_msg'), [FmtMessage(downloadMessage, [''])]), mbConfirmation, MB_YESNO, IDYES) = IDNO then			//	Result := false			//else if			if isxdl_DownloadFiles(StrToInt(ExpandConstant('{wizardhwnd}'))) = 0 then				Result := false;		end;	end;end;{	-----------------------------	ARCHITECTURE HELPER FUNCTIONS	-----------------------------}function IsX86: boolean;{	Gets whether the computer is x86 (32 bits).}begin	Result := isForcedX86 or (ProcessorArchitecture = paX86) or (ProcessorArchitecture = paUnknown);end;function IsX64: boolean;{	Gets whether the computer is x64 (64 bits).}begin	Result := (not isForcedX86) and Is64BitInstallMode and (ProcessorArchitecture = paX64);end;function IsIA64: boolean;{	Gets whether the computer is IA64 (Itanium 64 bits).}begin	Result := (not isForcedX86) and Is64BitInstallMode and (ProcessorArchitecture = paIA64);end;function GetString(x86, x64, ia64: String): String;{	Gets a string depending on the computer architecture.	Parameters:		x86: the string if the computer is x86		x64: the string if the computer is x64		ia64: the string if the computer is IA64}begin	if IsX64() and (x64 <> '') then begin		Result := x64;	end else if IsIA64() and (ia64 <> '') then begin		Result := ia64;	end else begin		Result := x86;	end;end;function GetArchitectureString(): String;{	Gets the "standard" architecture suffix string.	Returns either _x64, _ia64 or nothing.}begin	if IsX64() then begin		Result := '_x64';	end else if IsIA64() then begin		Result := '_ia64';	end else begin		Result := '';	end;end;procedure SetForceX86(value: boolean);{	Forces the setup to use X86 products}begin	isForcedX86 := value;end;
 |