|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 3] |
|
Скрипты Inno Setup. Помощь и советы [часть 3]
|
Ветеран Сообщения: 1133 |
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Inno Setup [все вопросы] часть 1 Inno Setup [все вопросы] часть 2 |
|
------- Отправлено: 00:28, 04-11-2010 |
Новый участник Сообщения: 47
|
Профиль | Отправить PM | Цитировать люди помогите последняя дороботка для моего инсталятора как вставить musicbutton.png и какие библиотеки нужны
дайте полное описание до полочки |
Отправлено: 13:41, 27-08-2011 | #2901 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 47
|
Профиль | Отправить PM | Цитировать и ещё как сделать чтоб в конце просил перезагрузку
|
Отправлено: 15:11, 27-08-2011 | #2902 |
![]() Сообщения: 3649
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Mafia_forever:
|
|
------- Отправлено: 15:27, 27-08-2011 | #2903 |
Старожил Сообщения: 398
|
Профиль | Отправить PM | Цитировать Ктонить может сделать так, чтоб этот скрипт запускался быстрее? В смысле инсталлятор скомпилированный по нему, запускается секунд 20, и закрывается так же.
[_Code] procedure ChangeCaption(str: string); begin WizardForm.StatusLabel.Caption:= str; end; function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall'; function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall'; var Info: TNewStaticText; InfoCaption: TNewStaticText; InfoPanel: TPanel; NeedSize:Integer; FreeMB, TotalMB: Cardinal; NeedSpaceLabel: TLabel; n: Integer; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView; procedure GetFreeSpaceCaption(Sender: TObject); var Path: String; begin Path := ExtractFileDrive(WizardForm.DirEdit.Text); GetSpaceOnDisk(Path, True, FreeMB, TotalMB); if FreeMB < NeedSize then WizardForm.NextButton.Enabled := False else WizardForm.NextButton.Enabled := True; end; procedure GetNeedSpaceCaption; begin if NeedSize > 1024 then NeedSpaceLabel.Caption := 'Требуется как минимум '+ FloatToStr(round(NeedSize/1024*100)/100) + ' Гб свободного дискового пространства.' else NeedSpaceLabel.Caption := 'Требуется как минимум '+ IntToStr(NeedSize)+ ' Мб свободного дискового пространства.';end; const oneMB= 1024*1024; function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall'; function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall'; function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall'; function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall'; Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)} Begin if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб' StringChange(Result, ',', '.') End; Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов } Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End; Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов} Begin if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength) else Result:= String; End; Procedure GetDiskInfo(Disk: String); Begin FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256); GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31); FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки'; End; Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin ListBox.Items.Clear for n:= 1 to 31 do // диск 'А' пропустить if (GetLogicalDrives and (1 shl n)) > 0 then if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':'); for n:= 0 to ListBox.Items.Count -1 do begin Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление } if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path); if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10); if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String; ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end; End; Procedure ObjectOnClick(Sender: TObject); Begin Case TObject(Sender) of ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text)) StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}' WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end; end; End; procedure InitializeWizard1(); begin with WizardForm do begin with MainPanel do Height := Height - 1; with WizardSmallBitmapImage do begin Left := 0; Top := 0; Height := 58; //Размер рисунка Width := 497; // end; with PageNameLabel do begin Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст Left := Left + 497; // end; with PageDescriptionLabel do begin Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст Left := Left + 497; // end; end; end; procedure InitializeWizard2(); begin NeedSize := 2500; //Здесь указывается место для приложения WizardForm.DiskSpaceLabel.Hide; NeedSpaceLabel := TLabel.Create(WizardForm); with NeedSpaceLabel do begin Parent := WizardForm.SelectDirPage; Left := ScaleX(0); Top := ScaleY(220); Width := ScaleX(209); Height := ScaleY(13); end; ListBox:= TListBox.Create(WizardForm) ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12)) ListBox.Font.Size:= 9 ListBox.Font.Style:= [] ListBox.Font.Name:= 'Courier New'; ListBox.OnClick:= @ObjectOnClick; ListBox.Parent:= WizardForm.SelectDirPage; WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption; WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0; end; procedure CurPageChanged1(CurPageID: Integer); begin if CurPageID=wpSelectDir then begin GetNeedSpaceCaption; if FreeMB < NeedSize then WizardForm.NextButton.Enabled:=False ListBoxRefresh end; end; procedure InitializeWizard3(); begin WizardForm.TYPESCOMBO.Visible:= false; WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top; WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top; WizardForm.ComponentsList.Width := ScaleX(200); InfoPanel := TPanel.Create(WizardForm); InfoPanel.Parent := WizardForm.SelectComponentsPage; InfoPanel.Caption := ''; InfoPanel.Top := WizardForm.ComponentsList.Top; InfoPanel.Left := ScaleX(216); InfoPanel.Width := ScaleX(200); InfoPanel.Height := WizardForm.ComponentsList.Height; InfoPanel.BevelInner := bvRaised; InfoPanel.BevelOuter := bvLowered; InfoCaption := TNewStaticText.Create(WizardForm); InfoCaption.Parent := WizardForm.SelectComponentsPage; InfoCaption.Caption := 'Описание'; InfoCaption.Left := ScaleX(224); InfoCaption.Top := InfoPanel.Top - ScaleY(5); InfoCaption.Font.Color := clActiveCaption; Info := TNewStaticText.Create(WizardForm); Info.Parent := InfoPanel; Info.AutoSize := False; Info.Left := ScaleX(6); Info.Width := ScaleX(188); Info.Top := ScaleY(12); Info.Height := WizardForm.ComponentsList.Height - ScaleY(18); Info.Caption := 'Переместите ваш указатель мыши на компоненты чтобы увидеть их описание.'; Info.WordWrap := true; //Впишыте описание компонентов enabledesc(WizardForm.ComponentsList.Handle,Info.Handle, 'Выберите язык внутриигрового текста;'+ //Text 'Немецкий текст;'+ 'Испанский текст;'+ 'Французский текст;'+ 'Итальянский текст;'+ 'Польский текст;'+ 'Выберите этот пункт, если вы не хотите чтобы, после запуская игры, воспроизводились вступительные ролики Blizzard;' // NoIntro ); end; function ShouldSkipPage(CurPage: Integer): Boolean; begin if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then case CurPage of wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectProgramGroup, wpInfoAfter: Result := True; end; end; const WM_LBUTTONDOWN = 513; WM_LBUTTONUP = 514; procedure InitializeWizard4(); begin if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then begin PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0); PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0); end; end; procedure CurPageChanged2(CurPageID: Integer); begin if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and (CurPageID = wpSelectComponents) then WizardForm.BackButton.Visible := False; end; //Проверка на оставшыеся файлы procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var Res: Integer; begin case CurUninstallStep of usPostUninstall: begin if DirExists(ExpandConstant('{app}')) then if ExpandConstant('{language}') = 'ua' then case MsgBox('Папка "' + ExpandConstant('{app}') + '" не порожня.'#13#13 + '"Так" – повне видалення всіх файлів у папці, включаючи саму папку.' #13#13 + '"Ні" – відкрити папку в провіднику, щоб вручну видалити файли.'#13#13 + '"Скасувати" – нічого не робити, видалити папку пізніше самостійно.', mbInformation, MB_YESNOCANCEL) of IDYES: if not DelTree(ExpandConstant('{app}'), True, True, True) then MsgBox('Папка не видалена.' #13#13 'Папка або один з файлів у ній задіяні іншою програмою.', mbError, MB_OK); IDNO: if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then MsgBox('Помилка відкриття.' #13#13 'Папка не знайдена.', mbError, MB_OK); IDCANCEL:; end else if ExpandConstant('{language}') = 'ru' then case MsgBox('Папка "' + ExpandConstant('{app}') + '" не пуста.'#13#13 + '"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 + '"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 + '"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of IDYES: if not DelTree(ExpandConstant('{app}'), True, True, True) then MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK); IDNO: if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK); IDCANCEL:; end else case MsgBox('Directory "' + ExpandConstant('{app}') + '" is not empty.'#13#13 + '"Yes" to delete all of the files in the directory, including the directory itself.' #13#13 + '"No" to open the directory with explorer to delete the files manually.'#13#13 + '"Cancel" to do nothing and delete the directory later manually.', mbInformation, MB_YESNOCANCEL) of IDYES: if not DelTree(ExpandConstant('{app}'), True, True, True) then MsgBox('Directory is not deleted.' #13#13 'Directory or one of the files are used by the other application.', mbError, MB_OK); IDNO: if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then MsgBox('Error opening the directory.' #13#13 'Directory is not found.', mbError, MB_OK); IDCANCEL:; end end end end; const n1=28; //количество слайдов type TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord); TRandNumbers = array[1..N1] of byte; function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:InnoCallback.dll stdcall'; function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall'; function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall'; function get_unique_random_number(X:byte):TRandNumbers; var A,b,c: string; i,j,k:byte; begin For i:=1 to X do A:=A+chr(i); B:=''; For i:=1 to X do begin j:=Random(Length(A)-1)+1; C:=''; B:=B + A[j]; for k:=1 to Length(A) do if k<>j then C:=C+A[k]; A:=C; end; for i:=1 to X do Result[i]:=ord(B[i]); end; var TimerID: LongWord; currTime: Integer; SplashImage: TBitmapImage; StatusMessages: TNewStaticText; bmp: TRandNumbers; z:byte; procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord); begin currTime := currTime + 1; if (currTime mod {#TIME_FOR_VIEW} = 0) then begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[currTime/{#TIME_FOR_VIEW}])+'.bmp')); if (currTime/{#TIME_FOR_VIEW} = N1) then currTime:=0; end; end; procedure InitializeWizard5; begin bmp:=get_unique_random_number(N1); ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp'); currTime := 0; WizardForm.ProgressGauge.Parent := WizardForm; WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12); WizardForm.ProgressGauge.Left := ScaleX(10); WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20); WizardForm.ProgressGauge.Height := 16; WizardForm.ProgressGauge.Hide; WizardForm.StatusLabel.Parent := WizardForm; WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18); WizardForm.StatusLabel.Left := ScaleX(10); WizardForm.StatusLabel.Width := ScaleX(397); WizardForm.StatusLabel.Hide; SplashImage := TBitmapImage.Create(WizardForm); SplashImage.Top := 0; SplashImage.Left := 0; SplashImage.Width := WizardForm.MainPanel.Width; SplashImage.Height := WizardForm.Bevel.Top; SplashImage.Parent := WizardForm.InnerPage; SplashImage.Stretch := True; SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[1])+'.bmp')); SplashImage.Hide; end; procedure CurStepChanged(CurStep: TSetupStep); begin if CurStep = ssInstall then begin WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...'; for z:=2 to N1 do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp'); end; end; procedure CurPageChanged3(CurPageID: Integer); var pfunc: LongWord; begin if (CurPageID = wpInstalling) then begin pfunc := WrapTimerProc(@OnTimer, 5); TimerID := SetTimer(0, 0, 1000, pfunc); WizardForm.PageNameLabel.Visible := False; WizardForm.PageDescriptionLabel.Visible := False; WizardForm.InnerNotebook.Hide; WizardForm.Bevel1.Hide; WizardForm.MainPanel.Hide; WizardForm.PageNameLabel.Hide; WizardForm.PageDescriptionLabel.Hide; WizardForm.ProgressGauge.Show; WizardForm.StatusLabel.Show; SplashImage.Show; WizardForm.CancelButton.Enabled := True; WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100); end else begin WizardForm.ProgressGauge.Hide; SplashImage.Hide; WizardForm.FileNameLabel.Hide; WizardForm.StatusLabel.Hide; if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then begin WizardForm.InnerNotebook.Show; WizardForm.Bevel1.Show; WizardForm.MainPanel.Show; WizardForm.PageNameLabel.Show; WizardForm.PageDescriptionLabel.Show; end; If CurPageID = wpFinished then end; end; procedure CurPageChanged4(CurPageID: Integer); begin if CurPageID = wpInstalling then WizardForm.BeveledLabel.hide; if CurPageID = wpInfoAfter then WizardForm.BeveledLabel.show; end; procedure InitializeWizard; begin InitializeWizard1(); InitializeWizard2(); InitializeWizard3(); InitializeWizard4(); InitializeWizard5(); end; procedure CurPageChanged(CurPageID: Integer); begin CurPageChanged1(CurPageID); CurPageChanged2(CurPageID); CurPageChanged3(CurPageID); CurPageChanged4(CurPageID); end; procedure DeinitializeSetup(); begin disabledesc(); KillTimer(0, TimerID); end; |
Отправлено: 15:54, 27-08-2011 | #2904 |
Старожил Сообщения: 189
|
Профиль | Отправить PM | Цитировать Raf-9600, удали все ненужные файлы, и убери стандартное сжатие т.е.
строчку Compression из секции [setup] и всё что связано со сжатием. |
------- Отправлено: 16:00, 27-08-2011 | #2905 |
Старожил Сообщения: 398
|
Профиль | Отправить PM | Цитировать Цитата Rikill:
![]() Цитата Rikill:
Цитата Rikill:
Собстно я сомневаюсь что это с сжатием связано, т.е. было дело, паковал гораздо более объемные файлы с сжатием LZMA, и таких трабл небыло. |
|||
Отправлено: 16:15, 27-08-2011 | #2906 |
Старожил Сообщения: 189
|
Профиль | Отправить PM | Цитировать Raf-9600, дай скрипт и файлы, если боишся что VASIAKRN с*издит то кидай в личку.
|
------- Отправлено: 16:18, 27-08-2011 | #2907 |
Старожил Сообщения: 398
|
Профиль | Отправить PM | Цитировать Цитата Rikill:
![]() |
|
Отправлено: 16:31, 27-08-2011 | #2908 |
Старожил Сообщения: 242
|
Профиль | Отправить PM | Цитировать Mafia_forever, BASS_v.1.2-pre от Shegorat
http://ifolder.ru/24378199 Raf-9600, а есть такое Compression=zip можно поставить Compression=none и на временые файлы tmp Source: botva2.dll; DestDir: {tmp}; Flags: nocompression это пример |
Отправлено: 16:39, 27-08-2011 | #2909 |
Старожил Сообщения: 398
|
Профиль | Отправить PM | Цитировать Цитата vint56:
![]() У меня на все "системные" файлы стоит Но я все таки склоняюсь что собака зарыта в коде. |
|
Отправлено: 16:46, 27-08-2011 | #2910 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Утилиты - [addon] Inno Setup | CrOsP | Наборы обновлений для Windows XP/2003/Windows 7 | 33 | 11-05-2011 16:03 | |
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] | Serega | Автоматическая установка приложений | 2651 | 08-11-2010 18:34 | |
Inno Setup 5.3.6 | OSZone Software | Новости программного обеспечения | 0 | 15-11-2009 17:30 | |
Скрипты Inno Setup Compiler | QAZAK | Автоматическая установка приложений | 7 | 15-01-2007 17:59 | |
Inno Setup | tradeukraine | Вебмастеру | 3 | 13-06-2006 20:39 |
|