Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9]

Ответить
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 9]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 06-06-2020
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:

Показать/скрыть: Ссылки на примеры скриптов:

Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;

  • RegExporter - Бесплатная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.3.0 [17.01.2015] - Скачать;



Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z
Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z
Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:09, 04-04-2018

 

Новый участник


Сообщения: 7
Благодарности: 2

Профиль | Отправить PM | Цитировать


Ребята, помогите, пожалуйста.
Есть задача, при установке программы создавать нового пользователя windows и добавлять программу в автозагрузку только ему (во время установки программы но не является текущим пользователем.) Пробовала получать SID пользователя после создания, но видимо из-за нехватки опыта получается какая-то ерунда. Выкладываю свои попытки, может подскажете как можно поправить?

Код: Выделить весь код
[Registry]
Root: HKU; Subkey: {code:GetUserSid}\Software\Microsoft\Windows\CurrentVersion\Run; ValueName: {#MyAppExeName}; ValueType: string; ValueData: {app}\{#MyAppExeName};

[Run]
;  здесь я создаю пользователя и пыталась сделать его загружаемым по умлочания после перезагрузки, но пока точно работает только первая строчка :) 
Filename: net.exe; parameters: "user Visitor /add /fullname:""Visitor"" /comment:""TEST"" /expires:never /passwordchg:no"
Filename: reg.exe; parameters: "ADD HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon /v AutoAdminLogon /t REG_SZ /d 1"; 
Filename: reg.exe; parameters: "ADD HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon /v DefaultUserName /t REG_SZ /d 'Visitor'";  
[Code]
function GetUserSid(ExecStdout: string):string;
var
  TmpFileName: string;
  ResultCode: integer;
  Params: string;

  begin
TmpFileName := ExpandConstant('{tmp}') + '\sid_results.txt';
    Exec(ExpandConstant('{cmd}'), ' /C wmic useraccount where name=''Visitor'' get sid > "' + TmpFileName + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
      if LoadStringFromFile(TmpFileName, ExecStdout) then 
        begin     
        MsgBox(ExecStdout, mbInformation, MB_OK);
         end
      else
        begin
        MsgBox('Installing Error', mbError, MB_OK);
        end;
    DeleteFile(TmpFileName);
    end;

Последний раз редактировалось AnastasiyaM, 22-10-2018 в 12:39. Причина: форматированние


Отправлено: 16:45, 20-10-2018 | #101



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Chudmin

Пользователь


Сообщения: 98
Благодарности: 13

Профиль | Отправить PM | Цитировать


Здравствуйте!
Подскажите пожалуйста, как реализовать, чтобы при запуске инсталятора, например, "Моя_прога", если запущена уже ранее установленная программа "Моя_прога.exe", то сразу же, без вопросов, "Моя_прога.exe" закрывалась?

Последний раз редактировалось Chudmin, 21-10-2018 в 22:32.


Отправлено: 22:26, 21-10-2018 | #102


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Chudmin, вообще-то, в этом случае инсталлятор не должен «сразу же, без вопросов» закрываться.

Отправлено: 23:00, 21-10-2018 | #103


Аватара для Chudmin

Пользователь


Сообщения: 98
Благодарности: 13

Профиль | Отправить PM | Цитировать


Цитата Iska:
в этом случае инсталлятор не должен «сразу же, без вопросов» закрываться. »
Вы не правильно меня поняли. Есть программа "Моя_прога" и есть инсталятор к ней "Моя_прога_Setup", так вот, если у пользователя уже установлена "Моя_прога" и запущена, а в это время он запускает (при работающей "Моя_прога") инсталятор "Моя_прога_Setup", то инсталятор сразу же, "молчком", закрывает программу "Моя_прога".

Последний раз редактировалось Chudmin, 22-10-2018 в 05:56.


Отправлено: 05:44, 22-10-2018 | #104


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Chudmin, и этого быть не должно (разве что «Моя_прога» — это сервис).

Отправлено: 05:46, 22-10-2018 | #105


Аватара для Chudmin

Пользователь


Сообщения: 98
Благодарности: 13

Профиль | Отправить PM | Цитировать


Цитата Iska:
и этого быть не должно »
Ну, должно или не должно, это другой вопрос, главное что такое работает, например в репаках уважаемого Elchupacabra.

Отправлено: 06:01, 22-10-2018 | #106


Аватара для ErikPshat

Пользователь


Сообщения: 54
Благодарности: 11

Профиль | Отправить PM | Цитировать


Chudmin,
Код: Выделить весь код
[UninstallRun] 
Filename: "{sys}\taskkill.exe"; Parameters: "/f /im Моя_прога.exe"; Flags: skipifdoesntexist runhidden
или использовать сразу в секции Files параметр BeforeInstall для уничтожения процесса перед установкой:
Код: Выделить весь код
[Files]
Source: "Моя_прога.exe"; DestDir: "{app}"; Flags: ignoreversion; BeforeInstall: TaskKill('Моя_прога.exe')

[ Code ]
procedure TaskKill(FileName: String);
var
  ResultCode: Integer;
begin
    Exec(ExpandConstant('taskkill.exe'), '/f /im ' + '"' + FileName + '"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;

Последний раз редактировалось ErikPshat, 22-10-2018 в 06:49.

Это сообщение посчитали полезным следующие участники:

Отправлено: 06:39, 22-10-2018 | #107


Аватара для Chudmin

Пользователь


Сообщения: 98
Благодарности: 13

Профиль | Отправить PM | Цитировать


Цитата ErikPshat:
или использовать сразу в секции Files параметр BeforeInstall для уничтожения процесса перед установкой: »
Спасибо большое, этот метод как раз близок к моему желанию (в отличии от [UninstallRun]). Я только недавно стал вникать в тонкости Inno Setup, так-что чайник в полном смысле этого слова, а в секции [code], так вообще на уровне скопировал, посмотрел результат, так-что Ваш пример в мою копилку, на которых (в том числе) я буду постигать азы [code].

И всё-таки, у Elchupacabra этот процесс происходит сразу же после запуска инсталятора, КАК? Конечно и Ваш способ работает и выполняет свою функцию, но хотелось бы знать как сделать в самом начале, чисто академический интерес.

Отправлено: 07:17, 22-10-2018 | #108


Аватара для boss911

Alien


Сообщения: 4262
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата Chudmin:
Есть программа "Моя_прога" и есть инсталятор к ней "Моя_прога_Setup", так вот, если у пользователя уже установлена "Моя_прога" и запущена, а в это время он запускает (при работающей "Моя_прога") инсталятор "Моя_прога_Setup", то инсталятор сразу же, "молчком", закрывает программу "Моя_прога". »
Предложу использовать библиотеку KillProc.dll для Inno Setup.
Код: Выделить весь код
[Files]
Source: C:\MyProg\MyProg.exe; DestDir: {app}; Flags: ignoreversion; BeforeInstall: KillProc
Source: compiler:Libraries\KillProc.dll; DestDir: {tmp}; Flags: dontcopy

[Code]
function KillProcByExeName(ProcessName: PAnsiChar; ExcludeID: Cardinal): Integer; external 'KillProcByExeName@files:KillProc.dll stdcall';

procedure KillProc;
begin
  KillProcByExeName('MyProg.exe', 0);
end;
Если в момент установки будет запущен процесс с именем MyProg.exe, то перед копированием файла MyProg.exe, данный процесс будет принудительно завершен. Метод старый, возможно уже есть другие решения, с проверкой ID процесса.

Правильно или не правильно, но если MyProg.exe не служба и нет ключа командной строки для завершения работы, а процесс без вопросов необходимо завершить и по другому ни как, то это единственный вариант, и уже закрываешь глаза на то, что это не правильно. ИМХО.

Отправлено: 16:00, 22-10-2018 | #109


Аватара для ErikPshat

Пользователь


Сообщения: 54
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата boss911:
Предложу использовать библиотеку KillProc.dll для Inno Setup. »
Не понимаю зачем, если это делается стандартными средствами. Ну может быть для кого-то это может оказаться единственно рабочим решением.

Цитата Chudmin:
И всё-таки, у Elchupacabra этот процесс происходит сразу же после запуска инсталятора, КАК? »
Ну так всё зависит от того, когда выполняется ваш код. Сколько у вас файлов в секции [Files] и когда они запускаются?
Скорее всего ваши файлы смирно сидят в инсталляторе и терпеливо ждут, пока юзер не пройдёт все этапы, проставит галочки, там создавать ярдыки на рабочем столе, выбирает дополнения, путь установки, а тоько в заключении жмёт кнопку "Установить". Вот тогда и активируется ваша "Моя_прога.exe", а перед её запуском и начинается поиск процесса и его уничтожение.

Чтобы процесс уничтожался сразу при запуске инсталлятора, нужно чтобы у вас в [Files] был бы назначен на BeforeInstall какой-нибудь файлик, который бы извлекался в %TEMP% именно при запуске инсталлятора, а не по нажатию кнопки "Установить".

Для примера, вы можете прикрепить к инсталлятору Сплэш-заставку и заодно на неё повесить убийцу процесса:
Код: Выделить весь код
[Files]
; Файлы Splash-заставки, загружаются первыми 
Source: Include\isgsg.dll; DestDir: {tmp}; Flags: dontcopy nocompression; BeforeInstall: TaskKill('Моя_прога.exe')
Source: Include\Splash.png; DestDir: {tmp}; Flags: dontcopy nocompression
В секции [ Code ] объявляете процедуру заставки и процедуру убийцы процесса в самом начале:
Код: Выделить весь код
[ Code ]
{ Splash заставка }
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer);
    external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
procedure TaskKill(FileName: String);var ResultCode: Integer;begin
    Exec(ExpandConstant('taskkill.exe'),'/f /im '+'"'+FileName+'"','',SW_HIDE,ewWaitUntilTerminated,ResultCode);end;
Этот код извлечения и запуска заставки вставляете в нужном вам месте. Я её разместил после всей массы программного кода в конец, но перед отрисовкой формы окна:
Код: Выделить весь код
{ Splash заставка }
procedure Splash();
begin
  ExtractTemporaryFile('Splash.png');
  ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\Splash.png'),500,800,500,0,255,True,$FFFFFF,10);
end;
И в конце кода инициализируете её:
Код: Выделить весь код
procedure InitializeWizard();
begin
  Splash();
end;
Таким образом, при запуске программы сразу извлекаются файлы заставки в %TEMP% и запускается заставка перед стартом инсталлятора, но ещё перед этим, запускается убийца процесса, потому что на файл заставки выставлен флаг BeforeInstall.

Последний раз редактировалось ErikPshat, 23-10-2018 в 08:46.


Отправлено: 21:21, 22-10-2018 | #110



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 7] El Sanchez Автоматическая установка приложений 2499 02-02-2015 08:59
Скрипты Inno Setup. Помощь и советы [часть 6] El Sanchez Автоматическая установка приложений 2494 10-03-2014 11:51
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58




 
Переход