Проблема Запуск инсталлятора MSI из CODE

Awalder

Новичок
Подскажите пожалуйста, как запустить инсталлятор MSI (или обычный ехе) используя чебокс? Возможен ли запуск "стороннего" инсталлятора msi (или обычного ехе) перед инсталляцией основных файлов?
Смотрел примеры на форуме - с помощью RUN получается, а с чебоксами - инсталляция не начинается. В примере ниже - 1 и 3 чебоксы срабатывают, а 2 (где запуск инсталлятора) - нет

[Files]
Source: "Files\msxml4\msxml.msi"; DestDir: "{tmp}"
****************
[Code*]
procedure CurStepChanged(CurStep: TSetupStep);
var
ErrorCode: Integer;
begin
case CurStep of
ssInstall: begin
//Если в папке с игрой имеется мод, запускается окно удаления мода, потом дальше инсталл
if DeletModCheckBox.Checked then
begin
ShellExec('', ExpandConstant('{app}\unins000.exe'),'/qn', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);

end;

case CurStep of
ssInstall: begin
//msi
if MsiCheckBox.Checked then
begin
ShellExec('', ExpandConstant('{tmp}\msxml.msi'),'/qn', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
end;

case CurStep of
ssPostInstall: begin
//Перемещение папки ави
if RenameCheckBox.Checked then
begin
ForceDirectories(ExpandConstant('{app}\MultiMod\Backup'));
MoveDir(ExpandConstant('{app}\Avi'), ExpandConstant('{app}\MultiMod\Backup\'));
RemoveDir(ExpandConstant('{app}\Avi'));

end;
 

vint56

Ветеран
Проверенный
Awalder,
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;Вариант 1:
[CustomMessages]
orca=Идет Установка Orca

[Tasks]
Name: Orca; Description: Установить Orca
[Run]
Filename: msiexec.exe; Parameters: "-i ""{src}\Redist\orca.msi"" -qn"; WorkingDir: "{src}\Redist"; StatusMsg: {cm:orca}; Flags: runminimized waituntilterminated;  Tasks: Orca;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;Вариант 2:
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[code]
var
  CheckSoft: TNewCheckBox;

procedure InitializeWizard();
begin
  CheckSoft := TNewCheckBox.Create(WizardForm);
  with CheckSoft do
  begin
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(16);
    Top := ScaleY(120);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Caption := 'Установить Orca';
    Checked := True;
    State := cbChecked;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var ErrorCode : Integer;
begin
if CurStep = ssInstall then begin  //Если необходимо, можно поменять на ssPostInstall
if CheckSoft.Checked then
begin
WizardForm.FilenameLabel.Caption:='Идет Установка Orca';
ShellExec('', ExpandConstant('{src}\Redist\orca.msi'),'/qn', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
end;
end;
end;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 

Awalder

Новичок
Спасибо за ответ, к сожалению оба варианта не работают. Работает несколько изменённый вариант с помощью RUN. Скрины ниже.
Через код вроде бы всё в скрипте отрабатывается, но запуск не происходит.

Зы: cкрипт с кодом работает, если я вместо msxml.msi беру любой другой установочник ехе... ПОлучается весь вопрос в msi
 

Вложения

Последнее редактирование:

Awalder

Новичок
Скрипт работающего варианта через RUN (пример ,брал здесь на форуме в FAQ)

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.
[Files]
Source: msxml.msi; DestDir:{tmp}
[Tasks]
Name: MSI; Description: Установить библиотеку MSXML 4.0
[Run]
Filename: "msiexec.exe"; Tasks: MSI; Parameters: "/i ""{tmp}\msxml.msi"""
 
Последнее редактирование:

vint56

Ветеран
Проверенный
Awalder, прочитай про константы
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.


[Files]
Source: "Redist\msxml.msi"; DestDir: "{tmp}"; Flags: ignoreversion


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;Вариант 1:
[CustomMessages]
orca=Идет Установка MSXML 4.0 Service Pack 3

[Tasks]
Name: Orca; Description: Установить MSXML 4.0 Service Pack 3
[Run]
Filename: msiexec.exe; Parameters: "-i ""{tmp}\msxml.msi"" -qn"; WorkingDir: "{tmp}"; StatusMsg: {cm:orca}; Flags: runminimized waituntilterminated;  Tasks: Orca;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;Вариант 2:
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[code]
var
  CheckSoft: TNewCheckBox;

procedure InitializeWizard();
begin
  CheckSoft := TNewCheckBox.Create(WizardForm);
  with CheckSoft do
  begin
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(16);
    Top := ScaleY(120);
    Width := ScaleX(313);
    Height := ScaleY(17);
    Caption := 'Установить MSXML 4.0 Service Pack 3';
    Checked := True;
    State := cbChecked;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var ErrorCode : Integer;
begin
if CurStep = ssPostInstall then begin  //Если необходимо, можно поменять на ssPostInstall
if CheckSoft.Checked then
begin
WizardForm.FilenameLabel.Caption:='Идет Установка MSXML 4.0 Service Pack 3';
ShellExec('', ExpandConstant('{tmp}\msxml.msi'),'/qn', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
end;
end;
end;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Главную роль в скрипте играют константы. Константы всегда заключаются в фигурные скобки { }. Инсталлятор (или деинсталлятор) присваивает константам значения, котроые определяются пользователем, либо опираясь на конфигурацию системы. Например, {win} будет воспринята компилятором как "C:\WINDOWS", если ОС установлена в эту папку.

Символ "{" рассматривается как начало константы. Если требуется ввести "{", наберите ее два раза. (You do not need to double "}" characters.)

Если за константой следует обратный слеш ("\"), инсталлятор его автоматически удалит, если константа уже оканчивается на обратный слеш. Например, если константа {const} имеет значение "C:\", а мы введем {constantname}\filename, в конечном счете получится "C:\filename", а не "C:\\filename", как должно быть по логике. Если требуется вывести именно "C:\\filename", обратный слеш придется заключить в фигурные скобки: {const}{\}\filename.

Список поддерживаемых констант.

Константы папок
{app}
Папка, куда устанавливается приложение. Она выбирается пользователем в окне Выбор папки назначения при установке.
Например: если Вы ввели {app}\MYPROG.EXE в значение параметра Source и пользователь пожелал установить Вашу программу в "C:\MYPROG", на выходе получится "C:\MYPROG\MYPROG.EXE".

{win}
Папка, где установлена Windows.
Например: ввели {win}\MYPROG.INI , папка Windows "C:\WINDOWS", на выходе "C:\WINDOWS\MYPROG.INI".

{sys}
Системная папка Windows.
Например: ввели {sys}\CTL3D32.DLL системная папка Windows "C:\WINDOWS\SYSTEM", на выходе "C:\WINDOWS\SYSTEM\CTL3D32.DLL".

На 64-разрядном Windows, по умолчанию, путь System32, возвращаемый этой константой указывает к папке, содержащий 32-разрядные системные файлы, точно так же как в 32-разрядном Windows. (Константа может быть переопределена включением 64-разрядного режима.)

{syswow64}
На 64-разрядном Windows системная папка SysWOW64, обычно "C:\WINDOWS\SysWOW64". Это каталог, в котором находятся 32-разрядные системные файлы.

Не используйте эту константу, если нет необходимости получить имя каталога, в котором находятся 32-разрядные системные файлы. Многократное использование {syswow64} в местах, где {sys} будет достаточен, может вызвать проблемы. (Для примера см. документацию флага sharedfile секции [Files].)

{src}
Папка, в которой находится инсталлятор.
Например: ввели {src}\MYPROG.EXE, инсталлятор запущен из "S:\", на выходе "S:\MYPROG.EXE".

{sd}
Системный диск, на котором установлен Windows. Обычно это "C:". Эта константа эквивалентна переменной среды SystemDrive.

{pf}
Путь к папке Program Files. {pf} эквивалентна {pf32}, если инсталлятор не работает в 64-разрядном режиме, иначе эквивалентна {pf64}.

{pf32}
Путь к 32-разрядной системной папке Program Files, обычно "C:\Program Files" в 32-разрядном Windows и "C:\Program Files (x86)" в 64-разрядном Windows.

{pf64}
Только для 64-разрядного Windows: 64-разрядные программные файлы. Путь к 64-разрядной системной папке Program Files, обычно "C:\Program Files". Будет исключение, если предпринять попытку использования этой константы в 32-разрядном Windows.

{cf}
Общие файлы - Common Files. {cf} эквивалентна {cf32}, если инсталлятор не работает в 64-разрядном режиме, иначе эквивалентна {cf64}.

{cf32}
32-разрядные общие файлы. Путь к 32-разрядной системной папке Common Files, обычно "C:\Program Files\Common Files" в 32-разрядном Windows и "C:\Program Files (x86)\Common Files" в 64-разрядном Windows.

{cf64}
Только для 64-разрядного Windows: 64-разрядные общие файлы. Путь к 64-разрядной системной папке Common Files, обычно "C:\Program Files\Common Files". Будет исключение, если предпринять попытку использования этой константы в 32-разрядном Windows.

{tmp}
Временная папка. Это не значение переменной среды TEMP пользователя. Это папка, где создаются временные файлы инсталлятора ("C:\WINDOWS\TEMP\IS-xxxxx.tmp"). Все файлы и папки удаляются из папки Temp после завершения установки приложения. Эта константа используется в случае, если в секции [Run] указаны файлы, необходимые при инсталляции, но не нужные для дальнейшей работы приложения.

{fonts}
Папка шрифтов. Обычно именуется FONTS и находится в папке Windows.

{dao}
Папка DAO. Эквивалентна {cf}\Microsoft Shared\DAO.

{dotnet11}
32-разрядная корневая папка .NET Framework версии 1.1.

Будет исключение, если предпринять попытку использования этой константы в системе, где не установлена .NET Framework версии 1.1.

{dotnet20}
Корневая папка .NET Framework версии 2. {dotnet20} эквивалентна {dotnet2032}, если инсталлятор не работает в 64-разрядном режиме, иначе эквивалентна {dotnet2064}.

Будет исключение, если предпринять попытку использования этой константы в системе, где не установлена .NET Framework версии 2.

{dotnet2032}
32-разрядная корневая папка .NET Framework версии 2.

Будет исключение, если предпринять попытку использования этой константы в системе, где не установлена .NET Framework версии 2.

{dotnet2064}
Только для 64-разрядного Windows: 64-разрядная корневая папка .NET Framework версии 2.

Будет исключение, если предпринять попытку использования этой константы в системе, где не установлена .NET Framework версии 2.

{dotnet40}
Корневая папка .NET Framework версии 4. {dotnet40} эквивалентна {dotnet4032}, если инсталлятор не работает в 64-разрядном режиме, иначе эквивалентна {dotnet4064}.

Будет исключение, если предпринять попытку использования этой константы в системе, где не установлена .NET Framework версии 4.

{dotnet4032}
32-разрядная корневая папка .NET Framework версии 4.

Будет исключение, если предпринять попытку использования этой константы в системе, где не установлена .NET Framework версии 4.

{dotne4064}
Только для 64-разрядного Windows: 64-разрядная корневая папка .NET Framework версии 4.

Будет исключение, если предпринять попытку использования этой константы в системе, где не установлена .NET Framework версии 4.

Константы специальных папок
В Inno Setup используются и другие константы, именуемые константами специальных папок. Используются они так же, как и константы папок.

Константы "common" являются общими для всех профилей пользователей.

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

Как уже говорилось, константы специальных папок применимы ко всем версиям Windows, поддерживающих Inno Setup.

* = константа "common" равна константе "user", если пользователь, устанавливающий приложение, является администратором или PrivilegesRequired=lowest.

{group}
Путь к группе меню Пуск, который пользователь может изменить на странице Выберите папку в меню «Пуск». Эта папка всегда создается для всех профилей пользователей, если только пользователь, устанавливающий приложение, не имеет прав администратора, иначе путь задается только для профиля текущего пользователя.

{localappdata}
Путь к локальной папке приложения (не Roaming).

{sendto}
Путь к папке Send To пользователя (общей Send To папки нет).

{userappdata} & {commonappdata}
Путь к папке с данными приложения (Application Data).

{usercf}
Путь к папке Common Files текущего пользователя. Константа поддерживается только в Windows 7 и более поздних версиях. При использовании в предыдущих версиях Windows значение константы будет заменено на {localappdata}\Programs\Common.

{userdesktop} & {commondesktop} *
Путь к папке рабочего стола.

{userdocs} & {commondocs}
Путь к папке Мои документы.

{userfavorites} & {commonfavorites} *
Путь к папке Избранное.

{userpf}
Путь к папке Program Files текущего пользователя. Константа поддерживается только в Windows 7 и более поздних версиях. При использовании в предыдущих версиях Windows значение константы будет заменено на {localappdata}\Programs.

{userprograms} & {commonprograms} *
Путь к папке Программы в меню Пуск.

{userstartmenu} & {commonstartmenu} *
Путь к "корню" меню Пуск.

{userstartup} & {commonstartup} *
Путь к папке Автозагрузка в меню Пуск.

{usertemplates} & {commontemplates} *
Путь к папке шаблонов.

Прочие константы
{\}
Обратный слеш. Прочитайте в начале этой страницы о правилах использования {\} и \.

{%NAME|DefaultValue}
Вставляет значение переменной среды.

  • NAME - имя переменной среды
  • DefaultValue - определяет текст, который будет вставлен в случае, если константа не существует
  • Для вставки запятой, вертикальной черты ("|"), или закрывающей фигурной скобки ("}") запишите нужный символ в виде "%-код символа.". Замените символ символом "%" и его двухразрядным шестнадцатеричным кодом. Запятая - "%2c", вертикальная черта - "%7c", и закрывающая фигурная скобка - "%7d". Если Вы хотите включить символ "%", используйте "%25".
  • NAME и DefaultValue могут содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Например:
{%COMSPEC}
{%PROMPT|$P$G}
{cmd}
Полный путь к стандартному системному интерпретатору. Это обычно Windows\System32\cmd.exe. При этом переменная среды COMSPEC не используется.

{computername}
Имя компьютера, на котором запущен инсталлятор или деинсталлятор (результат функции GetComputerName).

{drive:Path}
Возвращает букву диска и двоеточие из указанного пути (например, "C:"). В случае установки через сеть возвращает имя сервера и имя общего документа (например, "\\SERVER\SHARE").

  • Path - определяет путь.
  • Для вставки запятой, "|", или "}" запишите нужный символ в виде"%-код символа.". Например, запятая - это "%2c", вертикальная черта - "%7c", "}" - "%7d". "%" = "%25".
  • Path может содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Примеры:
{drive:{src}}
{drive:c:\path\file}
{drive:\\server\share\path\file}
{groupname}
Имя папки, которую пользователь выбрал на странице Выберите папку в меню «Пуск». В отличие от константы {group} эта константа равна имени папки «Пуск», а не полному пути к ней.

{hwnd}
(Специального назначения) Дескриптор фонового окна инсталлятора.

{wizardhwnd}
(Специального назначения) Дескриптор окна мастера инсталлятора. Равен '0', если на момент обращения окно не существует.

{ini:Filename,Section,Key|DefaultValue}
Берет значение из .INI файла.

  • Filename - имя ini-файла, из которого производится чтение
  • Section - имя секции
  • Key - имя ключа
  • DefaultValue - значение, возвращаемое, если параметр не существует
  • Для вставки запятой, "|", или "}" запишите нужный символ в виде"%-код символа.". Например, запятая - это "%2c", вертикальная черта - "%7c", "}" - "%7d". "%" = "%25".
  • Filename, Section, и Key могут содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Например:
{ini:{win}\MyProg.ini,Settings,Path|{pf}\My Program}
{language}
Встроенное имя выбранного языка. Для справки обратитесь к секции [Languages].

{cm:MessageName}
{cm:MessageName,Arguments}
Возвращает стандартное сообщение на заданном языке.

  • MessageName - имя стандартного сообщения, из которого производится считывание. Для справки обратитесь к секции [CustomMessages] .
  • Arguments - аргументы сообщения, разделенные запятыми
  • Для вставки запятой, "|", или "}" запишите нужный символ в виде"%-код символа.". Например, запятая - это "%2c", вертикальная черта - "%7c", "}" - "%7d". "%" = "%25".
  • Каждый аргумент в Arguments может содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Например:
{cm:LaunchProgram,Inno Setup}
Пример выдает "Launch Inno Setup", если выбран английский язык.

{reg:HKxx\SubkeyName,ValueName|DefaultValue}
Возвращает значение реестра.

  • HKxx - определяет корневой ключ. Для справки обратитесь к секции [Registry]
  • SubkeyName - имя раздела
  • ValueName - имя параметра. Пустой параметр = "По умолчанию".
  • DefaultValue - значение, возвращаемое, если параметр не существует или не строкового типа (REG_SZ или REG_EXPAND_SZ)
  • Для вставки запятой, "|", или "}" запишите нужный символ в виде"%-код символа.". Например, запятая - это "%2c", вертикальная черта - "%7c", "}" - "%7d". "%" = "%25".
  • SubkeyName, ValueName, и DefaultValue могут содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Например:
{reg:HKLM\Software\My Program,Path|{pf}\My Program}
{param:ParamName|DefaultValue}
Возвращает параметры командной строки.

  • ParamName - имя параметра
  • DefaultValue - значение, возвращаемое, если запрашиваемое значение не существует или не может быть определено.
  • Для вставки запятой, "|", или "}" запишите нужный символ в виде"%-код символа.". Например, запятая - это "%2c", вертикальная черта - "%7c", "}" - "%7d". "%" = "%25".
  • ParamName и DefaultValue могут содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Например:
{param:path|{pf}\My Program}
Возвращает c:\My Program, если в командной строке введен /Path="c:\My Program".

{srcexe}
Полный путь инсталлятора, например "C:\SETUP.EXE".

{uninstallexe}
Полный путь деинсталлятора, например "C:\Program Files\My Program\unins000.exe". Эта константа чаще всего используется в секции [Icons] для задания иконки деинсталлятора. Действует только если директиве Uninstallable секции [Setup] присвоено значение yes (по умолчанию).

{sysuserinfoname}
{sysuserinfoorg}
Имя и организация, соответственно, к которым зарегистрирован Windows. Эта информация берется из реестра.

{userinfoname}
{userinfoorg}
{userinfoserial}
Имя, организация и серийный номер, которые пользователь указал на странице Информация о пользователе (эту страницу можно активировать директивой UserInfoPage). Обычно эти константы используются в секциях [INI] и [Registry], чтобы сохранить их значения для дальнейшего использования.

{username}
Имя пользователя, запустившего инсталлятор или деинсталлятор (результат функции GetUserName).

{log}
Имя файла системного журнала, или пустая строка, если журналирование не включено.
 

Awalder

Новичок
Разобрался : запуск доп. ПО происходит перед установкой основного софта, причём распаковка исходного файла в {tmp} происходит только в случае выбранного четбокса непосредственно перед инсталляцией основного софта, за счёт чего значительно ускоряется запуск самого инсталла.

[files]
Source: "Files\msxml\msxml.msi"; DestDir: "{tmp}"; Flags: nocompression dontcopy
*************
[code*]
var
MsiCheckBox: TNewCheckBox;
************

MsiCheckBox := TNewCheckBox.Create(WizardForm);
with MsiCheckBox do
begin
Caption := ExpandConstant('{cm:Msi}');
Parent := SystemPage.Surface;
Font.Name := 'Courier New';
SetBounds(ScaleX(20), ScaleY(534), ScaleX(235), ScaleY(14));
end;
***********
procedure CurStepChanged(CurStep: TSetupStep);
var ErrorCode : Integer;
begin
if CurStep = ssInstall then begin
if MsiCheckBox.Checked then
begin
ExtractTemporaryFile('msxml.msi');
WizardForm.FilenameLabel.Caption:='{cm:MsiInstall}';
ShellExec('', ExpandConstant('{tmp}\msxml.msi'),'' , '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
end;
end;
end;
 
Последнее редактирование:
Сверху