Написание скрипта для инсталлятора

  • Автор темы Kindly
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

Kindly

(Вопрос по Inno Setup 5) Я извиняюсь за вопрос немножко не в тему. Меня интереcует написание скрипта на Pascal следующего характера: Перед запуском инсталлятора нужна проверка реестра на определённый ключ, и если он существует - должен запускаться мастер инсталляции, а если ключ не существует, то должна вылетать мессага, что прога не найдена - жмите OK чтобы покинуть мастер (ну или другой текст). Вобщем вы программеры - для вас скриптик или только секцию кода написать не составит труда. Поможете такому как мне?
mailto:gubei_vadim@list.ru
 
Z

zubr

Пример проверки инсталлятором установлена ли в системе Delphi, если нет, то инсталляция завершается:
Код:
function InitializeSetup(): Boolean;
begin
Result:=True;
If (not RegKeyExists(HKLM, 'SOFTWARE\Borland\Delphi\5.0')) and
(not RegKeyExists(HKLM, 'SOFTWARE\Borland\Delphi\6.0')) and
(not RegKeyExists(HKLM, 'SOFTWARE\Borland\Delphi\7.0')) then
begin
MsgBox('Not found Delphi on our computer', mbError, mb_Ok);
Result:=False;
end;
end;
 
K

Kindly

zubr, спасибо огромное:). Классно у Вас, программеров, всё получается! Может покажусь слишком наглым, но позвольте спросить ещё про одну фичу...
Например, я создал русификатор, который поместил в инсталлятор (Inno Setup 5). Проверка на ключ прошла успешно, путь установки также взят из реестра - жмём "Установить"///
Вопрос следующий: имеется ли возможность у самого инсталлятора проверять наличие определённого файла в папке назначения после нажатия кнопки "Установить". Например, если файл отсутствует (который должен проверяться) - должно появиться сообшение "Выбрана неверная папка!" (или т.п.). Если не трудно, опишите это, пожалуйста, на примере - этим Вы поможете многим локализаторам софта.
Ну, и чтобы лишний раз не постить, спрошу; если вышеописанная функция возможна, то возможна ли проверка требуемого файла (в папке назначения) на такие атрибуты как размер и CRC сумма?
 
Z

zubr

Вопрос следующий: имеется ли возможность у самого инсталлятора проверять наличие определённого файла в папке назначения после нажатия кнопки "Установить". Например, если файл отсутствует (который должен проверяться) - должно появиться сообшение "Выбрана неверная папка!" (или т.п.).
Такая возможность есть. Вот пример кода, где имя файла www.sss:
Код:
[Code]

function NextButtonClick(CurPage: Integer): Boolean;
var
 s:string;
begin
Result:=True;
If CurPage=5 then
begin
 If FileSearch('www.sss', ExpandConstant('{app}'))='' then
 begin
  s:='В каталоге '+ExpandConstant('{app}')+' файл www.sss отсутствует!';
  MsgBox(s, mbError, mb_Ok);
  Result:=False;
 end;
end;
end;
Здесь CurPage=5. Определить CurPage можно в отладке. Запускаешь процесс инсталляции в InnoSetup клавишей F7, когда шаг доходит до строки CurPage, наводишь на нее курсор, всплывающая подсказка покажет значение CurPage.
если вышеописанная функция возможна, то возможна ли проверка требуемого файла (в папке назначения) на такие атрибуты как размер и CRC сумма?
В самом InnoSetup это невозможно, но можно сделать программку, которая будет находиться в дистрибутиве и при установке запускаться программой установки, выполнив соответствующие проверки, удаляться.
 
K

Kindly

В самом InnoSetup это невозможно, но можно сделать программку, которая будет находиться в дистрибутиве и при установке запускаться программой установки, выполнив соответствующие проверки, удаляться.
В смысле, внешняя программка сначала будет загружаться и, обнаружив файл, проверит, например, CRC сумму и выдаст сообщение, например "У вас программа соответствующей версии. Запустить мастер установки?"
Или эта программка будет вызываться инсталлятором для проверки непосредственно перед самим процессом инстялляции, и после проверки будет ли программка посылать ответ инталлятору, который будет принимать соответствующие дейтвия?
zubr Вы из Беларуси? Я - да. Вы уже в курсе дела, может договоримся о написании Вами этой программки?
 
Z

zubr

В смысле, внешняя программка сначала будет загружаться и, обнаружив файл, проверит, например, CRC сумму и выдаст сообщение, например "У вас программа соответствующей версии. Запустить мастер установки?"
Эта программка будет запакована в инсталляционный файл вместе с другими файлами инсталляционного пакета.
Или эта программка будет вызываться инсталлятором для проверки непосредственно перед самим процессом инстялляции, и после проверки будет ли программка посылать ответ инталлятору, который будет принимать соответствующие дейтвия?
Лучше всего сделать, чтобы мастер установки запускал эту программку проверки, когда юзер выбрал каталог, куда будет устанавливаться ваша программа. Программка выполнит проверки, и в зависимости от результатов выполнит соответствующие действия (даст возможность продолжить процесс установки; выдаст сообщение о невозможности дальнейшей установки и остановит процесс установки и т. п.)
Я тоже из Беларуси. Напишите мне rozin@tut.by
 
K

Kindly

Пока я думаю, как правильно сформулировать свою просьбу, позвольте задать ещё один вопрос:
Как сделать чтобы при перезаписи оригинальных файлов создавались их резервные копии (у меня получались резервные копии тех файлов, которые были в инсталляторе). Причём резервные файлы чтобы сохранялись в папку, например: "backup", без переименования расширений. И возможно ли сделать так, чтобы пользователю предоставлялась возможность в самом инсталляторе предварительно отметить/поставить галочку на это действие (на подобии как в патчере-инсталляторе PatchWise Free)?
 
Z

zubr

Как сделать чтобы при перезаписи оригинальных файлов создавались их резервные копии (у меня получались резервные копии тех файлов, которые были в инсталляторе).
Опять таки искать файл и если он есть, создать папку "backup", к примеру, в том же каталоге куда устанавливается программа, и скопировать файл в "backup". Все это можно сделать средствами InnoSetup.
И возможно ли сделать так, чтобы пользователю предоставлялась возможность в самом инсталляторе предварительно отметить/поставить галочку на это действие (на подобии как в патчере-инсталляторе PatchWise Free)?
Можно через компоненты.
У меня на работе под рукой Inno Setup нет, подробнее смогу, если время будет вечером.
 
Z

zubr

Код:
[Components]
Name: "Backup"; Description: "Backup"; Types: full

[Files]
Components: Backup; Source: "MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: MyProgCheck

[Code]

function MyProgCheck():boolean;
var
 s1, s2:string;
begin
Result:=True;
s1:=ExpandConstant('{app}')+'\MyProg.exe';
s2:=ExpandConstant('{app}')+'\Backup';
If FileExists(s1) then
begin
CreateDir(s2);
FileCopy(s1, s2+'\MyProg.exe', False);
end;
end;
Здесь файл MyProg.exe и есть с которого делается копия.
 
K

Kindly

Долго не имел возможности ответить, поэтому сейчас выражаю безразмерную благодарность за оказанную Вами, zubr, помощь. Что касается "окончательного" вопроса, так он состоит в следующем:
Можно ли в Inno Setup произвести деинсталляцию так, чтобы при удалении установленных файлов, при предварительном создании резервных копий перезаписываемых файлов, резервные файлы восстанавливались на свои прежние места, а сама папка (резервных файлов) удалялась?
 
Z

zubr

Чисто средствами Inno Setup такое не получится. Это надо будет делать свой UnInstall.exe, а в проекте Inno Setup сделать следующее:
Код:
[Files]
Source: "MyProg.exe"; Flags: onlyifdoesntexist uninsneveruninstall
Source: "UnInstall.exe"

[UninstallRun]
Filename: "{app}\UnInstall.exe"
 
K

Kindly

Спасибо большое! Благодаря Вам я узнал всё то, что меня интересовало по данной теме. Хорошо хоть "земляки" откликнулись, а то на российских форумах молчат =).
 
K

Kindly

У меня всё ещё появилось два вопроса следующего содержания.
1. Всё-таки сохранение резервных файлов через Компоненты влечёт добавление в инсталлятор дополнительных файлов, из-за чего размер инсталлятора может оказаться довольно большим. Вопрос состоит в том, как изменить расширения перезаписываемых оригинальных файлов, например, на *.bak или *.exe.bak при перезаписи обновлёнными (чтобы без добавлеине резервируемых файлов)?
2. В Inno Setup 5 всё-таки имеется функция подсчёта размера файла. Только я не въезжаю как секцию правильно написать. В хелпе написано следующее:

Образец:
function FileSize(const Name: String; var Size: Integer): Boolean;
Описание:
Задаёт Size - размер указанного файла в байтах. Возвращает True, если размер файла задан успешно, иначе возвращает False.

Помогите, пожалуйста, вписать вышеупомянутую функцию так, чтобы она выполняла проверку уже после нажатия кнопки "Установить", т.е. перед самим процессом инсталляции и так, чтобы при несоответствии размера вылетало собщение, после которого мастер установки прекращал дальнейшие действия, или чтобы данная проверка запускалась сразу после проверки на наличие определённого файла в папке с программой.
 
Z

zubr

Всё-таки сохранение резервных файлов через Компоненты влечёт добавление в инсталлятор дополнительных файлов, из-за чего размер инсталлятора может оказаться довольно большим. Вопрос состоит в том, как изменить расширения перезаписываемых оригинальных файлов, например, на *.bak или *.exe.bak при перезаписи обновлёнными (чтобы без добавлеине резервируемых файлов)?
Непонятно какие файлы на какие вы будете перезаписывать, если в инсталляторе ничего не будет.
В Inno Setup 5 всё-таки имеется функция подсчёта размера файла. Только я не въезжаю как секцию правильно написать. В хелпе написано следующее:

Образец:
function FileSize(const Name: String; var Size: Integer): Boolean;
Описание:
Задаёт Size - размер указанного файла в байтах. Возвращает True, если размер файла задан успешно, иначе возвращает False.
Да функция FileSize, но вам же надо было еще CRC.
Функция FileSize работает следующим образом: в переменной Name имя и путь к проверяемому файлу, в переменной Size, после выполнения функции будет размер проверяемого файла. Если функция сработала успешно, то она возвращает True, в противном случае False.
Код:
function NextButtonClick(CurPage: Integer): Boolean;
var
s:string;
sz:Integer;
begin
Result:=True;
If CurPage=5 then
begin
If FileSearch('www.sss', ExpandConstant('{app}'))='' then
begin
 s:='В каталоге '+ExpandConstant('{app}')+' файл www.sss отсутствует!';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end
else
begin
If FileSize(ExpandConstant('{app}')+'\www.sss', sz) then
begin
 If sz<>2840 then//2840 - проверяемый размер
 begin
 s:='Файл www.sss несоответствует!';
 MsgBox(s, mbError, mb_Ok);
 Result:=False;
 end;
end;
end;
end;
end;
 
K

Kindly

Хоть я и не соображаю в программировании, но здесь более удачное решение сохранения резервных копий файлов без изменения расширения, и без всяких компонентов.

procedure CurStepChanged(CurStep: TSetupStep);
var
s1, s2:string;
begin
s1:=ExpandConstant('{app}')+'\My.exe';
s2:=ExpandConstant('{app}')+'\Backup';
If FileExists(s1) then
begin
CreateDir(s2);
FileCopy(s1, s2+'\My.exe', True);
end;
end;

Здесь резервное копирование оригинального файла происходит после нажатия кнопки "Установить", а если файл не существует, то будет создан BACKUP того файла, что установился из инсталлятора, если отключены проверки на его присутствие.
 
K

Kindly

Вопрос следующий:
Здесь идёт проверка на присутствие двух определённых файлов: 'my.dll' и 'my.exe'.
При отсутствии 'my.exe' - вылетает мессага, а при отсутствии 'my.dll'- ничего не вылетает, но установка не продолжается. А если вписать мессагу после проверки 'my.dll', то проверка 'my.exe' при присутствии в порверяемой папке 'my.dll' будет игнорироваться. Как правильно вклеить мессагу так, чтобы все проверки совершались правильно и чтобы после удачных проверок не вылетало "лишнего" сообщения? В чём недочёт или ошибка?

function NextButtonClick(CurPage: Integer): Boolean;
var
s:string;
begin
Result:=True;
If CurPage=6 then
begin
If FileSearch('my.dll', ExpandConstant('{app}')='' then
Result := False
begin
If FileSearch('my.exe', ExpandConstant('{app}')=''
then
begin
s:='Выбрана неверная папка!';
MsgBox(s, mbCriticalError, mb_Ok);
Result:=False;
end;
end;
end;
end;

ОГРОМНОЕ СПАСИБО.
 
Z

zubr

Хоть я и не соображаю в программировании, но здесь более удачное решение сохранения резервных копий файлов без изменения расширения, и без всяких компонентов.
Ну вы сами спрашивали:
Как сделать чтобы при перезаписи оригинальных файлов создавались их резервные копии (у меня получались резервные копии тех файлов, которые были в инсталляторе). Причём резервные файлы чтобы сохранялись в папку, например: "backup", без переименования расширений. И возможно ли сделать так, чтобы пользователю предоставлялась возможность в самом инсталляторе предварительно отметить/поставить галочку на это действие (на подобии как в патчере-инсталляторе PatchWise Free)?
Компоненты позволяют, чтобы пользователь мог сделать выбор. Не понимаю почему вы считаете, что компоненты добавляют файлы в инсталлятор. От того что у вас 2 компонента с одинаковым файлом, это не значит, что инсталлятор скомпонуется с 2-мя одинаковыми файлами.
Здесь идёт проверка на присутствие двух определённых файлов: 'my.dll' и 'my.exe'.
При отсутствии 'my.exe' - вылетает мессага, а при отсутствии 'my.dll'- ничего не вылетает, но установка не продолжается. А если вписать мессагу после проверки 'my.dll', то проверка 'my.exe' при присутствии в порверяемой папке 'my.dll' будет игнорироваться. Как правильно вклеить мессагу так, чтобы все проверки совершались правильно и чтобы после удачных проверок не вылетало "лишнего" сообщения? В чём недочёт или ошибка?
Здесь можно сделать так:
Код:
function NextButtonClick(CurPage: Integer): Boolean;
var
s:string;
begin
Result:=True;
If CurPage=6 then
begin
If (FileSearch('my.dll', ExpandConstant('{app}')='') or (FileSearch('my.exe', ExpandConstant('{app}')='') then
begin
s:='Выбрана неверная папка!';
MsgBox(s, mbCriticalError, mb_Ok);
Result:=False;
end;
end;
end;
 
K

Kindly

Здесь можно сделать так:

А ещё так:

function NextButtonClick(CurPage: Integer): Boolean;
var
s:string;
begin
Result:=True;
If CurPage=6 then
begin
If FileSearch('my.dll', ExpandConstant('{app}')='' then
begin
s:='Выбрана неверная папка!';
MsgBox(s, mbCriticalError, mb_Ok);
Result := False
end
else
begin
If FileSearch('my.exe', ExpandConstant('{app}')=''
then
begin
s:='Выбрана неверная папка!';
MsgBox(s, mbCriticalError, mb_Ok);
Result:=False;
end;
end;
end;
end;
Это ж можно проверить абсолютно все файлы!
 
K

Kindly

Помогите, пожалуйста, логически завершить данную секцию кода. Здесь происходит проверка размера файла после нажатия кнопки "Установить", а также резервное копирование оригинального файла:
procedure CurStepChanged(CurStep: TSetupStep);
var
s, s1, s2:string;
sz:Integer;
begin
If FileSize(ExpandConstant('{app}')+'\#1 DVD Ripper.exe', sz) then
begin
If sz<>921600 then
begin
s:='Несоответствие размера файла! Обновляемый файл изменён или имеет другую версию. Операция отменена!';
MsgBox(s, mbCriticalError, mb_Ok);
end
else
begin
s1:=ExpandConstant('{app}')+'\#1 DVD Ripper.exe';
s2:=ExpandConstant('{app}')+'\Backup';
If FileExists(s1) then
begin
CreateDir(s2);
FileCopy(s1, s2+'\#1 DVD Ripper.exe', True);
end;
end;
end;
end;
После применения данной секции перед установкой происходит сначала проверка на размер, и при его несоответствии вылетает соответствующее сообщение, но установка после нажатия кнопки "OK" продолжается, а хотелось бы, чтобы в таком случае установка прекращалась. Что нужно дописать?
Спасибо огромное.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!