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

Тема в разделе "Delphi - FAQ", создана пользователем Kindly, 17 мар 2005.

Статус темы:
Закрыта.
  1. Kindly

    Kindly Гость

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

    zubr Гость

    Пример проверки инсталлятором установлена ли в системе Delphi, если нет, то инсталляция завершается:
    Код (Text):
    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;
     
  3. Kindly

    Kindly Гость

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

    zubr Гость

    Такая возможность есть. Вот пример кода, где имя файла www.sss:
    Код (Text):
    [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.
    В самом InnoSetup это невозможно, но можно сделать программку, которая будет находиться в дистрибутиве и при установке запускаться программой установки, выполнив соответствующие проверки, удаляться.
     
  5. Kindly

    Kindly Гость

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

    zubr Гость

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

    Kindly Гость

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

    zubr Гость

    Опять таки искать файл и если он есть, создать папку "backup", к примеру, в том же каталоге куда устанавливается программа, и скопировать файл в "backup". Все это можно сделать средствами InnoSetup.
    Можно через компоненты.
    У меня на работе под рукой Inno Setup нет, подробнее смогу, если время будет вечером.
     
  9. zubr

    zubr Гость

    Код (Text):
    [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 и есть с которого делается копия.
     
  10. Kindly

    Kindly Гость

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

    zubr Гость

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

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

    Kindly Гость

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

    zubr Гость

    Рад был помочь B)
     
  14. Kindly

    Kindly Гость

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

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

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

    zubr Гость

    Непонятно какие файлы на какие вы будете перезаписывать, если в инсталляторе ничего не будет.
    Да функция FileSize, но вам же надо было еще CRC.
    Функция FileSize работает следующим образом: в переменной Name имя и путь к проверяемому файлу, в переменной Size, после выполнения функции будет размер проверяемого файла. Если функция сработала успешно, то она возвращает True, в противном случае False.
    Код (Text):
    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;
     
  16. Kindly

    Kindly Гость

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

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

    Kindly Гость

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

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

    zubr Гость

    Ну вы сами спрашивали:
    Компоненты позволяют, чтобы пользователь мог сделать выбор. Не понимаю почему вы считаете, что компоненты добавляют файлы в инсталлятор. От того что у вас 2 компонента с одинаковым файлом, это не значит, что инсталлятор скомпонуется с 2-мя одинаковыми файлами.
    Здесь можно сделать так:
    Код (Text):
    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;
     
  19. Kindly

    Kindly Гость

    А ещё так:

    Это ж можно проверить абсолютно все файлы!
     
  20. Kindly

    Kindly Гость

    Помогите, пожалуйста, логически завершить данную секцию кода. Здесь происходит проверка размера файла после нажатия кнопки "Установить", а также резервное копирование оригинального файла:
    После применения данной секции перед установкой происходит сначала проверка на размер, и при его несоответствии вылетает соответствующее сообщение, но установка после нажатия кнопки "OK" продолжается, а хотелось бы, чтобы в таком случае установка прекращалась. Что нужно дописать?
    Спасибо огромное.
     
Загрузка...
Похожие Темы - Написание скрипта для
  1. wellsun
    Ответов:
    0
    Просмотров:
    131
  2. vladis222
    Ответов:
    1
    Просмотров:
    627
  3. smailvolf
    Ответов:
    1
    Просмотров:
    1.039
  4. faissullin
    Ответов:
    0
    Просмотров:
    1.091
  5. IseLL
    Ответов:
    1
    Просмотров:
    998
Статус темы:
Закрыта.

Поделиться этой страницей