|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9] |
|
Скрипты Inno Setup. Помощь и советы [часть 9]
|
Ветеран Сообщения: 1264 |
Профиль | Отправить PM | Цитировать
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z |
|
Отправлено: 16:09, 04-04-2018 |
Забанен Сообщения: 34
|
спс.
Цитата Vanadiy777:
В секции setup: как я понял. |
|
Последний раз редактировалось serg5, 21-10-2022 в 18:49. Отправлено: 19:24, 14-10-2022 | #841 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать Цитата serg5:
Если этот параметр у Вас указан: то программа будет установлена в C:\Program Files\MyProgram и ключ деинсталляции будет прописан в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram_is1 Если параметр не указан: то программа будет установлена в C:\Program Files (x86)\MyProgram и тогда ключ деинсталляции будет прописан, соответственно, в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram_is1 |
|
------- Отправлено: 00:00, 15-10-2022 | #842 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Хочу генерировать путь установки динамически, считывая путь игры из реестра. Если запись в реестре отсутствует, то выдавать предупреждение. Написал так:
procedure CurPageChanged(CurPageID: Integer); var sd: string; begin if CurPageId = wpSelectDir then sd := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}'); if sd = '{#NOT_FOUND}' then sd := ExpandConstant('{reg:HKLM\SOFTWARE\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}') if sd = '{#NOT_FOUND}' then begin sd := NoSD('') + '{#MyAppName}'; MsgBox('Текст предупреждения', mbInformation, MB_OK); end WizardForm.DirEdit.Text := sd; end; Но потом он куда-то теряется, и на последнем экране запись о пути пустая. Более того, путь сбрасывается при переходе на следующую страницу, причем переменная {app} имеет корректный путь. Если я пропишу путь напрямую и попробую его изменить в инсталяторе. То на выходе путь не меняется. Что я делаю не так? |
Последний раз редактировалось EdMSL, 21-10-2022 в 17:31. Отправлено: 17:16, 21-10-2022 | #843 |
Ветеран Сообщения: 978
|
Профиль | Сайт | Отправить PM | Цитировать EdMSL, Если путь присваивается правильно, то вероятно поможет вызвать функцию
UpdateReadyMemo
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; Если инсталлятор обнаружит функцию UpdateReadyMemo в Pascal-скрипте, она вызоается автоматически, когда активизируется страница мастера Все готово к установке. Для отображения на странице Все готово к установке в виде строк, разделенных параметром NewLine. Параметр Space содержит строку с пробелами. Инсталлятор использует эту строку для задания установок. Другие параметры содержат (возможно пустые) строки, которые инсталлятор может использовать в качестве секций установок. Например, параметр MemoDirInfo содержит строку для определения секции Выбор папки. Тоесть, после присвоение новой папки установки, нужно вызвать UpdateReadyMemoo(' ', 'разделитель строк', 'информация пользователя', 'папка установки', 'тип установки', 'список компонентов', 'группа в меню пуск', 'выбранные задачи'); |
------- Отправлено: 22:31, 21-10-2022 | #844 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Цитата Gnom_aka_Lexander:
|
|
Отправлено: 07:13, 22-10-2022 | #845 |
Старожил Сообщения: 440
|
Профиль | Сайт | Отправить PM | Цитировать EdMSL, предоставь значения #NOT_FOUND и #MyAppName. А так же процедуру NoSD - искать не охота. А лучше весь скрипт выложи.
|
------- Отправлено: 08:51, 23-10-2022 | #846 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Код скрипта:
Скрытый текст
#define MyAppName "My Game" #define MyAppVersion "1.0" #define NOT_FOUND "notFound"; [Setup] AppId={{ADF6076C-BDF7-4515-8D60-17F9DBAD5B41} AppName={#MyAppName} AppVersion={#MyAppVersion} DefaultDirName={code:NoSD}\{#MyAppName} DefaultGroupName={#MyAppName} AllowNoIcons=yes OutputBaseFilename=MyGameSetup Compression=none SolidCompression=yes DiskSpanning=yes SlicesPerDisk=1 DiskSliceSize=2100000000 DiskClusterSize=4096 DisableProgramGroupPage=yes SetupLogging=yes DirExistsWarning=no [Languages] Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "D:\MyGame\*"; DestDir: "{app}"; Flags: ignoreversion [Dirs] Name: "{app}\saves" [Code;] function GetLogicalDrives: DWORD; external 'GetLogicalDrives@kernel32.dll stdcall'; function GetDriveType(lpRootPathName: PAnsiChar): Cardinal; external 'GetDriveTypeA@kernel32.dll stdcall'; const DRIVE_FIXED = 3; TH32CS_SNAPPROCESS = $2; INVALID_HANDLE_VALUE = -1; var ChooseVersionPage: TInputOptionWizardPage; function NoSD(s: string): string; var x, bit, i: Integer; tp: Cardinal; sd: string; begin sd:= ExpandConstant('{sd}'); Result:= sd; x:= GetLogicalDrives; if x <> 0 then for i:= 1 to 64 do begin bit:= x and 1; if bit = 1 then begin tp:= GetDriveType(PAnsiChar(Chr(64 + i) + ':')); if tp = DRIVE_FIXED then if Chr(64 + i) <> Copy(sd, 1, 1) then begin Result:= Chr(64 + i) + ':'; Break; end; end; x:= x shr 1; end; end; function doubleSlash(Param: string): string; var sd: string; i: byte; begin sd := Param; i := 1; while i < length(sd) + 1 do begin if sd[i] = '\' then begin insert('\', sd, i); i := i + 2; end else begin i := i + 1; end; end; Result := sd; end; function IsStringCyrillic(Str: String): Boolean; var objRegExp: Variant; begin try objRegExp := CreateOleObject('VBScript.RegExp'); except ShowExceptionMessage; end; if objRegExp.Test(Str) then begin objRegExp.Pattern := '[\u0400-\u04FF,\u0500-\u052F,\u2DE0-\u2DFF,\uA640-\uA69F]'; Result := objRegExp.Execute(Str).Count = 1; end; end; function IsProcessRunning(FileName: String): Boolean; var objSWbemLocator, objSWbemServices: Variant; begin try objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); except ShowExceptionMessage; Exit; end; objSWbemServices := objSWbemLocator.ConnectServer(); objSWbemServices.Security_.ImpersonationLevel := 3; Result := (objSWbemServices.ExecQuery('SELECT * FROM Win32_Process WHERE Name="' + FileName + '"').Count > 0); end; procedure closeSteam(isUninstall: boolean); var i: integer; str: string; begin if isUninstall then str := 'удаления' else str := 'установки'; MsgBox('Steam.exe запущен. Перед началом ' + str + ' процесс должен быть завершен.' #13#13 'Закройте его самостоятельно, либо процесс будет завершен принудительно.', mbInformation, MB_OK) Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Steam.exe', '', SW_HIDE, ewWaitUntilTerminated, i); end; function GetSystemMetrics (nIndex: Integer): Integer; external 'GetSystemMetrics@User32.dll stdcall setuponly'; Const SM_CXSCREEN = 0; SM_CYSCREEN = 1; function getScreenSize(Param: string): string; begin if Param = 'w' then begin try Result := IntToStr(GetSystemMetrics(SM_CXSCREEN)); except Result := '640'; end end else begin try Result := IntToStr(GetSystemMetrics(SM_CYSCREEN)); except Result := '480'; end end end; function IsIncludeToInstall(GameType: integer): Boolean; begin Result := (GameType = ChooseVersionPage.SelectedValueIndex) end; function GetGamePathFromRegistry(): String; begin Result := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}'); if Result = '{#NOT_FOUND}' then Result := ExpandConstant('{reg:HKLM\SOFTWARE\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}') end; procedure InitializeWizard; begin ChooseVersionPage := CreateInputOptionPage(wpWelcome, 'Выбор версии игры', 'Какая версия игры берется за основу?', '', True, False); ChooseVersionPage.Add('1С'); ChooseVersionPage.Add('Steam'); ChooseVersionPage.Add('GOG'); ChooseVersionPage.SelectedValueIndex := 0; end; procedure RegisterPreviousData(PreviousDataKey: Integer); var GameType: String; begin case ChooseVersionPage.SelectedValueIndex of 0: GameType := '1C'; 1: GameType := 'Steam'; 2: GameType := 'GOG'; end; SetPreviousData(PreviousDataKey, 'GameType', GameType); end; function NextButtonClick(CurPageID: Integer): Boolean; var installPath: string; begin Result := True; if CurPageID = ChooseVersionPage.ID then begin if (ChooseVersionPage.SelectedValueIndex = 1) and (ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}') and (ExpandConstant('{reg:HKLM\SOFTWARE\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}') then Result := MsgBox('Steam.exe не найден' #13#13 'Все равно продолжить?', mbError, MB_YESNO) = idYes end if CurPageID = wpSelectDir then if (IsStringCyrillic(WizardForm.DirEdit.Text)) then begin MsgBox('В пути установки присуствуют русские символы'+#13#10+'Пожалуйста, повторите ввод.', mbError, mb_Ok); Result := False; end else begin installPath := GetGamePathFromRegistry(); log(installPath) ; if (installPath <> '{#NOT_FOUND}') and (installPath <> WizardDirValue) then MsgBox('Указанный путь установки отличается от пути, приписанного для игры в реестре.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbConfirmation, mb_Ok); end if CurPageID = wpSelectComponents then MsgBox('WizardDirValue: ' + WizardDirValue +#13#10+'App: ' + ExpandConstant('{app}'), mbError, mb_Ok); end; procedure CurPageChanged(CurPageID: Integer); var sd: string; //isPathFound: boolean; begin if CurPageId = wpSelectDir then sd := GetGamePathFromRegistry(); if sd = '{#NOT_FOUND}' then begin sd := NoSD('') + '\{#MyAppName}'; MsgBox('Запись об установленной игре отсутствует в реестре Windows.' #13#13 'Возможно, игра была установлена, но ее запуск не был произведен, либо игра установлена некорректно.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbInformation, MB_OK); end WizardForm.DirEdit.Text := sd; end; procedure CurStepChanged(CurStep: TSetupStep); begin if (CurStep = ssInstall) and (ChooseVersionPage.SelectedValueIndex = 1) and IsProcessRunning('Steam.exe') then closeSteam(false) end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var Value: String; begin log(GetPreviousData('GameType', '')); if (CurUninstallStep = usUninstall) and (GetPreviousData('GameType', '') = 'Steam') and IsProcessRunning('Steam.exe') then closeSteam(true) end; Директивы Files, Components и т.д. удалил, чтобы не захлмлять. К проблеме отношения все равно не имеют. |
Последний раз редактировалось EdMSL, 23-10-2022 в 09:03. Отправлено: 08:53, 23-10-2022 | #847 |
Старожил Сообщения: 440
|
Профиль | Сайт | Отправить PM | Цитировать EdMSL,
Скрытый текст
#define MyAppName "My Game" #define MyAppVersion "1.0" #define NOT_FOUND "notFound"; [Setup] AppId={{ADF6076C-BDF7-4515-8D60-17F9DBAD5B41} AppName={#MyAppName} AppVersion={#MyAppVersion} DefaultDirName={code:NoSD}\{#MyAppName} DefaultGroupName={#MyAppName} AllowNoIcons=yes OutputBaseFilename=MyGameSetup Compression=none SolidCompression=yes DiskSpanning=yes SlicesPerDisk=1 DiskSliceSize=2100000000 DiskClusterSize=4096 DisableProgramGroupPage=yes SetupLogging=yes DirExistsWarning=no [Languages] Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "D:\MyGame\*"; DestDir: "{app}"; Flags: ignoreversion [Dirs] Name: "{app}\saves" [_Code] function GetLogicalDrives: DWORD; external 'GetLogicalDrives@kernel32.dll stdcall'; function GetDriveType(lpRootPathName: PAnsiChar): Cardinal; external 'GetDriveTypeA@kernel32.dll stdcall'; const DRIVE_FIXED = 3; TH32CS_SNAPPROCESS = $2; INVALID_HANDLE_VALUE = -1; var ChooseVersionPage: TInputOptionWizardPage; function NoSD(s: string): string; var x, bit, i: Integer; tp: Cardinal; sd: string; begin sd:= ExpandConstant('{sd}'); Result:= sd; x:= GetLogicalDrives; if x <> 0 then for i:= 1 to 64 do begin bit:= x and 1; if bit = 1 then begin tp:= GetDriveType(PAnsiChar(Chr(64 + i) + ':')); if tp = DRIVE_FIXED then if Chr(64 + i) <> Copy(sd, 1, 1) then begin Result:= Chr(64 + i) + ':'; Break; end; end; x:= x shr 1; end; end; function doubleSlash(Param: string): string; var sd: string; i: byte; begin sd := Param; i := 1; while i < length(sd) + 1 do begin if sd[i] = '\' then begin insert('\', sd, i); i := i + 2; end else begin i := i + 1; end; end; Result := sd; end; function IsStringCyrillic(Str: String): Boolean; var objRegExp: Variant; begin try objRegExp := CreateOleObject('VBScript.RegExp'); except ShowExceptionMessage; end; if objRegExp.Test(Str) then begin objRegExp.Pattern := '[\u0400-\u04FF,\u0500-\u052F,\u2DE0-\u2DFF,\uA640-\uA69F]'; Result := objRegExp.Execute(Str).Count = 1; end; end; function IsProcessRunning(FileName: String): Boolean; var objSWbemLocator, objSWbemServices: Variant; begin try objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); except ShowExceptionMessage; Exit; end; objSWbemServices := objSWbemLocator.ConnectServer(); objSWbemServices.Security_.ImpersonationLevel := 3; Result := (objSWbemServices.ExecQuery('SELECT * FROM Win32_Process WHERE Name="' + FileName + '"').Count > 0); end; procedure closeSteam(isUninstall: boolean); var i: integer; str: string; begin if isUninstall then str := 'удаления' else str := 'установки'; MsgBox('Steam.exe запущен. Перед началом ' + str + ' процесс должен быть завершен.' #13#13 'Закройте его самостоятельно, либо процесс будет завершен принудительно.', mbInformation, MB_OK) Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Steam.exe', '', SW_HIDE, ewWaitUntilTerminated, i); end; function GetSystemMetrics (nIndex: Integer): Integer; external 'GetSystemMetrics@User32.dll stdcall setuponly'; Const SM_CXSCREEN = 0; SM_CYSCREEN = 1; function getScreenSize(Param: string): string; begin if Param = 'w' then begin try Result := IntToStr(GetSystemMetrics(SM_CXSCREEN)); except Result := '640'; end end else begin try Result := IntToStr(GetSystemMetrics(SM_CYSCREEN)); except Result := '480'; end end end; function IsIncludeToInstall(GameType: integer): Boolean; begin Result := (GameType = ChooseVersionPage.SelectedValueIndex) end; function GetGamePathFromRegistry(): String; begin Result := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}'); if Result = '{#NOT_FOUND}' then Result := ExpandConstant('{reg:HKLM\SOFTWARE\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}') end; procedure InitializeWizard; begin ChooseVersionPage := CreateInputOptionPage(wpWelcome, 'Выбор версии игры', 'Какая версия игры берется за основу?', '', True, False); ChooseVersionPage.Add('1С'); ChooseVersionPage.Add('Steam'); ChooseVersionPage.Add('GOG'); ChooseVersionPage.SelectedValueIndex := 0; end; procedure RegisterPreviousData(PreviousDataKey: Integer); var GameType: String; begin case ChooseVersionPage.SelectedValueIndex of 0: GameType := '1C'; 1: GameType := 'Steam'; 2: GameType := 'GOG'; end; SetPreviousData(PreviousDataKey, 'GameType', GameType); end; function NextButtonClick(CurPageID: Integer): Boolean; var installPath: string; begin Result := True; if CurPageID = ChooseVersionPage.ID then begin if (ChooseVersionPage.SelectedValueIndex = 1) and (ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}') and (ExpandConstant('{reg:HKLM\SOFTWARE\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}') then Result := MsgBox('Steam.exe не найден' #13#13 'Все равно продолжить?', mbError, MB_YESNO) = idYes end; if CurPageID = wpSelectDir then if (IsStringCyrillic(WizardForm.DirEdit.Text)) then begin MsgBox('В пути установки присуствуют русские символы'+#13#10+'Пожалуйста, повторите ввод.', mbError, mb_Ok); Result := False; end else begin installPath := GetGamePathFromRegistry(); log(installPath) ; if (installPath <> '{#NOT_FOUND}') and (installPath <> WizardDirValue) then MsgBox('Указанный путь установки отличается от пути, приписанного для игры в реестре.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbConfirmation, mb_Ok); end; if CurPageID = wpSelectComponents then MsgBox('WizardDirValue: ' + WizardDirValue +#13#10+'App: ' + ExpandConstant('{app}'), mbError, mb_Ok); end; procedure CurPageChanged(CurPageID: Integer); var sd: string; //isPathFound: boolean; begin if CurPageId = wpSelectDir then begin sd := GetGamePathFromRegistry(); if sd = '{#NOT_FOUND}' then begin sd := NoSD('') + '\{#MyAppName}'; MsgBox('Запись об установленной игре отсутствует в реестре Windows.' #13#13 'Возможно, игра была установлена, но ее запуск не был произведен, либо игра установлена некорректно.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbInformation, MB_OK); end; WizardForm.DirEdit.Text := sd; end; end; procedure CurStepChanged(CurStep: TSetupStep); begin if (CurStep = ssInstall) and (ChooseVersionPage.SelectedValueIndex = 1) and IsProcessRunning('Steam.exe') then closeSteam(false) end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var Value: String; begin log(GetPreviousData('GameType', '')); if (CurUninstallStep = usUninstall) and (GetPreviousData('GameType', '') = 'Steam') and IsProcessRunning('Steam.exe') then closeSteam(true) end; |
------- Последний раз редактировалось nik1967, 23-10-2022 в 09:29. Отправлено: 09:24, 23-10-2022 | #848 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать nik1967, Спасибо. Тяжело без линтера жить.
|
Отправлено: 09:34, 23-10-2022 | #849 |
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать Коллеги, всех приветствую от души!
Подскажите, пожалуйста, как правильно прописать синтаксис... Надо добавить задачу в Планировщик заданий, вот так работает: Exec(ExpandConstant('{sys}\schtasks.exe'), '/create /f /tn "Добавление задачи" /xml '+ExpandConstant('"{app}\AddTasks.xml"'), '', SW_HIDE, ewWaitUntilTerminated, i); За ранее благодарен за помощь. |
------- Отправлено: 00:58, 27-10-2022 | #850 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Скрипты Inno Setup. Помощь и советы [часть 7] | El Sanchez | Автоматическая установка приложений | 2499 | 02-02-2015 08:59 | |
Скрипты Inno Setup. Помощь и советы [часть 6] | El Sanchez | Автоматическая установка приложений | 2494 | 10-03-2014 11:51 | |
Скрипты Inno Setup. Помощь и советы [часть 5] | El Sanchez | Автоматическая установка приложений | 1999 | 28-03-2013 19:09 | |
Скрипты Inno Setup. Помощь и советы [часть 4] | El Sanchez | Автоматическая установка приложений | 2099 | 22-05-2012 23:16 | |
Скрипты Inno Setup. Помощь и советы [часть 3] | Serega | Автоматическая установка приложений | 3755 | 26-10-2011 17:58 |
|