Inno setup как добавить directx

Обновлено: 07.07.2024

Очень часто требуется создать такой установщик, который бы был способен устанавливать программу как в каталог %PROGRAMFILES% (при наличии прав локального администратора), так и в %LOCALAPPDATA% (при отсутствии оных).

В данном HOWTO мы подробно рассмотрим процесс создания такого инсталлятора, приведём примеры работающего кода и опишем подводные камни, которые вам могут встретится.

Создание инсталлятора

  1. Откройте исходный код сценария установки (файл *.iss) в любом текстовом редакторе или самой среде Inno Setup.
  2. В блоке [Setup] найдите директиву DefaultDirName и замените её следующую:

У этой директивы возможны следующие значения:

Подводные камни

  1. Не устанавливайте значение директивы PrivilegesRequired в lowest, т.к. в таком случае программа установки будет всегда работать с правами пользователя и установиться в %PROGRAMFILES% не сможет.
  2. В случае если вы собираетесь устанавливать динамические библиотеки или например шрифты в системные каталоги Windows, то обязательно делайте дополнительную проверку, например:

Примеры

Готовый пример вы можете найти в нашем git репозитории проекта SRC Repair.

25 комментариев к записи

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

Приветствую. Надеюсь на вас!)))

Как сделать возможность выбора из нескольких вариантов папки установки?
У меня есть приложение, которое устанавливается в папку дополнений программы:

В Inno я это прописал так:

DefaultDirName=\Name
И все отлично работает.

Вопрос. Есть ли возможность на этапе выбора места установки, предоставить пользователю возможность выбора между предложенными вариантами?
Чтобы он из 4-5 вариантов поставил галочку на нужную ему и мое приложение установилось по выбранному пути.

Можно конечно предложить ему вручную искать нужную ему папку, но хотелось бы позаботиться о нем и упростить этот момент.

@Михаил
Можно написать свою собственную функцию в секции Code, которая будет проверять список каталогов и затем выводить отдельное окно или даже форму с вариантами выбора.

Доброго времени суток. Скажите пожалуйста сможете ли вы написать код проверки имени пользователя через реестр на стадии инициализации установки? Разъясняю, если имя пользователя на русском языке установка прекращалась с выводом диалогового окна что-то типа установка не возможна, если имя пользователя на английском языке, установка шла обычно. Или какие есть варианты, или подскажите в каком направлении идти. Спасибо.

@Сергей
Текущее имя пользователя, от имени которого запущен установщик, хранится в константе , а также может быть получено посредством функции GetUserName().

@Сергей
Следует использовать именно GetUserName(), после чего проверять это значение на наличие запрещённых символов внутри блока code например при помощи регулярного выражения, перекрыв ряд системных функций.

Тогда как я понял проверку имени пользователя через реестр взять нельзя?. Тогда откуда брать проверку если скажем в системе два пользователя, один с правами администратора, другой простой пользователь. Если можно не большой примерчик, откуда брать имя пользователя с правами администратора, и с чем сравнивать (ну например русский шрифт верхнего и нижнего регистра).

@Сергей
Функция GetUserName() всегда возвращает имя пользователя, от имени которого запущена программа установки. Зачем вам проверять другие учётные записи? Программа всё равно установится для данного пользователя.

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

@Сергей
Это-то понятно. Мне вот только не очень понятно зачем проверять все остальные учётные записи в системе? Если программа устанавливается от конкретной, то она и работать будет от неё, поэтому результата функции GetUserName() для ваших целей будет достаточно. В блоке code переопределяете системные функции завершения процесса подготовки к установке и в них проверяете значение GetUserName() на наличие запрещённых символов по регулярному выражению или посимвольно, а затем продолжаете или отменяете установку. Это достаточно просто.

Но если уж хочется всё-таки проверить все остальные учётные записи, то потребуется написать специальную функцию в блоке code, которая будет импортировать ряд функций WinAPI через external stdcall, через которые получать список пользователей ОС и уже затем проверять их все. Подробнее в MSDN.

Пример работы с вызовами WinAPI из инсталляторов InnoSetup можно найти здесь.

[Run]
Filename: \Redistable\DirectX\dxwebsetup.exe; Parameters: /Q; StatusMsg: Обновляется Microsoft DirectX. ; Flags: skipifdoesntexist; Tasks: DX;
[/SOURCE][HR][/HR]2. Установка софта с помощью секции [Components]
[SOURCE="iss"]
[Components]
Name: "DX"; Description: "DirectX"

aLLeXUs

Участник
aLLeXUs,
В скрипте эти строчки находятся?
[SOURCE="iss"][UninstallDelete]
Type: filesandordirs; Name: "";[/SOURCE]
Если нет - то добавь их.. Ещё один вариант
[SOURCE="iss"]DelTree(ExpandConstant(''), True, True, True);[/SOURCE]
Добавь её после Exec2

STALKER-56

Мимокрокодил
Как поделить на диске? ни разу не побывал щас сделал репак хотелось бы поделить на диске что нужно прописать и как правильно закинуть в исо файл

vint56

Ветеран

Возможные значения:
yes или no
Значение по умолчанию:
no

Опмсание:
При значении yes будет производиться разбиение на диски. Определяет, создавать ли компилятору один файл SETUP.EXE, или делить его на файлы (SETUP-*.BIN), которые помещаются на дискету, CD-ROM, DVD-ROM или другой носитель. Каждый файл в своем имени будет содержать номер, по которому можно будет определить на какой диск его следует скопировать. Скопируйте SETUP.EXE и SETUP-1.BIN на первый диск, SETUP-2.BIN на второй и т. д.

В этом случае размер каждого файла и число файлов, создаваемых для каждого диска, диктуется директивой DiskSliceSize и SlicesPerDisk секции [Setup]. Другие директивы, отвечающие за разбиение на диски, которые вы захотите внедрить, должны включать директивы DiskClusterSize и ReserveBytes.

Обратите внимание, что нужно обязательно задать этим директивам значение yes, если размер сжатого файла инсталлятора превышает 2,100,000,000 байт, даже если вы не планируете разбивать инсталлятор на диски. (Инсталлятор будет работать правильно, даже если все SETUP-*.BIN файлы будут размещены на одном диске).

Возможные значения:
262144 до 2100000000, или max
Значение по умолчанию:
max (2100000000)

Описание:
Определяет максимальное количество байтов на дисковую часть (SETUP-*.BIN файл). Обычно, оно должно быть установлено в общее количество байтов, доступных на дисковых носителях, разделенных на значение директивы SlicesPerDisk секции [Setup], значение которого по умолчанию 1.

Директива игнорируется, если разбиение на диски не включено (директива DiskSpanning секции [Setup]).

Чтобы оптимально заполнить DVD диск размером 4.7 Гбайт, используйте:

SlicesPerDisk=3
DiskSliceSize=1566000000
Чтобы оптимально заполнить DVD диск размером 8.5 Гбайт, используйте:

SlicesPerDisk=5
DiskSliceSize=1708200000
Чтобы оптимально заполнить CD (80-минутные) диск размером 700 Мбайт, используйте:

SlicesPerDisk=1
DiskSliceSize=736000000
Чтобы оптимально заполнить 1.44MБ гибкие диски, используйте:

Конфигурация компьютера
Процессор: Intel(R) Core(TM)2 Duo CPU E8200 @ 2.66GHz
Материнская плата: GigaByte GA-P35-DS3R
Память: Hynix DDR2 PC800 2x512 + 2x1024 Мб
HDD: Seagate 500 Гб
Видеокарта: NVIDIA GeForce 8800 GT
Блок питания: HIPER HPU-4M580 580W ATX2.2
CD/DVD: PIONEER DVD-RW DVR-215D
Монитор: 24'' Acer P243w HDMI
ОС: Windows XP Pro SP3 Russian
Прочее: Borland Delphi 7.0 Enterprise

Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы.

- онлайн справочник, содержит ответы на многие вопросы | старая chm-версия;

- руководство по расширенным возможностям Inno Setup от Kindly;

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

- Программа для объединения нескольких скриптов InnoSetup в один;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы. Авраам Линкольн.

а в Setup, тогда, LicenseFile и InfoBeforeFile, я думаю, прописывать не стоит, хотя ошибки быть не должно вроде
А на вторю часть я отвечал уже - язык может применятся как компонент, пример дополнил

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

Последний раз редактировалось Gnom_aka_Lexander, 09-03-2011 в 22:18 .

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

Конфигурация компьютера
Процессор: AMD Ryzen R7 3700x [TR HR02 Macho rev.A]
Материнская плата: Asus Prime X370-A
Память: 2*16Gb G.Skill SNIPER X [F4-3600C19D-32GSXWB]
HDD: Apacer AS2280P4 480gb + GoodRAM Iridium PRO 512Gb
Видеокарта: Asus GT1030 GDDDR5
Звук: Creative SB X-Fi Gamer
Блок питания: Cooler Master V550 (RS550-AFBAG1)
CD/DVD: -
Монитор: Iiyama XB2783HSU3 + Hisense 55U7A
Ноутбук/нетбук: Prestigio 141C02 Kubuntu + LiteOn MU3 120gb
ОС: Win7x64 SP1
Индекс производительности Windows: 7.8
Лександер, спасибо, но это только первая часть вопроса.

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!

Первый мой скрипт: Dead Space 2 + ISDone 0.5 final
Скрипт довольно простой.Возможность подключать неограниченое количество разных модулей, добавлен всем требуемый черный цвет инсталлятора и другое увидете в скрипте

Подарочек от меня) Еще один закос под мехов. Скрипт писался еще прошлым летом, с инно дружить я только начинал, поэтому простите за бардак в скрипте. Правда выложить решил только сейчас. Старался, подгонял все координаты\размеры, поэтому считаю этот скрипт более "полным". Координата текста брались из репака ассассина, окна установки из blur
R.G. Механики + ISDone 4.0 или ISDone 5.0 Final

Последний раз редактировалось duxa, 23-03-2011 в 18:35 .

Ребята помогите к скрипту

[Setup]
AppId=
AppName=1
AppVerName=1.0
AppPublisher=1
DefaultDirName=C:\Games\1
DefaultGroupName=1
OutputBaseFilename=setup
Compression=lzma/ultra64
SolidCompression=true
;disablereadypage=true
InternalCompressLevel=ultra64
DiskSpanning=true
PrivilegesRequired=none
WizardImageFile=1.bmp
WizardSmallImageFile=mini.bmp
UninstallDisplayIcon=\5.ico
AppVersion=
AllowRootDirectory=true
DirExistsWarning=no
AllowNoIcons=true
UninstallFilesDir=\Uninstall
VersionInfoProductName=1
AppCopyright=Dragon

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: desktopicon; Description: ; GroupDescription:
Name: quicklaunchicon; Description: ; GroupDescription: ; Flags: unchecked
Name: tasks1; Description: Обновить компоненты DirectX; GroupDescription: Дополнительные программы:

[Files]
Source: Office2007.cjstyles; DestDir: ; Flags: dontcopy nocompression
Source: ISSkin.dll; DestDir: ; Flags: dontcopy nocompression
source: 1.bmp; DestDir: ; Flags: dontcopy nocompression
Source: 3.bmp; DestDir: ; Flags: dontcopy nocompression
Source: isgsg.dll; DestDir: ; Flags: dontcopy nocompression
Source: splash.jpg; DestDir: ; Flags: dontcopy nocompression
Source: 5.ico; DestDir:


[Run]
Filename: \Redist\directx\dxsetup.exe; WorkingDir: \Redist\directx\; Tasks: Tasks1


[UninstallDelete]
Name: ; Type: filesandordirs; Tasks: ; Languages:
[code]
var
AboutButton, CancelButton, URLButton: TButton;
BackgroundBitmapImage: TBitmapImage;
BackgroundBitmapText: TNewStaticText;
BmpFile: TBitmapImage;

procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Office2007.cjstyles');
LoadSkin(ExpandConstant('\Office2007.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
UnloadSkin();
end;

procedure AboutButtonOnClick(Sender: TObject);
begin
MsgBox('is', mbInformation, mb_Ok);
end;

procedure InitializeWizard();
begin
ExtractTemporaryFile('1.bmp'); //Извлекаем файл, который пойдет в окно инсталлятора
ExtractTemporaryFile('3.bmp'); //Извлекаем файл, который пойдет в окно инсталлятора
//Вставляем изображение в окно инсталлятора, для каждой страницы нужно добвлять изображение заново
ExtractTemporaryFile('splash.jpg');
BmpFile:= TBitmapImage.Create(WizardForm);
with BmpFile do begin
Bitmap.LoadFromFile(ExpandConstant('\1.bmp'));
SetBounds(ScaleX(0), ScaleY(0), ScaleX(497), ScaleY(313));
Stretch:= true;
Parent:= WizardForm.WelcomePage;
end;

BmpFile:= TBitmapImage.Create(WizardForm);
with BmpFile do begin
Bitmap.LoadFromFile(ExpandConstant('\3.bmp'));
SetBounds(ScaleX(0), ScaleY(0), ScaleX(497), ScaleY(313));
Stretch:= true;
Parent:= WizardForm.FinishedPage;
end;

with WizardForm do
begin
WelcomeLabel1.Hide;
WelcomeLabel2.Hide;
FinishedHeadingLabel.Hide;
FinishedLabel.Hide;
end;
begin
with WizardForm.NextButton do
begin
Left := ScaleX(320);
end;

CancelButton := WizardForm.CancelButton;
AboutButton := TButton.Create(WizardForm);
with AboutButton do begin
Left := WizardForm.ClientWidth - CancelButton.Left - CancelButton.Width;
Top := CancelButton.Top;
Width := CancelButton.Width;
Height := CancelButton.Height;
Caption := '&Repack info';
OnClick := @AboutButtonOnClick;
Parent := WizardForm;
end;

URLButton := TButton.Create(WizardForm);
with URLButton do begin
Left := AboutButton.Left + AboutButton.Width + ScaleX(50);
Top := CancelButton.Top;
Width := CancelButton.Width;
Height := CancelButton.Height;
Caption := 'Наш Сайт';
OnClick := @URLLabelOnClick;
Parent := WizardForm;
end;
end;
BackgroundBitmapImage := TBitmapImage.Create(MainForm);
BackgroundBitmapImage.Left := ScaleX(50);
BackgroundBitmapImage.Top := ScaleY(100);
BackgroundBitmapImage.AutoSize := True;
BackgroundBitmapImage.Bitmap := WizardForm.WizardBitmapImage.Bitmap;
BackgroundBitmapImage.Parent := MainForm;

BackgroundBitmapText := TNewStaticText.Create(MainForm);
BackgroundBitmapText.Left := BackgroundBitmapImage.Left;
BackgroundBitmapText.Top := BackgroundBitmapImage.Top + BackgroundBitmapImage.Height + ScaleY(8);
BackgroundBitmapText.Caption := 'TBitmapImage';
BackgroundBitmapText.Parent := MainForm;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID <> wpWelcome then begin
AboutButton.Hide; URLButton.Hide end else begin
AboutButton.Show; URLButton.Show; end;
end;

Прикрепить
вот это

[code]
var
TDV: TFolderTreeView;
TFV: TStartMenuFolderTreeView;

На лекции осваиваются приемы разработки инсталляционного файла нашей программы.

Зачем нужны инсталляторы

Наш курс подходит к концу. Мы написали множество проектов, научились делать справку и подключать её к программе, но хотелось бы ещё какие-то из проектов опубликовать в Сети! А что для этого требуется? Установочный файл . Кстати, если вы будете писать программы на заказ, то создание инсталлятора почти наверняка будет обязательным условием проекта.

Казалось бы, можно обойтись каким-нибудь популярным архиватором вроде WinRAR, сделать на нем самораспаковывающийся SFX-архив, прописать, какой файл программы куда должен быть распакован. Однако так вы получите лишь примитивный инсталлятор, в котором пользователю не предоставляется никаких возможностей выбора, а это плохо - даже если пользователь при установке программ обычно использует все настройки " по умолчанию", нажимая только кнопки "Далее" или "Next", ему нравится осознавать, что от него что-то зависит, что он имеет возможность выбора.

Предположим, ваш проект достаточно сложен, содержит десятки файлов. Вы желаете, чтобы пользователь имел выбор способа установки вашей программы: куда устанавливать, нужно ли создавать ярлыки на рабочем столе и в панели быстрого запуска? Устанавливать ли полную версию, выборочную или минимальную? Регистрировать ли программу в реестре или создать INI- файл ? Кроме того, пользователь может когда-нибудь захотеть эту программу удалить со своего ПК, а значит, нужно предусмотреть и обратный процесс - деинсталляцию. Все эти операции сделать в обычном архиваторе будет невозможно, или, по крайней мере, чрезвычайно сложно. Зато эти же операции легко создаются в специальных программах-инсталляторах, которые входят в группу утилит программиста. О них и будем говорить на этой лекции.

Обзор инсталляторов

Некоторые среды разработки программ имеют в своем составе инсталляторы. Так, в состав Delphi входит бесплатный инсталлятор Install Shield Express, который, кстати, можно скачать с сайта производителя. Считается, что если в состав IDE входит инсталлятор, то для создания инсталляционного файла (или CD) лучше пользоваться им. Install Shield Express, например, имеет очень удобную функцию включения в инсталляционный пакет "движка" баз данных BDE , который, впрочем, уже устарел, и теперь практически не используется. Ничего другого выдающегося у Install Shield Express не наблюдается, поэтому даже Delphi-программисты предпочитают более "продвинутые" инсталляторы.

Lazarus вообще не имеет в своем составе подобной утилиты, однако существует множество инсталляторов сторонних разработчиков - как платных, так и бесплатных, с помощью которых Lazarus-программист может создать инсталляционный файл или даже загрузочный CD/DVD.

Какие ещё инсталляторы существуют? Их множество: Setup Factory , Visual Studio Installer, Nullsoft Install System , Smart Install Maker и много-много других.

Особо хотелось бы выделить один из самых популярных бесплатных инсталляторов, обладающих широкими возможностями - Inno Setup . Это система создания инсталляторов для Windows -программ. Inno Setup появился в 1997 году и является не просто бесплатным, но и открытым проектом ( Open Source), превосходит многие коммерческие установщики по функциональности и стабильности. Мы будем рассматривать создание инсталляторов на основе Inno Setup .

Следует заметить, что при написании курса рассматривалась версия Inno Setup 5.5.4, а они достаточно часто обновляются. Так что на сайте производителя, возможно, вы найдете более свежую версию.

Файл лицензии

Обычно при установке какой либо программы, пользователю вначале предлагается прочитать и принять лицензионное соглашение (лицензию) программы. Пользователь читает (или чаще, не читает) лицензию, устанавливает радиокнопку с надписью "Я принимаю условия" (или что-то аналогичное), после чего становится доступной кнопка "Далее". Наверное, наш инсталлятор должен также выводить какую то лицензию? Где её взять, или как её сделать, не будучи юристом?

Читайте также: