PDA

Показать полную графическую версию : Inno Setup. Прочие вопросы


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 [30] 31 32 33

iglezz
07-01-2020, 18:53
Beavimo,
[Setup]
AppName=testApp
AppVersion=0.1
DisableWelcomePage=yes
DefaultDirName={tmp}\testApp
OutputDir=.
OutputBaseFilename=testApp
PrivilegesRequired=lowest

[Code]
type
TFileVer = array[1..4] of Integer;

procedure CutVerNumber(var S: String; var N: Integer);
var
position: Integer;
begin
position := Pos('.', S);
if position > 0 then
begin
N := StrToInt(Copy(S, 1, position - 1));
S := Copy(S, position + 1, 99);
end
else
begin
N := StrToInt(S);
S := '';
end;
end;

function TFileVerToString(V: TFileVer): String;
var
i: Integer;
begin
Result := IntToStr(V[1]);
for i := 2 to 4 do
Result := Result + '.' + IntToStr(V[i]);
end;

function StringToTFileVer(S: String): TFileVer;
var
i: Integer;
V: TFileVer;
begin
for i := 1 to 4 do
CutVerNumber(S, V[i]);

Result := V;
end;

function IsNotLowerVersion(currentVersion, compareVersion: TFileVer): Boolean;
var
i: Integer;
begin
Result := False;

for i := 1 to 4 do
if currentVersion[i] < compareVersion[i] then
Exit;

Result := True;
end;

function InitializeSetup(): Boolean;
var
fileName: String;
versionString: String;
minVersion: TFileVer;
currentVersion: TFileVer;
begin
// Имя файла:
fileName := ExpandConstant('{reg:HKLM\SOFTWARE\Test,PATH_APPLICATION}\Test.exe');
// Требуемая версия (1.3.0.0):
minVersion[1] := 1;
minVersion[2] := 3;
minVersion[3] := 0;
minVersion[4] := 0;

if Not FileExists(fileName) then begin
MsgBox('Установка Прекращена:'#13#13 + 'Файл `' + ExtractFileName(fileName) + '` не найден', mbCriticalError, MB_OK);
Result := False;
Exit;
end;

GetVersionNumbersString(fileName, versionString);
currentVersion := StringToTFileVer(versionString);

if IsNotLowerVersion(currentVersion, minVersion) then
Result := True
else begin
MsgBox('Установка Прекращена:' \
+ #13#13'Версия файла `' + ExtractFileName(fileName) + '`: ' + TFileVerToString(currentVersion) \
+ #13#13'Требуется версия как минимум: ' + TFileVerToString(minVersion) \
, mbCriticalError, MB_OK);
Result := False;
end;
end;


add:
Улучшенная версия на следующей странице (http://forum.oszone.net/post-2904032.html#post2904032)

Iska
07-01-2020, 20:27
<-- убрать пробелы!!! (защита от форумного парсера) »
Защита от парсера — тэг BBCode «noparse»:
[Setup]
AppName=testApp
AppVersion=0.1
DisableWelcomePage=yes
DefaultDirName={tmp}\testApp
OutputDir=.
OutputBaseFilename=testApp
PrivilegesRequired=lowest

[Code]
type
TFileVer = array[1..4] of Integer;

Dodakaedr
07-01-2020, 21:01
Сам Test.ехе имеет версию файла 1.3, так вот собствинно вопрос - как при обновлении проверить версию файла Test.ехе, и в случае если версия файла Test.ехе ниже 1.3, прекратить установку виводя собщение. »
Если есть желание и возможность, то проверьте мой код на практичность (только что сочинил, не тестировал).
Код проверяет первые три цифры.


[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
function CompareVersion(s1, s2: string): integer;
var
iVer1, iVer2, iVer3, iVer4, cVer1, cVer2, cVer3, cVer4, tmp: string;
begin
Result := -1;
iVer1 := Copy(s1, 0, Pos('.', s1)-1);
tmp := Copy(s1, Pos(iVer1, s1)+Length(iVer1)+1, Length(s1));
iVer2 := Copy(tmp, 0, Pos('.', tmp)-1);
tmp := Copy(s1, Pos(iVer2, s1)+Length(iVer2)+1, Length(s1));
iVer3 := Copy(tmp, 0, Pos('.', tmp)-1);
iVer4 := Copy(s1, Pos(iVer3, s1)+Length(iVer3)+1, Length(s1));
cVer1 := Copy(s2, 0, Pos('.', s2)-1);
tmp := Copy(s2, Pos(cVer1, s2)+Length(cVer1)+1, Length(s2));
cVer2 := Copy(tmp, 0, Pos('.', tmp)-1);
tmp := Copy(s2, Pos(cVer2, s2)+Length(cVer2)+1, Length(s2));
cVer3 := Copy(tmp, 0, Pos('.', tmp)-1);
cVer4 := Copy(s2, Pos(cVer3, s2)+Length(cVer3)+1, Length(s2));
if (StrToInt(iVer1) > StrToInt(cVer1)) then Result := 1 else
if (StrToInt(iVer1) = StrToInt(cVer1)) then
if (StrToInt(iVer2) > StrToInt(cVer2)) then Result := 1 else
if (StrToInt(iVer2) = StrToInt(cVer2)) then
if (StrToInt(iVer3) > StrToInt(cVer3)) then Result := 1 else
if (StrToInt(iVer3) = StrToInt(cVer3)) then
if (StrToInt(iVer4) > StrToInt(cVer4)) then Result := 1 else
if (StrToInt(iVer1) = StrToInt(cVer1)) then
if (StrToInt(iVer2) = StrToInt(cVer2)) then
if (StrToInt(iVer3) = StrToInt(cVer3)) then
if (StrToInt(iVer4) = StrToInt(cVer4)) then Result := 0;
end;

function InitializeSetup(): Boolean;
var
sFile, sVer: string;
begin
sFile := ExpandConstant('{reg:HKLM\SOFTWARE\Test,PATH_APPLICATION}\Test.exe');
Result := FileExists(sFile);
if not result then MsgBox('Установка прекращена, Test.ехе не найден', mbCriticalError, MB_OK) else
begin
GetVersionNumbersString(sFile, sVer);
if CompareVersion(sVer, '1.3.0.0') > 0 then Result := True else
begin
MsgBox('Установка прекращена, не соответствует версия', mbCriticalError, MB_OK);
Result := False;
end;
end;
end;

Beavimo
08-01-2020, 08:39
iglezz, cпасибо что откликнулся :000: попробую разобраться, может вырву кусок кода и попробую склеить со своим, а сорян вижу тут уже склейку зделал :Beer:..... сча заценим если прокатит буду пробывать как нить уменшыть код, люблю кода всьо простинько и красивинько

Beavimo
08-01-2020, 10:31
Код от iglezz прекрасно отрабатывает первые три значения версии. Я пока ковыряю код дабы упростить его, если че получится выложу сюда.... Но у меня есть еще один вопрос, думаю что без стороннего софто зделать не реально, но спрошу у вас знатоков.... Когда компилируется файл.exe, в его описании всегда в конце приписка Setup, можна както от нее избавится, или написать чот своё?

iglezz
08-01-2020, 14:56
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;

В виде файлов можно скачать здесь (https://github.com/iglezz/INNO-related-things).

2. Когда компилируется файл.exe, в его описании всегда в конце приписка Setup, можна както от нее избавится, или написать чот своё? »
[Setup]
OutputBaseFileName=ИмяФайла ; будет скомпилировано в `ИмяФайла.exe`
VersionInfoDescription=МоёОписание ; установить Описание (FileDescription) в `МоёОписание`

Beavimo
08-01-2020, 17:16
iglezz, братюня ну ты и дал стране угля поборол даже такую версию 4,49,1,356..... :up

Beavimo
09-01-2020, 15:59
iglezz Немножко уменьшил код, и добавил функцию проверки максимальной версии, на которую можна установить свой апдейт, мож кому пригодится. Работает з доп. модулем и подключением через функцыю #include тыць (https://github.com/iglezz/INNO-related-things)
Файл FileVersion.iss (разместить рядом с основным скриптом), и в скрипте подключить етот файл #include "FileVersion.iss"
Вот сам скрипт
#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 вывести сообщение Програма уже установлена Хотите установить (ДА\НЕТ)

Чот сочинил но пока безрезультатно

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;

iglezz
10-01-2020, 00:57
Beavimo,
GetSHA1OfUnicodeString служит для получения хэша строки, что и отображено в названии функции, для файла надо использовать GetSHA1OfFile

Beavimo
10-01-2020, 13:56
iglezz, всеравно ничерта у меня не получается, инсталятор всьо время ругается, я методом перебора пробую чот сочинить, а понять как оно работает не могу, ети все (if, if not, then, begin, else, var, и другие)

[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;

тут два варианта, или не компилируется, или устанавливается без проверки хеш сум.... может поможеш разобратся.

iglezz
10-01-2020, 14:49
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;


я методом перебора пробую чот сочинить, а понять как оно работает не могу, ети все (if, if not, then, begin, else, var, и другие) »
Учебник по Паскалю и вечер-два помогут понять, как оно работает, тут совсем базовые вещи используются.

Beavimo
10-01-2020, 18:26
iglezz,

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;


Пример работает, но програма не устанавливается, а нужно чтоб она уставливалась всегда без сообщений, а когда хеш равны выводилось смс (ДА\НЕТ), и только если пользователь нажмет (НЕТ) тогда прекратить установку. Извини что я так бузю, хочу понять как оно работает, но самому никак, нужна муза, а ты для меня как учитель (Спасибо)...

iglezz
10-01-2020, 19:24
Beavimo, Отписал в личку

Дальнейшее обсуждение скриптов стоит перенести в тему Скрипты Inno Setup. Помощь и советы [часть 9] (http://forum.oszone.net/thread-334142-45.html), а то мы что-то отвлеклись....

Beavimo
10-01-2020, 19:30
iglezz, понял :sorry:

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.

чтобы сразу наглядно видить результат?

iglezz
10-01-2020, 19:48
Beavimo, Это сюда - Программирование и базы данных (http://forum.oszone.net/forum-21.html)

Личку чистить надо, тогда будет отправляться -- лимит сообщений

Скачай и установи http://pascalabc.net
Потом прекращаем здесь оффтопить :)

Iska
10-01-2020, 23:16
Скачай и установи http://pascalabc.net »
Именно этот — не рекомендую. Лучше зараз брать чистый FreePascal и книжку.

Beavimo
10-01-2020, 23:44
iglezz, все последний раз, тут со своим скриптом :closed-to по ушам попрошу не бить, я просто на радостях. выложу робочий скрипт на проверку хеш мож кому пригодится.

function InitializeSetup(): Boolean;
var
FileName: String;
SHA1: String;
begin
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';
Result := FileExists(FileName);
SHA1 := GetSHA1OfFile(FileName);
if SHA1 = 'ad030d5606a2dcfa75ebc425a70730f23e7f07ab' then // буквы должны быть маленькими
begin
Result := MsgBox('Программа уже Установлена' #13#13 'Продолжить Установить?', mbInformation, MB_YESNO) = IDYES;
end
else
begin
end
end;

iglezz
11-01-2020, 00:09
Beavimo, Комментарий здесь (http://forum.oszone.net/post-2904472.html#post2904472).

Bio_Hazard
18-02-2020, 18:44
Здравствуйте!
Помогите сделать проверку, запущенны ли процессы XXX.exe, YYY.exe, ZZZ.exe. Если ни один процесс не запущен, продолжить установку. Если запущен хотя-бы один процесс, вывести окно с сообщением, какие процессы запущены и 2мя кнопками: остановить установку и закрыть процессы и продолжить установку.
Спасибо!

Gnom_aka_Lexander
18-02-2020, 18:48
Bio_Hazard, Скрипты Inno Setup. Помощь и советы (http://forum.oszone.net/thread-334142-58.html) - шапка - ссылки на примеры скриптов - в самом низу пара вариантов.




© OSzone.net 2001-2012