|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Inno Setup. Прочие вопросы |
|
Inno Setup. Прочие вопросы
|
Ветеран Сообщения: 1269 |
Внимание!!! Данная тема не предназначена для обсуждения скриптов! Для этого создана отдельная тема! Скрипты Inno Setup. Помощь и советы ![]() Описание
Inno Setup - это бесплатный инсталлятор для программ Windows. Впервые появился в 1997 году, Inno Setup сегодня, конкурирует и даже превосходит многие коммерческие инсталляторы по возможностям и стабильности. Основные достоинства:
Основной бесплатный конкурент - NSIS. Последняя стабильная версия - 6.3.1 [10.06.2024]. История версий. Официальные сборки Inno Setup 6.3.1: Редакторы iss-скриптов:
Дополнительно
Справка
Русификаторы
Распаковщики/декомпиляторы инсталляторов Inno Setup
Параметры командной строки инсталлятора (ссылка) |
|
Отправлено: 00:25, 24-08-2009 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать 1. Beavimo, Вместо упрощения и минификации лучше выносить блоки кода в отдельные файлы и подключать их через #include. Потом проще будет править ошибки и даже просто разбираться в своём же коде спустя некоторое время.
В качестве примера: основной скрипт
[Setup] AppName=testApp AppVersion=0.1 DefaultDirName={tmp}\testApp OutputDir=. OutputBaseFileName=testApp PrivilegesRequired=lowest CreateAppDir=no Uninstallable=no ; Подключаем внешнюю библиотеку: #include "FileVersion.iss" [code] function InitializeSetup(): Boolean; var FileName: String; CurrentVersion, MinVersion: TFileVersion; // объявляем переменные begin // Задаём требуемую версию: FileVersionSetI(MinVersion, 5, 80, 0, 0); // или так: FileVersionSetS(MinVersion, '5.80.0.0'); // Имя файла: FileName := ExpandConstant('{src}') + '\test.exe'; if Not FileExists(FileName) then begin MsgBox('Установка Прекращена:'#13#13 + 'Файл `' + ExtractFileName(FileName) + '` не найден', mbCriticalError, MB_OK); Result := False; Exit; end; // Файл существует, считываем версию: FileVersionSetF(CurrentVersion, FileName); // Сравниваем и решаем что делать: if FileVersionCompare(CurrentVersion, MinVersion) > -1 then Result := True else begin MsgBox('Установка Прекращена:' \ + #13#13'Версия файла `' + ExtractFileName(FileName) + '`: ' + FileVersionToStr(CurrentVersion) \ + #13#13'Требуется версия как минимум: ' + FileVersionToStr(MinVersion) \ , mbCriticalError, MB_OK); Result := False; end; end; подключаемый модуль
Файл FileVersion.iss (разместить рядом с основным скриптом):
; FileVersion library version 0.1 ; ; ; Usage: ; // Outside [code] section of .iss: ; #include "FileVersion.iss" // add this library to your .iss ; ; // Under `var` variable declaration block on [code] section of .iss: ; Version: TFileVersion; // declare variable `Version` ; ; // Set Version: ; FileVersionSetS(Version, STRING) // set Version from string STRING ('1.2.3.4') ; FileVersionSetI(Version, N1, N2, N3, N4) // set Version from numbers N1, N2, N3, N4 (N1.N2.N3.N4) ; FileVersionSetS(Version, FILE) // set Version from file FILE ; ; // Use Version: ; FileVersionToStr(Version) // return 'x.x.x.x' string representation of Version ; FileVersionCompare(Version1, Version2) // return: ; // -1 if (Version1 < Version2) ; // 0 if (Version1 = Version2) ; // 1 if (Version1 > Version2) ; [code] type TFileVersion = array[1..4] of Integer; // Internal function procedure FileVersionExtractNumber(var VersionString: String; var VersionNumber: Integer); var DotPosition: Integer; begin DotPosition := Pos('.', VersionString); if DotPosition > 0 then begin VersionNumber := StrToInt(Copy(VersionString, 1, DotPosition - 1)); VersionString := Copy(VersionString, DotPosition + 1, 99); end else begin VersionNumber := StrToInt(VersionString); VersionString := ''; end; end; // Set TFileVersion from integers procedure FileVersionSetI(var Version: TFileVersion; v1, v2, v3, v4: Integer); begin Version[1] := v1; Version[2] := v2; Version[3] := v3; Version[4] := v4; end; // Set TFileVersion from string procedure FileVersionSetS(var Version: TFileVersion; VersionString: String); var i: Integer; begin for i := 1 to 4 do FileVersionExtractNumber(VersionString, Version[i]); end; // Set TFileVersion from file procedure FileVersionSetF(var Version: TFileVersion; FileName: String); var VersionString: String; begin GetVersionNumbersString(FileName, VersionString); FileVersionSetS(Version, VersionString); end; // Compare TFileVersions // Return -1 if (CurrentVersion < CompareVersion) // Return 0 if (CurrentVersion = CompareVersion) // Return 1 if (CurrentVersion > CompareVersion) function FileVersionCompare(CurrentVersion, CompareVersion: TFileVersion): Integer; var i: Integer; begin for i := 1 to 4 do if CurrentVersion[i] < CompareVersion[i] then begin Result := -1; Exit; end else if CurrentVersion[i] > CompareVersion[i] then begin Result := 1; Exit; end; Result := 0; end; // Return "x.x.x.x" string representation of TFileVersion function FileVersionToStr(Version: TFileVersion): String; var i: Integer; begin Result := IntToStr(Version[1]); for i := 2 to 4 do Result := Result + '.' + IntToStr(Version[i]); end; // Test procedure procedure FileVersionTestFileAgainstString(FileName, Version: String); var CurrentVersion, MinVersion: TFileVersion; CompareResult: Integer; begin FileVersionSetF(CurrentVersion, FileName); FileVersionSetS(MinVersion, Version); MsgBox('Тест файла: `' + ExtractFileName(FileName) + '`: ' \ + #13#13'Версия файла: '#9 + FileVersionToStr(CurrentVersion) \ + #13#13'Сравнить с: '#9 + FileVersionToStr(MinVersion) \ + #13#13'Результат: '#9 + IntToStr(FileVersionCompare(CurrentVersion, MinVersion)) \ , mbInformation, MB_OK); end; В виде файлов можно скачать здесь. 2. Цитата Beavimo:
|
|
Отправлено: 14:56, 08-01-2020 | #591 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 62
|
Профиль | Отправить PM | Цитировать iglezz, братюня ну ты и дал стране угля поборол даже такую версию 4,49,1,356.....
![]() |
Отправлено: 17:16, 08-01-2020 | #592 |
Пользователь Сообщения: 62
|
Профиль | Отправить PM | Цитировать iglezz Немножко уменьшил код, и добавил функцию проверки максимальной версии, на которую можна установить свой апдейт, мож кому пригодится. Работает з доп. модулем и подключением через функцыю #include тыць
Файл FileVersion.iss (разместить рядом с основным скриптом), и в скрипте подключить етот файл #include "FileVersion.iss" Вот сам скрипт Code
#include "FileVersion.iss" [code] function InitializeSetup(): Boolean; var FileName: String; CurrentVersion, MinVersion: TFileVersion; begin // Задаём минимальную требуемую версию: FileVersionSetI(MinVersion, 1,3,0,0); FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Test,PATH_APPLICATION}') +'\Test.exe'; if Not FileExists(FileName) then begin MsgBox('Установка Прекращена:' #13#13 'Файл ('+ExtractFileName(FileName)+') не найден!', mbCriticalError, MB_OK); Result := False; Exit; end; FileVersionSetF(CurrentVersion, FileName); if FileVersionCompare(CurrentVersion, MinVersion) > -1 then Result := True else begin MsgBox ('Установка Прекращена:' #13#13 'Версия Установленной Программы: ' +FileVersionToStr(CurrentVersion) +#13#13 'Нужна Минимум: ' +FileVersionToStr(MinVersion), mbCriticalError, MB_OK); Result := False; Exit; end; // Задаём Максимальную требуемую версию: FileVersionSetI(MinVersion, 1,3,0,0); FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Test,PATH_APPLICATION}') +'\Test.exe'; FileVersionSetF(CurrentVersion, FileName); if FileVersionCompare(CurrentVersion, MinVersion) < 1 then Result := True else begin MsgBox('Установка Прекращена:' #13#13 'Версия Установленной Программы: ' +FileVersionToStr(CurrentVersion) +#13#13 'Нужна Максимум: ' +FileVersionToStr(MinVersion), mbCriticalError, MB_OK); Result := False; Exit; end; end; Счас назрел новый вопрос, я правда еще мало интересовался им, но навсяк спрошу мож кто знает ответ, перед установкой нуна сверить хешсумму SHA-1 установленного уже файла Test.exe, с хеш устанавлимоего мною файла Test.exe (я могу и зарания вбить значение хеш SHA-1 устанавлимоего Test.exe для проверки), и в случае 1=1 вывести сообщение Програма уже установлена Хотите установить (ДА\НЕТ) Чот сочинил но пока безрезультатно Code
function GetSHA1OfUnicodeString(const S: String): String; var SHA1: String; begin SHA1 := GetSHA1OfUnicodeString('reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}\Test.exe'); if SHA1 = '9ab696a37604d665dc97134dbee44cfe70451b1a' then begin end else MsgBox('программа уже установлена' #13#13 'продлить установку', mbCriticalError, MB_YESNO); Result:= False; end; end; |
Последний раз редактировалось Beavimo, 09-01-2020 в 22:49. Отправлено: 15:59, 09-01-2020 | #593 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Beavimo,
GetSHA1OfUnicodeString служит для получения хэша строки, что и отображено в названии функции, для файла надо использовать GetSHA1OfFile |
Отправлено: 00:57, 10-01-2020 | #594 |
Пользователь Сообщения: 62
|
Профиль | Отправить PM | Цитировать iglezz, всеравно ничерта у меня не получается, инсталятор всьо время ругается, я методом перебора пробую чот сочинить, а понять как оно работает не могу, ети все (if, if not, then, begin, else, var, и другие)
code
[code] function GetSHA1OfFile(const S: String): String; var SHA1: String; begin SHA1 := GetSHA1OfFile('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe'; if SHA1 = '9ab696a37604d665dc97134dbee44cfe70451b1a' then begin Result:= True; end else begin MsgBox('что делать?', mbCriticalError, MB_OK); Result:= False; end; end; тут два варианта, или не компилируется, или устанавливается без проверки хеш сум.... может поможеш разобратся. |
Последний раз редактировалось Beavimo, 10-01-2020 в 14:02. Отправлено: 13:56, 10-01-2020 | #595 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Beavimo, "это не шахматы,здесь думать надо" © древнючий баян
![]() Вот рабочий пример (требует для сборки файл test.exe в папке рядом со iss-скриптом): Скрытый текст
; записываем в MySHA1 значение хеша из нужного файла на стадии компиляции #define MySHA1 GetSHA1OfFile(SourcePath + '\test.exe') [Setup] AppName=testSHA1 OutputBaseFileName=testSHA1 AppVersion=0.1 DefaultDirName={tmp}\testApp OutputDir=. PrivilegesRequired=lowest CreateAppDir=no [Files] Source: "test.exe"; DestDir: "{app}" [code] function InitializeSetup(): Boolean; var FileName: String; SHA1: String; begin // Берём файл в целевом каталоге: FileName := ExpandConstant('{src}') + '\test.exe'; // Здесь пропущена проверка на FileExists // Считаем его хеш: SHA1 := GetSHA1OfFile(FileName); // Делаем сверку: if SHA1 = '{#MySHA1}' then MsgBox('OK!', mbInformation, MB_OK) else MsgBox('SAD :(', mbCriticalError, MB_OK); Result := False end; Цитата Beavimo:
|
|
Отправлено: 14:49, 10-01-2020 | #596 |
Пользователь Сообщения: 62
|
Профиль | Отправить PM | Цитировать iglezz,
code
function InitializeSetup(): Boolean; var FileName: String; SHA1: String; begin // Берём файл в целевом каталоге: FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe'; // Здесь пропущена проверка на FileExists // Считаем его хеш: SHA1 := GetSHA1OfFile(FileName); // Делаем сверку: if SHA1 = '{#MySHA1}' then MsgBox('Программа уже Установлена.' #13#13 'Установить все равно!', mbInformation, MB_YesNo) else Result := False end; Пример работает, но програма не устанавливается, а нужно чтоб она уставливалась всегда без сообщений, а когда хеш равны выводилось смс (ДА\НЕТ), и только если пользователь нажмет (НЕТ) тогда прекратить установку. Извини что я так бузю, хочу понять как оно работает, но самому никак, нужна муза, а ты для меня как учитель (Спасибо)... |
Отправлено: 18:26, 10-01-2020 | #597 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Beavimo, Отписал в личку
Дальнейшее обсуждение скриптов стоит перенести в тему Скрипты Inno Setup. Помощь и советы [часть 9], а то мы что-то отвлеклись.... |
Отправлено: 19:24, 10-01-2020 | #598 |
Пользователь Сообщения: 62
|
Профиль | Отправить PM | Цитировать iglezz, понял
![]() iglezz, Чот не могу отправить тебе в личку смс. Извиняюсь а где можно тестировать ети примери, есть какаянить среда? Скрытый текст
Uses crt; Var a,b,v,t,u,i : Integer; begin Writeln ('Введите первую пару чисел:'); Write ('Первое число:'); Readln (a); Write ('Второе число:'); Readln (b); v:=a+b; Writeln ('Введите вторую пару чисел:'); Write ('Первое число:'); Readln (t); Write ('Второе число:'); Readln (u); i:=t+u; if (v=i) then Writeln ('Они равны.'); if (v>i) then Writeln ('Сумма первой пары чисел больше суммы второй.'); if (v<i) then Writeln ('Сумма второй пары чисел больше суммы второй.'); end. чтобы сразу наглядно видить результат? |
Отправлено: 19:30, 10-01-2020 | #599 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Beavimo, Это сюда - Программирование и базы данных
Личку чистить надо, тогда будет отправляться -- лимит сообщений Скачай и установи http://pascalabc.net Потом прекращаем здесь оффтопить ![]() |
Последний раз редактировалось iglezz, 10-01-2020 в 20:14. Отправлено: 19:48, 10-01-2020 | #600 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Утилиты - [addon] Inno Setup | CrOsP | Наборы обновлений для Windows XP/2003/Windows 7 | 33 | 11-05-2011 16:03 | |
Inno Setup 5.3.6 | OSZone Software | Новости программного обеспечения | 0 | 15-11-2009 17:30 | |
[архив] Inno Setup .:[все вопросы]:. | Mchik | Автоматическая установка приложений | 1329 | 23-08-2009 20:13 | |
Скрипты Inno Setup Compiler | QAZAK | Автоматическая установка приложений | 7 | 15-01-2007 17:59 | |
Inno Setup | tradeukraine | Вебмастеру | 3 | 13-06-2006 20:39 |
|