![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.55.200] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#1
,
|
|
Начнем потихоньку собирать FAQ по Inno Setup.
|
![]() |
Сообщ.
#2
,
|
|
Q:Подскажите, как из скрипта отключить/включить кнопки Next и Prev?
А: ![]() ![]() Procedure CurPageChanged(CurPageID: Integer); begin if CurPageID=8 then //Тут только номер надо подобрать. WizardForm.NextButton.Enabled:=false else WizardForm.NextButton.Enabled:=true; if CurPageID=6 then //Тут тоже! WizardForm.BACKBUTTON.Enabled:=false else WizardForm.BACKBUTTON.Enabled:=true; end; |
![]() |
Сообщ.
#3
,
|
|
Q:Как поменять текст "Распаковка файлов..." в диалоге непосредственной установки (там, где прогресбар) на мой.
А:Как вариант, можно скрыть строку инсталлятора и создать свою! ![]() ![]() var mt:TNewStaticText; Procedure CurPageChanged(CurPageID: Integer); begin if CurPageID=wpInstalling then begin WizardForm.STATUSLABEL.visible:=false; mt:=TNewStaticText.Create(WizardForm); with mt do begin Parent:=WizardForm; Left := ScaleX(40); Top := ScaleY(68); Width := ScaleX(77); Height := ScaleY(14); Caption := 'Идет установка:'; end; end; if CurPageID=wpFinished then begin mt.free; mt:=nil; end; end; |
![]() |
Сообщ.
#4
,
|
|
Q:Знает кто-нибудь, как зарегистрировать свою программу в качестве системной службы (сервиса)?
A: ![]() ![]() [Run] Filename: "{app}\MyProg.exe"; Parameters: "-install"; Q:Нет, не подходит. Ничего не происходит даже если запустить её с этими параметрами. Наверное, службы на C# сами себя не регистрируют. A:Итак, регистрация любой службы: берем файл instsrv.exe (можно также бесплатно скачать с сайта MicroSoft) и запускаем примерно так: ![]() ![]() [Run] Filename: "{sys}\instsrv.exe" ; Parameters: " ""Имя службы"" ""C:\Program Files\MyService\Myservice.exe"" " Только перед этим его надо скопировать в System32 ![]() ![]() [Files] Source: "C:\instsrv.exe"; DestDir: "{sys}"; Flags: onlyifdoesntexist uninsneveruninstall |
![]() |
Сообщ.
#5
,
|
|
Q: Скажите, пожалуйста, как с помощью Inno Setup установить BDE, какие файлы для этого нужны?
A: A2: Качаем прикрепленный архив и извлекаем из него CheckBDE.dll, например, в MyDll. Копируем все указанные dron-s'ом файлы, а именно ![]() ![]() bantam.dll blw32.dll charset.cvb idapi32.cfg idapi32.dll idasci32.dll idbat32.dll iddr32.dll idpdx32.dll idr20009.dll idsql32.dll other.btl ![]() ![]() [Files] Source: BDE\*; DestDir: {cf}\Borland Shared\BDE; Flags: uninsneveruninstall replacesameversion onlyifdoesntexist; Check: InstallBDE Source: MyDll\CheckBDE.dll; Flags: dontcopy [Code] Function CheckBDE:boolean; external 'CheckBDEInstalled@files:CheckBDE.dll stdcall'; var First:boolean; BDEInstall:boolean; function InitializeSetup(): Boolean; begin First:=true; Result:=true; end; Function InstallBDE:boolean; begin if First then begin Result:=false; if not CheckBDE then begin if MsgBox('У вас не установлена BDE!'#13'Установить?',mbConfirmation,MB_YESNO)=IDYES then Result:=true; end; BDEInstall:=result; First:=false; end else Result:=BDEInstall; end; |
![]() |
Сообщ.
#6
,
|
|
Q: В инсталляторе создаю новую страницу с TNewCheckListBox на ней. Вопрос, можно ли как-то заполнить его именами файлов из определенного каталога?
A: ![]() ![]() #define FindHandle #define FindResult #define Mask "F:\p2p на E\Games\Preferans\*.hlp" #sub ProcessFoundFile #define fn FindGetFileName(FindHandle) CheckListBox.AddCheckBox('{#fn}', '', 0, True, True, False, True, nil); #endsub // где в секции [Code] CheckListBox := TNewCheckListBox.Create(Page); CheckListBox.Width := Page.SurfaceWidth; CheckListBox.Height := ScaleY(97); CheckListBox.Flat := True; CheckListBox.Parent := Page.Surface; #for {FindHandle = FindResult = FindFirst(Mask, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile |
![]() |
Сообщ.
#7
,
|
|
Q: Проблема в следующем - сетапка скомпилирована InnoSetup последней. На компах без прав администратора не ставится вообще.
A: Вообще, чтобы инсталлятор сам говорил, что ему нужны права Админа в секции [Setup] должна быть строка: ![]() ![]() PrivilegesRequired=admin ![]() ![]() PrivilegesRequired=none |
![]() |
Сообщ.
#8
,
|
|
Q: Скажите, как в InnoSetup сделать варианты установки.
A: В смысле Full, Standart, Custom и т.д.? Тогда так: ![]() ![]() ;Типы установки. [Types] Name: full; Description: Full installation Name: compact; Description: Compact installation Name: custom; Description: Custom installation; Flags: iscustom [Components] Name: program; Description: Program Files; Types: full compact custom; Flags: fixed ;fixed - значит нельзя отключить! Name: help; Description: Help File; Types: full Name: readme; Description: Readme File; Types: full Name: readme\en; Description: English; Flags: exclusive Name: readme\de; Description: German; Flags: exclusive ;exclusive - можно выбрать только одно из exclusive. Q: Мне нужно, чтобы небыло видно входящих в вариант установки компонент. A: Тогда придется создавать свою форму, размещать на ней все что надо, и использовать параметр Check:. ![]() ![]() [Files] Source: MyProg.exe; DestDir: {app} Source: MyProg.hlp; DestDir: {app}; Check: FullCheck ;Если FullCheck=True то файл установится! Source: Readme.txt; DestDir: {app}; Flags: isreadme; Check: FullCheck ;Source: 1.bmp; DestDir: {tmp} ;Source: 2.bmp; DestDir: {tmp} [Code] var Page: TWizardPage; BitmapImage1:TBitmapImage; BitmapImage2:TBitmapImage; RadioButton1:TRadioButton; RadioButton2:TRadioButton; function FullCheck: Boolean; begin Result := RadioButton2.Checked; end; procedure InitializeWizard(); begin //ExtractTemporaryFile('1.bmp'); //ExtractTemporaryFile('2.bmp'); Page := CreateCustomPage(6, 'Выберите тип установки', 'Тут что-то еще написать можно!'); BitmapImage1 := TBitmapImage.Create(Page); with BitmapImage1 do begin Parent := Page.Surface; Left := ScaleX(8); Top := ScaleY(32); Width := ScaleX(41); Height := ScaleY(41); //BitMap.LoadFromFile('D:\1.bmp'); end; BitmapImage2 := TBitmapImage.Create(Page); with BitmapImage2 do begin Parent := Page.Surface; Left := ScaleX(8); Top := ScaleY(100); Width := ScaleX(41); Height := ScaleY(41); //BitMap.LoadFromFile('D:\1.bmp'); end; RadioButton1 := TRadioButton.Create(Page); with RadioButton1 do begin Checked:=true; Parent := Page.Surface; Left := ScaleX(8); Top := ScaleY(8); Width := ScaleX(265); Height := ScaleY(21); Caption := 'Пользовательсякая версия'; TabOrder:=0; Font.Style := [fsBold]; end; RadioButton2 := TRadioButton.Create(Page); with RadioButton2 do begin Parent := Page.Surface; Left := ScaleX(8); Top := ScaleY(76); Width := ScaleX(265); Height := ScaleY(21); Caption := 'Администратиная версия'; TabOrder:=1; Font.Style := [fsBold]; end; st1 := TNewStaticText.Create(Page); with st1 do begin Parent := Page.Surface; Left := ScaleX(52); Top := ScaleY(32); Width := ScaleX(77); Height := ScaleY(14); Caption := 'Ограниченная версия: доступен только поиск.'#13'Это версия для операторов.'; end; st2 := TNewStaticText.Create(Page); with st2 do begin Parent := Page.Surface; Left := ScaleX(52); Top := ScaleY(104); Width := ScaleX(77); Height := ScaleY(14); Caption := 'Полная версия.'#13'Установите её только на один компьютер!'; end; end; |
![]() |
Сообщ.
#9
,
|
|
Q: При деинсталляции нужно вывести диалог с вопросом об удалении и при отрицательном ответе некоторые файлы не удалять?
A: ![]() ![]() [Files] Source: *.dmy; DestDir: {app}\DataA; Flags: uninsneveruninstall Source: *.udb; DestDir: {app}\DataA; Flags: uninsneveruninstall [Code] procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var FindFiles:TFindRec; begin if CurUninstallStep=usUninstall then begin if MsgBox('Удалить файлы пользователя?', mbConfirmation, MB_YESNO) = IDYES then begin if FindFirst(ExpandConstant('{app}\DataA\*.dmy'), FindFiles) then begin repeat DeleteFile(ExpandConstant('{app}\DataA\')+FindFiles.Name); until not FindNext(FindFiles); FindClose(FindFiles); end; if FindFirst(ExpandConstant('{app}\DataA\*.udb'), FindFiles) then begin repeat DeleteFile(ExpandConstant('{app}\DataA\')+FindFiles.Name); until not FindNext(FindFiles); FindClose(FindFiles); end; end; end; end; |
![]() |
Сообщ.
#10
,
|
|
Q: Как сделать так, чтобы папка с абсолютно всеми вложенными папками и файлами копировалась сразу?
A: Попробуй использовать флаг recursesubdirs ![]() ![]() Source: "www\*"; DestDir: "{app}\www"; Flags: recursesubdirs |
![]() |
Сообщ.
#11
,
|
|
Q: Как узнать путь из реестра и установить туда в тихом режиме?
A: ![]() ![]() [Files] Source: "file.exe"; DestDir: "{reg:HKLM\Software\VST,VSTPluginsPath|DefaultValue}" |
![]() |
Сообщ.
#12
,
|
|
Q: Скажите, какой нужно использовать параметр установки в InnoSetup для того, чтобы на рабочем столе размещалась иконка при наведении курсора на которую выводилась инфа.
A: ![]() ![]() Name: {userdesktop}\My program; Filename: {app}\MyProg.exe; Comment: Это просто коментарии к значку; |
![]() |
Сообщ.
#13
,
|
|
Q: В конфиге инны задаю значок для выходного файла. Так вот, при достижении, как я понял, определённого размера упаковываемых файлов (около 350 мб) значок остаётся стандартный виндовый.
A: Если ваш setup.exe составлено более чем несколько сотен мегабайт, Windows Explorer может показать стандартный значек файла вместо установленного вами. Кроме того, при просмотре свойств файла вкладка "Версия" может отсутствовать. Это не ошибка Inno Setup. На самом деле проблема заключается в API Explorer используемых для извлечения иконок и сведений о версии. Проблему возможно решить, включив разбиение пакета установки на несколько файлов с помощью директивы DiskSpanning=yes. При этом данные будут вынесены в один или несколько файлов *.bin (в зависимоти от настройки DiskSliceSize и размера исходных файлов), а сама программа установки будет занимать малый объём, который Windows Explorer'у под силу корректно обработать. Код, демонстрирующий использование DiskSpanning: ![]() ![]() DiskSpanning=yes ;пусть файлы *.bin будут размером до 255 МБ DiskSliceSize=268435456 |
![]() |
Сообщ.
#14
,
|
|
Q: Как сделать универсальный инсталлятор для 32 и 64 битных систем?
A: Опытным путём выяснил следущее. Как до того я говорил, используем 64-битный режим: ![]() ![]() [Setup] ArchitecturesInstallIn64BitMode=x64 //Не будем от него отклоняться, хотя возможно есть и другие способы. //Затем обязательно указываем флаг 32: [Files] Source: "shutdown.exe"; DestDir: "{sys}"; Flags: 32bit ignoreversion overwritereadonly touch; Permissions: admins-full так как мы пытаемся установить 32 битное приложение shutdown.exe. Если не установить соответствующий флаг, то файл будет проигнорирован в процессе установки. И он вообще не будет установлен ни в одну директорию! Если мы выполним установку как в нашем примере, то файл успешно будет установлен. Причём он появится одновременно в двух папках system32 и SysWOW64. Но тут уже проявляется работа эмулятора WOW64 в который мы вникать не будем. Если же мы будем устанавливать настоящее 64 битное приложение shutdown.exe, то наверное флаг указывать здесь не нужно. Скорее всего он сразу будет установлен в system32 как и положенно. Но это только для случая с настоящими 64 бинариками. С реестром ситуация похожа: ![]() ![]() [Registry] Root: HKLM32; Subkey: "Software\Microsoft\Windows NT\CurrentVersion\Winlogon"; ValueType: string; ValueName: "Userinit"; ValueData: "{win}\makedate.exe,{sys}\userinit.exe"; Flags: noerror; Permissions: admins-full Только сама логика странная, почему скажем нельзя использовать обычный параметр Root: HKLM и какой смысл имеет параметр HKLM64, который так же в нашем случае непригоден к использованию! Однако аргумент HKLM32 вполне можно использовать, так как проверенно на реальной системе. |
![]() |
Сообщ.
#15
,
|
|
Q: Как в InnoSetup IDE вбить длинные строки, например, часто встречающиеся binary type data реестра
![]() ![]() ValueData: 00 00 00 00 10 00 00 e3 00 00 00 00 a2 00 00 .... A: Это лишь проблемма IDE, на самом деле кампилятор читает длинные строки, следовательно их можно вписать в любом подходящем редакторе, например, notepad.exe и т.п. Следует быть осторожным, затем при открытии скрипта в InnoSetup, хотя при сдвигах текста программы, длинные строки перемещаются полностью корректно, но я не знаю что будет если скажем вырезать и затем вставить текст! |