На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ Inno Setup
Пожалуйста, выделяйте текст инсталлятора написанного на Inno Setup тегом [сode=ins] ... [/сode]. Для этого используйте кнопку [code=ins] в форме ответа или выпадающего списка, если нужно вставить код из другой программы.


Обязательно указывать:

  • Программу, используемую для создания инсталлятора.



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


Выразить свое отношение к модераторам раздела можно здесь: Profi, Fester
Модераторы: Fester
  
> Вопрос по Inno Setup
    Установленная программа создает файл конфигурации(INI), так вот при удалении как сделать так чтобы у пользователя спрашивалось удалять этот файл настроек или оставить?

    И еще вопрос, если я ставлю новую версию программы, а старая в это время запущенна и работает.. как сделать так чтобы старая программа заменилась на новую? скорей всего это надо через перезапуск компьютера, как так сделать чтобы после перезапуска записалась новая версия файла программы? и собственно как тогда осуществить сам перезапуск?
      Цитата Dmitry_177 @
      Установленная программа создает файл конфигурации(INI), так вот при удалении как сделать так чтобы у пользователя спрашивалось удалять этот файл настроек или оставить?

      ExpandedWrap disabled
        [UninstallDelete]
        Name: {app}\My Dir\My ini.ini; Type: files; Check: DelOrNo
         
        [Code]
        Function DelOrNo:boolean;
        begin
            Result:=MsgBox('Удалить Ini-файл?',mbConfirmation,MB_YESNO)=IDYES;
        end;

      Цитата Dmitry_177 @
      И еще вопрос, если я ставлю новую версию программы, а старая в это время запущенна и работает.. как сделать так чтобы старая программа заменилась на новую? скорей всего это надо через перезапуск компьютера, как так сделать чтобы после перезапуска записалась новая версия файла программы? и собственно как тогда осуществить сам перезапуск?

      Вот тут подробнее? Что если просто закрыть программу, установить новую и запустить её? Зачем перезагружать компьютер?
        Дело в том что она работает как сервис.. т.е. не имеет своего окна даже.. вот можноли такую программу остановить в InnoSetup?
          Цитата Dmitry_177 @
          Дело в том что она работает как сервис.. т.е. не имеет своего окна даже.. вот можноли такую программу остановить в InnoSetup?

          Пишется dll с функцией, которая завершает процесс, и подключается к инсталлятору.
            По поводу удаления Ini-файла.. Можно ли сделать так, чтобы было это не в виде MessageBox-а, а в виде окна, и там чтоб был CheckBox с выбором удалить настройки или нет.. Так просто в основном делается на сколько я знаю..
              Цитата Dmitry_177 @
              По поводу удаления Ini-файла.. Можно ли сделать так, чтобы было это не в виде MessageBox-а, а в виде окна, и там чтоб был CheckBox с выбором удалить настройки или нет.. Так просто в основном делается на сколько я знаю..

              Хм, судя по всему нет! Как вставить свою страницу в Uninstall, ровно, как и использовать для данных целей встроенные возможности, я не нашел.
                Может если присмотреть к демкам, в часности к CodeClasses.iss , то что нить прояснится? ;-)
                  Цитата jack128 @
                  Может если присмотреть к демкам, в часности к CodeClasses.iss , то что нить прояснится? ;-)

                  В Install'е я могу создать все что угодно, а вот в Uninstall'е - нет! Данный пример ничего нового мне не сказал.
                    Цитата Profi @
                    Данный пример ничего нового мне не сказал.

                    А если очень внимательно присмотреться к procedure FormButtonOnClick(Sender: TObject); ? ;-)
                      Цитата jack128 @
                      А если очень внимательно присмотреться к procedure FormButtonOnClick(Sender: TObject); ? ;-)

                      Угу. Ну, если исключить строку:
                      ExpandedWrap disabled
                        Form.CenterInsideControl(WizardForm, False);
                      , то работает!
                        Цитата
                        Пишется dll с функцией, которая завершает процесс, и подключается к инсталлятору.

                        написал DLL, пеодключил к инсталлятору:

                        ExpandedWrap disabled
                          [Code]
                          procedure TerminateService;
                          external 'TerminateService@files:Setup.dll stdcall';


                        Эта процедура делает сигнальным определенное событие, которое ожидает сам сервис, по которому завершает свою работу..

                        Вот как мне в при удалении программы(чтобы его остановить перед тем как удалить исполняемый файл сервиса) и при переустановки более новой версии запускать эту процедуру?
                          ExpandedWrap disabled
                            procedure CurStepChanged(CurStep: TSetupStep);
                            CurStep=ssInstall;
                             
                            procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
                            CurUninstallStep=usUninstall;
                            Что-то я не очень понял.. а как их в самой инсталляции вызывать? Ведь если сделать так:

                            ExpandedWrap disabled
                              [UninstallDelete]
                              Name: {app}\My Dir\KLServer.exe; Type: files; Check: TerminateService


                            где TerminateService процедура, т.е. никакого значения не возвращает, то при компиляции инсталлятора вызывается какая-то ошибка.. Сделал TerminateService как функцию, которая возвращает значение типа boolean, о оно всегда true, т.е. так:

                            ExpandedWrap disabled
                              [Code]
                              function TerminateServer: boolean;
                              external 'TerminateServer@files:Setup.dll stdcall';


                            то сам то инсталлятор компилируется, но при самой инсталляции почемуто выскакивает ошибка: "Внутренняя ошибка: Expression error 'Script error: Could not call proc.'"
                              Сделай так:
                              ExpandedWrap disabled
                                [UninstallDelete]
                                Name: {app}\My Dir\KLServer.exe; Type: files; Check: TermService
                                 
                                [Code]
                                Function TermService:boolean;
                                begin
                                  Result:=TerminateServer;
                                end;
                                а может это быть из-за того что у меня библиотека, в которой содержится эта функция в инсталляторе как:
                                ExpandedWrap disabled
                                  [Files]
                                  Source: "E:\Klient.RU\Setup\Setup.dll"; Components: KLServer; Flags: dontcopy
                                  помогите пожалуйста.. очень нужно..
                                    Приведи полный код.
                                      В программе:

                                      ExpandedWrap disabled
                                        // создается событие для выключения программы:
                                          hTermEvent := CreateEvent(nil, false, false, TermEventName);
                                          CloseHandle(CreateThread(nil, 0, @ThreadTerminateEvent, nil, 0, idThread));
                                         
                                        function ThreadTerminateEvent(Param: Pointer): DWORD; stdcall;
                                        begin
                                          WaitForSingleObject(hTermEvent, INFINITE);
                                          // сохраняем то что нужно сохранить и выключаем программу
                                          Application.Terminate;
                                          Result := 0;
                                        end;


                                      В библиотека которая встраивается в инсталлятор Setup.dll:

                                      ExpandedWrap disabled
                                        function TerminatePrg: boolean; stdcall;
                                        var
                                          hTermEvent: THandle;
                                        begin
                                          hTermEvent := CreateEvent(nil, false, false, TermEventName);
                                          if GetLastError = ERROR_ALREADY_EXISTS then
                                            SetEvent(hTermEvent);
                                          CloseHandle(hTermEvent);
                                          Result := true;
                                        end;
                                         
                                        exports
                                          TerminatePrg;


                                      В самом инсталляторе:

                                      ExpandedWrap disabled
                                        [Files]
                                        Source: "E:\Setup\Setup.dll"; Flags: dontcopy
                                         
                                        [Code]
                                        function TerminatePrg: boolean;
                                        external 'TerminatePrg@files:Setup.dll stdcall';
                                         
                                        [UninstallDelete]
                                        Name: "{app}\MyProg.exe"; Type: files; Check: TerminatePrg
                                        Кстати, да. Есть такой баг у Inno, а может это фича, касаема "could not call proc" из некоторых мест скрипта.

                                        Вот куски моего скрипта:
                                        ExpandedWrap disabled
                                          [Files]
                                          Source: "sputil.dll"; Flags: dontcopy
                                          ...
                                           
                                           
                                          function UnInstall(UserPassword: PChar): Boolean; external 'UnInstall@files:sputil.dll stdcall';
                                           
                                          function InitializeUninstall(): Boolean;
                                          begin
                                            Result := UnInstall('some_pass');
                                          end;
                                          ...


                                        Так вот, единственный способ прекратить деинсталляцию, который я знаю - это отдать False при вызове InitializeUninstall.
                                        С другой стороны, в InitializeUninstall невозможно вызвать функцию из моей подключаемой библиотеки sputil.dll.
                                        Inno пишет "could not call proc".

                                        В то же время, если перенести вызов функции UnInstall из sputil.dll куда нибудь подальше :) вроде CurUninstallStepChanged, то естественно она зовется, но уже поздно, отменить инсталляцию нельзя. А мне нужно запросить пароль, отдать его на растерзание функции UnInstall и в зависимости от этого запретить/разрешить деинсталляцию.
                                        Посоветуйте, как быть :unsure:
                                        Сообщение отредактировано: Fork -
                                          Цитата Dmitry_177 @
                                          В самом инсталляторе:

                                          ExpandedWrap disabled
                                            [Files]
                                            Source: "E:\Setup\Setup.dll"; Flags: dontcopy
                                             
                                            [Code]
                                            function TerminatePrg: boolean;
                                            external 'TerminatePrg@files:Setup.dll stdcall';
                                             
                                            [UninstallDelete]
                                            Name: "{app}\MyProg.exe"; Type: files; Check: TerminatePrg

                                          Ну, а так:
                                          ExpandedWrap disabled
                                            [UninstallDelete]
                                            Name: "{app}\MyProg.exe"; Type: files; Check: TermService
                                             
                                            [Code]
                                            function TerminatePrg: boolean;
                                            external 'TerminatePrg@files:Setup.dll stdcall';
                                             
                                            Function TermService:boolean;
                                            begin
                                              Result:=TerminatePrg;
                                            end;
                                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                          0 пользователей:


                                          Рейтинг@Mail.ru
                                          [ Script execution time: 0,0493 ]   [ 14 queries used ]   [ Generated: 18.07.25, 02:04 GMT ]