|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Inno Setup. Прочие вопросы |
|
|
Inno Setup. Прочие вопросы
|
|
Ветеран Сообщения: 1274 |
Внимание!!! Данная тема не предназначена для обсуждения скриптов! Для этого создана отдельная тема! Скрипты Inno Setup. Помощь и советы Описание
Inno Setup - это бесплатный инсталлятор для программ Windows. Впервые появился в 1997 году, Inno Setup сегодня, конкурирует и даже превосходит многие коммерческие инсталляторы по возможностям и стабильности. Основные достоинства:
Основной бесплатный конкурент - NSIS. Последняя стабильная версия - 6.4.3 [03.05.2025]. История версий. Официальные сборки Inno Setup 6.4.3: Редакторы 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 |
|
Пользователь Сообщения: 76
|
Профиль | Отправить PM | Цитировать iglezz, братюня ну ты и дал стране угля поборол даже такую версию 4,49,1,356.....
![]() |
|
Отправлено: 17:16, 08-01-2020 | #592 |
|
Пользователь Сообщения: 76
|
Профиль | Отправить 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 |
|
Пользователь Сообщения: 76
|
Профиль | Отправить 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 |
|
Пользователь Сообщения: 76
|
Профиль | Отправить 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 |
|
Пользователь Сообщения: 76
|
Профиль | Отправить 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 | |
|