Скрипты Inno Setup. Помощь и советы [часть 9]
-
generator324
-
El Sanchez
Re: Скрипты Inno Setup. Помощь и советы [часть 9]
Nemko, а как склеить два разных CODE???
Code
[spoiler]Код: [/spoiler]
+
Code
[spoiler]// Подключаем внешнюю библиотеку:
#include "FileVersion.iss"
Код: [/spoiler]
сама библиотека
Code
[spoiler]Код: [/spoiler]
Код: Выделить всё
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;+
Code
[spoiler]// Подключаем внешнюю библиотеку:
#include "FileVersion.iss"
Код: [/spoiler]
Код: Выделить всё
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;сама библиотека
тут
-
generator324
Re: Скрипты Inno Setup. Помощь и советы [часть 9]
Beavimo, держите, модуль FileVersion.iss нужно класть рядом:
Скрытый текст
[spoiler]Код: [/spoiler]
Скрытый текст
[spoiler]Код: [/spoiler]
Код: Выделить всё
[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;-
Iska
Re: Скрипты Inno Setup. Помощь и советы [часть 9]
Цитата Beavimo:
с чего стоить начать изучать программирование?
С ассемблера. Потом и C++ пойдёт лучше.
с чего стоить начать изучать программирование?
Скрипты Inno Setup. Помощь и советы [часть 9]
С ассемблера. Потом и C++ пойдёт лучше.
-
generator324
Re: Скрипты Inno Setup. Помощь и советы [часть 9]
Beavimo, теперь FileVersion.iss можно выкинуть в урну, он не нужен, плюс прикрутил проверку на соответствие PE-формату (типа если открывать не .exe). Так же диапазон версий настраивается в начале, хеш там же.
Скрытый текст
[spoiler][/spoiler]
P.S.: на счет языков программирования, решайте сами, но ИМХО лучше (проще) забить на это дело и пойти проветритьса на улицу.
Скрытый текст
[spoiler]
Код: Выделить всё
#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.: на счет языков программирования, решайте сами, но ИМХО лучше (проще) забить на это дело и пойти проветритьса на улицу.
-
Kanteren
Re: Скрипты Inno Setup. Помощь и советы [часть 9]
Цитата Nemko:
теперь FileVersion.iss можно выкинуть в урну, он не нужен
Nemko, ваш код сдохнет на проверке версии 111.222.333.444 и скажет, что в 1.4.0.10 > 1.5.0.0 нет ничего страшного.
теперь FileVersion.iss можно выкинуть в урну, он не нужен
Скрипты Inno Setup. Помощь и советы [часть 9]
Nemko, ваш код сдохнет на проверке версии 111.222.333.444 и скажет, что в 1.4.0.10 > 1.5.0.0 нет ничего страшного.
-
El Sanchez
Re: Скрипты Inno Setup. Помощь и советы [часть 9]
Nemko, код кривой полюбому.... если у файла Test.exe атрибут только чтение начинается бред, никакие флаги не помогают.
-
Adjective
Re: Скрипты Inno Setup. Помощь и советы [часть 9]
Буквально дублирую предыдущий вопрос:
Как удалить ветку реестра во время и после установки?
Код:
При запуске программа сама создает по этому адресу раздел и хранит все свои настройки в нем, а после удаления, этот раздел остаётся!
Если прописать так:
Код:
... то при установке создаётся пустой раздел и при удалении он удаляется. Но что-то мне подсказывает, что это не правильно
.
Насколько я понимаю значимость в этой ветке несёт только значение S-1-5-21, а остальное это путь к профилю и он отличается у всех на ПК.
Заранее благодарен за любую помощь.
Как удалить ветку реестра во время и после установки?
Код:
Код: Выделить всё
[HKEY_USERS\S-1-5-21-3472633682-696082676-122184224-500\Software\MyProgramr]При запуске программа сама создает по этому адресу раздел и хранит все свои настройки в нем, а после удаления, этот раздел остаётся!
Если прописать так:
Код:
Код: Выделить всё
Root: HKU; Subkey: "S-1-5-21-3472633682-696082676-122184224-500\Software\MyProgramr"; MinVersion: 0.0,5.0; Flags: uninsdeletekey... то при установке создаётся пустой раздел и при удалении он удаляется. Но что-то мне подсказывает, что это не правильно
.Насколько я понимаю значимость в этой ветке несёт только значение S-1-5-21, а остальное это путь к профилю и он отличается у всех на ПК.
Заранее благодарен за любую помощь.