PDA

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


Страниц : 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Nemko
11-01-2020, 21:09
Beavimo, думаю так:

#define NeedSHA "ad030d5606a2dcfa75ebc425a70730f23e7f07ab"

[Setup]
AppName=My Application
AppVersion=1.5
CreateAppDir=no

[Code]
function InitializeSetup: Boolean;
var
FileName: PAnsiChar;
begin
FileName:=ExpandConstant('{reg:HKLM\SOFTWARE\Code, PATH_APPLICATION}')+'\Test.exe';
if not FileExists(FileName) then begin
MsgBox('Установка Прекращена' #13#13 'Установите сначала Программу!', mbCriticalError, MB_OK);
Result:=False;
end else begin
if (GetSHA1OFFile(FileName) = Lowercase('{#NeedSHA}')) then Result:=MsgBox('Программа уже Установлена' #13#13 'Продолжить Установить?', mbInformation, MB_YESNO) = IDYES
else Result:=True;
end;
end;
#define NeedSHA "ad030d5606a2dcfa75ebc425a70730f23e7f07ab"

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

[Code]
var
StartImstall: Boolean;

function InitializeSetup: Boolean;
var
FileName: PAnsiChar;
begin
FileName:=ExpandConstant('{reg:HKLM\SOFTWARE\Code, PATH_APPLICATION}')+'\Test.exe';
if not FileExists(FileName) then begin
MsgBox('Установка Прекращена' #13#13 'Установите сначала Программу!', mbCriticalError, MB_OK);
Result:=False;
end else begin
if (GetSHA1OFFile(FileName) = Lowercase('{#NeedSHA}')) then Result:=MsgBox('Программа уже Установлена' #13#13 'Продолжить Установить?', mbInformation, MB_YESNO) = IDYES
else begin
StartImstall:=True; Result:=StartImstall;
end;
end;
end;

procedure InitializeWizard;
begin
WizardForm.Show; //без этой строчки не фунциклирует
end;

function ShouldSkipPage(CurPageID: Integer): Boolean;
begin
case CurPageID of
wpReady,wpInstalling,wpFinished: Result:=False; // если надо, можно пропустить все страницы
else Result:=True;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID = wpReady) and StartImstall then WizardForm.NextButton.OnClick(nil);
end;

Iska
11-01-2020, 22:20
Всё куда проще »
Это в чём?

Beavimo
11-01-2020, 22:45
Nemko, а как склеить два разных CODE???

function InitializeSetup(): Boolean;
var
FileName: PAnsiChar;
begin
FileName:=ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';
if not FileExists(FileName) then begin
MsgBox('Установка Прекращена', mbCriticalError, MB_OK);
Result:=False;
end
else begin
if (GetSHA1OFFile(FileName) = Lowercase('ad030d5606a2dcfa75ebc425a70730f23e7f07ab')) then
Result:=MsgBox('Программа уже Установлена' #13#13 'Продолжить Установить?', mbInformation, MB_YESNO) = IDYES
else
Result:=True;
end
end;

+

// Подключаем внешнюю библиотеку:
#include "FileVersion.iss"
function InitializeSetup(): Boolean;
var FileName: String; CurrentVersion, MinVersion: TFileVersion; begin

// Задаём минимальную версию:
FileVersionSetI(MinVersion, 1,3,0,0);

// Имя файла:
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';

if Not FileExists(FileName) then begin
MsgBox('Установите Программу:', 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\Code,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;

сама библиотека тут (https://github.com/iglezz/INNO-related-things)

Nemko
12-01-2020, 12:45
Beavimo, держите, модуль FileVersion.iss нужно класть рядом:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={sd}\My Application

[Modules]
#include "FileVersion.iss"

[*Code]
function InitializeSetup: Boolean;
var
FileName: PAnsiChar;
CurrentVersion, MinVersion: TFileVersion;
begin
FileVersionSetI(MinVersion, 1, 3, 0, 0);
FileName:=ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}')+'\Test.exe';
if not FileExists(FileName) then begin
MsgBox('Установка прекращена.'+#13+'Отсутствует файл программы.', mbCriticalError, MB_OK);
Result:=False;
end else begin
FileVersionSetF(CurrentVersion, FileName);
case FileVersionCompare(CurrentVersion, MinVersion) of
-1: begin
MsgBox ('Установка прекращена!'+#13+'Версия установленной программы: '+FileVersionToStr(CurrentVersion)+#13+'Минимальная версия для обновления: '+FileVersionToStr(MinVersion), mbCriticalError, MB_OK);
Result:=False;
end;
0: begin
if (GetSHA1OFFile(FileName)=Lowercase('ad030d5606a2dcfa75ebc425a70730f23e7f07ab')) then Result:=MsgBox('Программа уже установлена!'+#13+'Продолжить установку?', mbInformation, MB_YESNO) = IDYES
else Result:=True;
end;
1: begin
MsgBox('Установка прекращена!'+#13+'Версия установленной программы: '+FileVersionToStr(CurrentVersion)+#13+'Максимальная версия для обновления: '+FileVersionToStr(MinVersion), mbCriticalError, MB_OK);
Result:=False;
end;
end
end;
end;

Beavimo
12-01-2020, 16:28
Nemko,
Спасибо братюня.... Как думаешь с чего стоить начать изучать программирование? Если начать с Паскаля потом на С+ или сразу с С+?
Просто я самоучка, и метод у меня всегда с конца, я буду сравнивать примеры дабы понять смысл, а уже потом полезу в документацию, потому как значения меня пугают, а так если пойму суть как оно работает тогда зацеп пойдет, так вот собствинно дилема в том что суть языков Паскаль и С+ одна, токо значение разные, или принцыпи работы разные?
А чуть не забыл! Дело в том что в своем примере, я мого задавать порог минимальной и максимальной версии, а тут банально устанавливается, только на заданую версию.

Iska
12-01-2020, 16:41
с чего стоить начать изучать программирование? »
С ассемблера. Потом и C++ пойдёт лучше.

Nemko
12-01-2020, 19:28
Beavimo, теперь FileVersion.iss можно выкинуть в урну, он не нужен, плюс прикрутил проверку на соответствие PE-формату (типа если открывать не .exe). Так же диапазон версий настраивается в начале, хеш там же.
#define AppHash "ad030d5606a2dcfa75ebc425a70730f23e7f07ab"; хэш
#define AppFile "Test.exe"; имя файла
#define MinVers "1.0.0.0"; минимальная версия
#define MaxVers "1.4.0.0"; максимальная

[Setup]
AppName=My Application
AppVersion=1.5
CreateAppDir=no

[CustomMessages]
Error_01=Отсутствует файл {#AppFile}.
Error_02=Минимальная версия для обновления: {#MinVers},%nТекущая версия:
Error_03=Максимальная версия для обновления: {#MaxVers},%nТекущая версия:
Error_04=Файл {#AppFile} не соответствует PE-формату.
Information_01=Программа уже установлена!%nПродолжить установку?

[*Code]
#define A = (Defined UNICODE) ? "W" : "A"

const
DONT_RESOLVE_DLL_REFERENCES = $1;
LOAD_LIBRARY_AS_DATAFILE = $2;

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';

function copy_Int(s: String): Integer;
var
i: Integer;
tmpS: String;
begin
for i:=1 to Length(s) do if StrToInt(s[i])<>-1 then tmpS:=tmpS+s[i];
if StrToInt(tmpS)<>-1 then Result:=StrToInt(tmpS);
end;

function Compare(aFile: PAnsiChar; aHash, aMinVers, aMaxVers: String): Boolean;
var
CurrentVersion: String;
begin
if not FileExists(aFile) then begin
MsgBox(CustomMessage('Error_01'), mbCriticalError, MB_OK);
Result:=False;
end else begin
if LoadLibraryEx(aFile, 0, LOAD_LIBRARY_AS_DATAFILE+DONT_RESOLVE_DLL_REFERENCES)=0 then begin
MsgBox(CustomMessage('Error_04'), mbCriticalError, MB_OK);
Exit;
end;
GetVersionNumbersString(aFile, CurrentVersion);
if (copy_Int(CurrentVersion)<=copy_Int('{#MaxVers}')) and (copy_Int(CurrentVersion)>=copy_Int('{#MinVers}')) then begin
if (GetSHA1OFFile(aFile)=Lowercase('{#AppHash}')) then Result:=MsgBox(CustomMessage('Information_01'), mbInformation, MB_YESNO) = IDYES
else Result:=True;
end else begin
if (copy_Int(CurrentVersion)<copy_Int('{#MinVers}')) then MsgBox(CustomMessage('Error_02')+' '+CurrentVersion+'.', mbCriticalError, MB_OK)
else MsgBox(CustomMessage('Error_03')+' '+CurrentVersion+'.', mbCriticalError, MB_OK);
Result:=False;
end;
end;
end;

function InitializeSetup: Boolean;
begin
Result:=Compare(ExpandConstant('{reg:HKLM\SOFTWARE\Code, PATH_APPLICATION}'+'\{#AppFile}'), '{#AppHash}', '{#MinVers}', '{#MaxVers}');
end;

P.S.: на счет языков программирования, решайте сами, но ИМХО лучше (проще) забить на это дело и пойти проветритьса на улицу.

El Sanchez
13-01-2020, 14:36
теперь FileVersion.iss можно выкинуть в урну, он не нужен »
Nemko, ваш код сдохнет на проверке версии 111.222.333.444 и скажет, что в 1.4.0.10 > 1.5.0.0 нет ничего страшного.

Beavimo
14-01-2020, 07:53
Nemko, код кривой полюбому.... если у файла Test.exe атрибут только чтение начинается бред, никакие флаги не помогают.

Beavimo
14-01-2020, 11:08
Вот так все робит :yahoo:


function InitializeSetup(): Boolean;
var FileName: String; CurrentVersion, MinVersion, MaxVersion: TFileVersion; begin

FileVersionSetI(MinVersion, 1,1,0,0);
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,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(MaxVersion, 1,5,0,0);
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';

FileVersionSetF(CurrentVersion, FileName);
if FileVersionCompare(CurrentVersion, MaxVersion) < 1 then
Result := True else
begin MsgBox('Установка Прекращена!' #13#13 'Версия Установленной Программы: ' +FileVersionToStr(CurrentVersion) +#13#13 'Максимальная Версия для Обновления: ' +FileVersionToStr(MaxVersion), mbCriticalError, MB_OK);
Result := False; Exit;
end;

begin if (GetSHA1OFFile(FileName) = Lowercase('AD030D5606A2DCFA75EBC425A70730F23E7F07AB')) then
Result:=MsgBox('Обновление уже установлено:' #13#13 'Все равно установить?', mbInformation, MB_YESNO) = IDYES;
end;
end;

iglezz
14-01-2020, 12:11
Единственный косяк, когда хеш равни выскакивает СМС мол программа установлена установить (ДА\НЕТ?), так что не нажми всеравно установка продолжиться.
Я уже задолбался, если че - зделаю просто СМС придуприждение. Незнаю как боротся, ставлю Result := False; Exit; так она ваапще не запускается при разных хеш. »
Неудивительно. Такой неструктурированный винегрет невозможно читать.

Приводим код в порядок и сразу видим место где косяк зарыт:function InitializeSetup(): Boolean;
var
FileName: String;
CurrentVersion, MinVersion, MaxVersion: TFileVersion;

begin
FileVersionSetI(MinVersion, 1,2,0,0);
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code}') + '\Test.exe';
if not FileExists(FileName) then begin
MsgBox('Установка Прекращена:' #13#13 'Файл (' + ExtractFileName(FileName) + ') не найден!', mbCriticalError, MB_OK);
Result := False;
Exit;
end;

FileVersionSetF(CurrentVersion, FileName);
if (GetSHA1OFFile(FileName) = Lowercase('AD030D5606A2DCFA75EBC425A70730F23E7F07AB')) then
// Здесь идёт простое присваивание True/False:
// Result:=MsgBox('Обновление уже установлено:' #13#13 'Все равно установить?', mbInformation, MB_YESNO) = IDYES;
// хотя в случае False надо Exit делать. Поэтому сия строчка выкидывается и
// вместо неё пишется:
if MsgBox('Обновление уже установлено:' #13#13 'Все равно установить?', mbInformation, MB_YESNO) <> IDYES then begin
Result := False;
Exit;
end;

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(MaxVersion, 1,4,0,0);
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code}') + '\Test.exe';
FileVersionSetF(CurrentVersion, FileName);

if FileVersionCompare(CurrentVersion, MaxVersion) < 1 then
Result := True
else begin
MsgBox('Установка Прекращена!' #13#13 'Версия Установленной Программы: ' + FileVersionToStr(CurrentVersion) + #13#13 'Максимальная Версия для Обновления: ' + FileVersionToStr(MaxVersion), mbCriticalError, MB_OK);
Result := False;
Exit;
end;

end;

Напоминание №2 о форматировании:
В каталоге установленного Inno Setup есть каталог Examples. Там в примерах стоит посмотреть как надо форматировать код, чтобы у него читабельность была на таком уровне, когда структура видна беглым взглядом.

Beavimo
14-01-2020, 12:34
iglezz, согласен надо делать отступи.... я уже как то добил сам теперь работает как надо.... пойду дальше, хочу свою форму зделать... счас думаю как бы то область обвиденною красным залить заливкой, или вставить свой рисунок
https://i111.fastpic.ru/thumb/2020/0114/20/_be4193f50b1b18eaf6006b1faba3ed20.jpeg (https://fastpic.ru/view/111/2020/0114/_be4193f50b1b18eaf6006b1faba3ed20.jpg.html)

Iska
14-01-2020, 17:42
Beavimo, хотите бесплатный совет? Чем меньше Вы будете заморачиваться подобными, никому не нужными, свистоперделками рюшечками, и чем больше Вы уделите внимания функционалу и поддержке — тем будет лучше для конечного результата.

Nordek
14-01-2020, 17:43
Это в чём? »В расширенной врсии, Inno у меня старой версии 5.5.1.
Пробовал 6.0.3 - Что-то совсем не проникся.
По сравнению с 6.0.2 - Расширенная Inno 5.5.1 так не уязвима к взломам/распаковке.
6.0.3 кривая, раз 5 перекомпилировал чтоб собрать пакет - Иначе на выходе готового пакета в разных местах выводило ошибку.
И т.д.
Лучше NSIS использовать чем Inno 6, ещё лучше на делфи инсталлятор писать.

Iska
14-01-2020, 18:19
В расширенной врсии, »
Хмм… А что за редактор-то?

Nordek, даже не знал, что уже шестая вышла.

Nordek
14-01-2020, 21:28
А что за редактор-то? »
ispack-5.5.1.exe (http://files.jrsoftware.org/ispack/ispack-5.5.1.exe) и ispack-5.5.1-unicode.exe (http://files.jrsoftware.org/ispack/ispack-5.5.1-unicode.exe) + инструкция из сообщения (http://forum.oszone.net/post-1201499-1.html) темы (http://forum.oszone.net/thread-148707.html)

Или информация во вложении.
даже не знал, что уже шестая вышла. »Расширенной 6 версии не существует.

Beavimo
17-01-2020, 17:49
Добрый день, такая строка делает ярлык с параметром на рабочем столе:

[Icons]
Name: "{commondesktop}\BASE"; Filename: "C:\Program Files\BASE\BASE.bat"; Parameters:test; IconFilename: "C:\Program Files\BASE\BASE.ico"

получается в графе Обьект
Обьект: "C:\Program Files\BASE\BASE.bat" test
а как зделать чтоб было вот так
Обьект: test "C:\Program Files\BASE\BASE.bat"

boss911
17-01-2020, 18:02
Отключил все страницы, кроме SelectDirPage, на SelectDirPege вынес ProgressGauge (прогресс бар). Как отключить страницу установки (wpInstalling) и возможно ли? Задача оставить только SelectDirPage и прогресс бар на ней.

El Sanchez
18-01-2020, 11:19
Задача оставить только SelectDirPage и прогресс бар на ней. »
boss911, как-то так:
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall: WizardForm.SelectDirPage.Show;
end;
end;

habib2302
18-01-2020, 12:21
Доброе время суток. Помогите решить проблему. Во время компиляции выпадает ошибка

https://a.radikal.ru/a00/2001/47/7ab5d20bcaa4.png (https://b.radikal.ru/b12/2001/f5/a40025d3b767.jpg)




© OSzone.net 2001-2012