Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: Seeba
Дата сообщения: 23.12.2007 15:09
Здравствуйте!
У меня два вопроса:

1. Мне нужно удалять папку с содержимым сразу после нажатия снопки "Установить".
Как это сделать именно с нажатием кнопки "Установить", но до непосредственной установки файлов знаю

procedure CurStepChanged(CurStep:TSetupStep);
begin
if CurStep=ssInstall then RemoveDir(ExpandConstant('{app}\...'));
end;

а вот удалить не получается, т.к. RemoveDir удаляет только пустые папки. Подскажите пожалуйста как удалить папку.
Спасибо!

2. Как добавить сообщение?

Спасибо!
Автор: serg_aka_lain
Дата сообщения: 23.12.2007 16:37
Seeba

В личке код по твоим вопросам.
Автор: Genri
Дата сообщения: 23.12.2007 17:22
maxdddca123 -- тебе нужен серийный номер диска или тома?
Если ничего не имеешь против использования длл, можешь и тот и другой получить примерно так:

Код:
[Setup]
AppName=VolumeSerialNo
AppVerName=VolumeSerialNo
CreateAppDir=false

[Files]
Source: ISTask.dll; Flags: dontcopy

[Code]
function SerialNumberDisk(lpRootPathName: PChar): PChar;
external 'SerialNumberDisk@files:ISTask.dll stdcall delayload';

function SerialNumberHDD(Controller, Drive: Integer): PChar;
external 'SerialNumberHDD@files:ISTask.dll stdcall delayload';


//**************************************************//
function InitializeSetup(): Boolean;
var
sn: string;
begin
sn:= SerialNumberHDD(0,0) + #10#13 + SerialNumberDisk('c:\');

MsgBox(sn, mbInformation, MB_OK);

Result:=True;
end;
Автор: maxdddca123
Дата сообщения: 24.12.2007 05:48
Genri
Ой, как приятно вас снова видеть - палочка выручалочка Да с этим кодом то что надо, спасибо огромное. Вы как всегда на высоте !
А ещё подскажите если у меня стоит несколько ХДД то параметры какого из них определяются ? Как это поменять что бы опреедлялось для другого?
Автор: Kindly
Дата сообщения: 24.12.2007 11:07
Genri, не мог бы ты сообразить примерчик чтения и записи данных в XML файлах? Вещь становится актуальной.
Автор: Genri
Дата сообщения: 24.12.2007 17:55
maxdddca123

Цитата:
если у меня стоит несколько ХДД то параметры какого из них определяются ? Как это поменять что бы опреедлялось для другого?
-- если речь идет о SerialNumberHDD, то серийник определяется для диска с номером <Drive> на контроллере с номером <Controller>. Т.е. :
SerialNumberHDD(0,0) - первый диск на первом контроллере
SerialNumberHDD(1,3) - четвертый диск на втором контроллере
.. и.т.д.

Можешь перебирать в цикле - контроллеры от 0 до 15 и диски от 0 до 3 на каждом контроллере.

Kindly -- я не спец по XML. Для себя делал [more=так]
Код:
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Files]
Source: report.xml; Flags: dontcopy


Код:
procedure InitializeWizard();
var
xml, currNode: Variant;
begin
ExtractTemporaryFile('report.xml');

xml := CreateOleObject('MSXML2.DOMDocument');
xml.async:= false;
xml.preserveWhiteSpace:= true;
xml.load(ExpandConstant('{tmp}\report.xml'));

currNode:= xml.selectSingleNode('//SMBIOS/section[(@name=''Mainboard'')]')
MsgBox(currNode.text, mbInformation, MB_OK);
end;
Автор: Genri
Дата сообщения: 24.12.2007 23:23
Kindly -- запись наверно [more=так]
Код:
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Code]
procedure InitializeWizard();
var
rootNode, subNode, xmlParser, Fragment: Variant;
begin
xmlParser := CreateOleObject('MSXML2.DOMDocument');
//'Создание объявления XML
xmlParser.appendChild(xmlParser.createProcessingInstruction('xml', 'version="1.0" encoding="windows-1251"'));
//'Создание комментария
xmlParser.appendChild(xmlParser.createComment('Текст комментария'));
//'Создание корневого элемента
rootNode:= xmlParser.appendChild(xmlParser.createElement('ROOT'));

//'Создание первого вложенного элемента
subNode:= rootNode.appendChild(xmlParser.createElement('SUB'));
subNode.text:= 'Текст первого вложенного элемента';

//'Создание второго вложенного элемента
subNode:= rootNode.appendChild(xmlParser.createElement('SUB'));
//'Создание раздела CDATA
subNode.appendChild(xmlParser.createCDATASection('<<< >>> &&& Произвольные текстовые данные'));
//'Создание ссылки на примитив
subNode.appendChild(xmlParser.createEntityReference('amp'));
//'Создание текстового узла
subNode.appendChild(xmlParser.createTextNode('Текст второго вложенного элемента'));

//'Создание третьего вложенного элемента с использованием пространства имён
subNode:= rootNode.appendChild(xmlParser.createNode(1, 'html:H1', 'http://www.w3c.org/TR/REC-html40/'));
subNode.text:= 'Заголовок HTML';

//'Создание четвёртого и пятого вложенных элементов с использованием фрагмента
Fragment:= xmlParser.createDocumentFragment;
Fragment.appendChild(xmlParser.createElement('SUB'));
Fragment.appendChild(xmlParser.createElement('SUB'));
rootNode.appendChild(Fragment);

xmlParser.save('C:\Test.xml')
end;
Автор: Kindly
Дата сообщения: 25.12.2007 12:17
Genri, неплохо - спасибо, будем юзать

Genri, в кое-каких проектах мне приходится использовать обновление проверки, т.е. нажал кнопку "Refresh" - сработала определенная функция. Задача состоит в том, чтобы какая-либо проверка выполнялась через определенный интервал времени автоматически, без ручного нажатия. Это актуально, например, если создавать в Inno свой игровой авторан, когда будет совершаться проверка на определенную запись в реестре, и кнопки будут менять состояние. В апи справочнике нарыл функции для построения таймера:

KillTimer
QueryPerformanceCounter
QueryPerformanceFrequency
SetTimer
TimerProc

Но разобраться в написании кода не смог. В идеале нужно так: приложение запускается, стартует таймер, через каждую секунду выполняется указанная функция (например, считывание определенной записи реестра), ну и ес-но таймер останавливается при закрытии приложения. Что можно сделать по этому поводу?
Автор: maxdddca123
Дата сообщения: 25.12.2007 12:42
Kindly
А что это за апи справочник ? Можно его скачать или посмотреть как нить ?
Автор: Genri
Дата сообщения: 25.12.2007 14:08
Kindly

Цитата:
если создавать в Inno свой игровой авторан
-- микроскопом - гвозди?

Вероятно проблема в том, что инно не поддерживает обратный вызов. Я тоже на эти грабли наступал. В старой теме есть вариант решения. Смотри от http://forum.ru-board.com/topic.cgi?forum=5&topic=4801&start=760#21 и ниже.
Автор: Cryzer
Дата сообщения: 25.12.2007 15:08
Здравствуйте!
1) Секция [Icons]: константа {group} ссылается на то, что пользователь при инсталляции написал для создания папки Пуска. Но при этом имя создаётся для All Users! Но мне надо, чтобы в компонетах пользователь мог выбрать создание введённого при установке имени папки Пуска не только для всех, но ещё и для текущего. Создание констант {userprograms} и {commonprograms} в этой секции (а также ссылка на [Components] для выбора) проблему не решили, т.к. пользователь не имел возможности ввести любое название создаваемой папки в Пуске. Т.е. я хочу чтобы была возможность создать для всех или только текущего, плюс возможность ввести при установке любое имя создаваемой папки... Помогите, люди! Век не забуду!

2) Как при деинсталляции удалить определённые секции из INI-файлов? К примеру, вот такую:
...
[RAD Video Tools]
SmackComp=/l104
SmackMix=/l104
...

3) Предположим, я установил программу в папку C:\Program Files\SuperCompany\MyProg\. В секции [UninstallDelete] я написал, чтобы при удалении удалилась папка C:\Program Files\SuperCompany\MyProg\. При этом не известно, есть ли ещё какие-нибудь папки в C:\Program Files\SuperCompany\ ? Поэтому мне надо, чтобы эта папка удалилась тоже, если окажется пустой после удаления C:\Program Files\SuperCompany\MyProg\. Очень прошу, выручите!
Автор: Unc1e
Дата сообщения: 25.12.2007 16:19
Cryzer, по 1-ому
[more][Code]
var
CheckListBox: TNewCheckListBox;

//[Icons]
//Name: "{code:MyConst}\My Program"; Filename: "{app}\MyProg.exe"

procedure NoIconsOnClick(Sender: TObject);
begin
with WizardForm, WizardForm.NoIconsCheck do
begin
GroupEdit.Enabled:= Not Checked;
GroupBrowseButton.Enabled:= Not Checked;
CheckListBox.Enabled:= Not Checked;
end;
end;

function MyConst(Param: String): String;
begin
if CheckListBox.Checked[1] then
Result := ExpandConstant('{commonprograms}')+'\'+ WizardForm.GroupEdit.Text
else
Result := ExpandConstant('{userprograms}')+'\'+ WizardForm.GroupEdit.Text;
end;

procedure InitializeWizard();
begin
WizardForm.NoIconsCheck.OnClick:= @NoIconsOnClick;
CheckListBox := TNewCheckListBox.Create(WizardForm);
CheckListBox.Top := WizardForm.GroupEdit.Top + WizardForm.GroupEdit.Height + ScaleY(10);
CheckListBox.Width := WizardForm.GroupEdit.Width;
CheckListBox.Height := ScaleY(66);
CheckListBox.BorderStyle := bsNone;
CheckListBox.ParentColor := True;
CheckListBox.MinItemHeight := WizardForm.TasksList.MinItemHeight;
CheckListBox.ShowLines := False;
CheckListBox.WantTabs := True;
CheckListBox.Parent := WizardForm.SelectProgramGroupPage;
CheckListBox.AddGroup('Создать ярлыки:', '', 0, nil);
CheckListBox.AddRadioButton('Для всех пользователей', '', 0, True, True, nil);
CheckListBox.AddRadioButton('Только для меня (' + GetUserNameString + ')', '', 0, False, True, nil);
end;[/more]
Скрипт by Genri.
Автор: Genri
Дата сообщения: 25.12.2007 17:22
Unc1e

Цитата:
Скрипт by Genri
-- не уверен. Либо кусок выдран из контекста.
Автор: Unc1e
Дата сообщения: 25.12.2007 20:46
Genri, оригинальный скрипт именно Ваш, я лишь его немного поправил.
Автор: Vitalliano
Дата сообщения: 26.12.2007 09:58
Ребята я прошу у Вас помощи, помогите отключить одну строку (NET. Frameworck) в скрипте Виктора Доброва?
Автор: Kindly
Дата сообщения: 26.12.2007 12:09
Genri

Цитата:
микроскопом - гвозди?
ну это к примеру, а вообще есть такой проект у меня "Crack Installer", в нем поддерживаются различные фишки, хотелось бы еще и эту прикрутить. В любом случае спасибо.

Добавлено:
maxdddca123

Цитата:
А что это за апи справочник ?

Забирай здесь
Автор: Cryzer
Дата сообщения: 26.12.2007 16:02
Unc1e
Большое спасибо, что помогли!

А второй и третий вопросы никто не знает?
Автор: RusDiego
Дата сообщения: 28.12.2007 12:59
Здравствуйте!
А не подскажет ли мне кто-нибудь, возможно ли такое:
Есть игра, и есть файлы патча и мода, которые устанавливаются в папку с игрой.
Я сделал инсталятор этих модов.
А можно ли сделать так, чтобы при деинсталяции можно было бы выбрать компоненты которые нужно удалить?
Тоесть:
Перед инсталяцией создавалась папка $BAKUP$
в которую складывались те файлы которые будут перезаписаны.
А при деинсталяции выскакивало меню с чек боксами выбора, что будем удалять и если
выбраны 1) только мод или 2) мод и патч, то удалялись только мод в первом случае, а если второе, то удалялось бы все и возвращались исходные файлы из $BAKUP$

[Setup]
AppName='Gothic III Comunity Patch'
AppVerName='Gothic 3 Comunity Patch, v1.5.2 RC1 Ru'
DefaultDirName={reg:HKLM\SOFTWARE\JoWooD Productions Software AG\Gothic III,INSTALL_DIR|C:\TEMP}
LicenseFile=CommunityPatch\Disclaimer_RU.txt
InfoBeforeFile=CommunityPatch\CP_Readme_1_52_RU.txt
InfoAfterFile=CommunityPatch\CP_Changelog_1_52_RU.txt
OutputDir=Output
ArchitecturesInstallIn64BitMode=x64
DefaultGroupName=Gothic III Comunity Patch
OutputBaseFilename=Gothic_3_Comunity_Patch_v1.5.2_RC1_Russian
SetupIconFile=Plugins\Gothic3.ico
Compression=lzma
SolidCompression=yes
WizardImageFile=Plugins\modern-wizard.bmp
WizardSmallImageFile=Plugins\modern-wizardSmallImage.bmp

[Files]
Source: Vcredist\vcredist_x86.exe; DestDir: {tmp}; Check: not Is64BitInstallMode; Flags: deleteafterinstall
Source: Vcredist\vcredist_x64.exe; DestDir: {tmp}; Check: Is64BitInstallMode; Flags: deleteafterinstall
Source: CommunityPatch\*; DestDir: {app}; Flags: uninsneveruninstall overwritereadonly ignoreversion recursesubdirs createallsubdirs; Components: CP
Source: QuestPaket\*; DestDir: {app}; Flags: overwritereadonly ignoreversion recursesubdirs createallsubdirs; Components: QP
Source: ArmyOfDarkness\*; DestDir: {app}; Flags: overwritereadonly ignoreversion recursesubdirs createallsubdirs; Components: AD
Source: ArealFont\*; DestDir: {app}; Flags: overwritereadonly ignoreversion recursesubdirs; Components: AF
Source: AntiLens\*; DestDir: {app}; Flags: overwritereadonly ignoreversion recursesubdirs; Components: AL
Source: Library\binkw32.dll; DestDir: {app}; Flags: overwritereadonly ignoreversion recursesubdirs; Components: UP
Source: Library\fmodex.dll; DestDir: {app}; Flags: overwritereadonly ignoreversion recursesubdirs; Components: UP

[Components]
Name: CP; Description: Gothic 3 Community Patch v1.5.2 русская сборка от Mighty DWARF; Types: custom compact full; Flags: disablenouninstallwarning
Name: QP; Description: Мод Questpaket 1.5.1 RC1 добавляет новые квесты.; Types: custom full; Flags: disablenouninstallwarning
Name: AD; Description: Восстановить заклинание 'Армия Тмы', деактивируемое патчем.; Types: custom full; Flags: disablenouninstallwarning
Name: AF; Description: Заменить стандартный шрифт Готики III на Arial, для удобства чтения.; Types: custom full; Flags: disablenouninstallwarning
Name: AL; Description: Отключить солнечные блики на камере.; Types: custom full; Flags: disablenouninstallwarning
Name: UP; Description: Обновление библиотек binkw32 и fmodex.dll.; Types: custom compact full; Flags: disablenouninstallwarning

[Run]
Filename: {tmp}\vcredist_x86.exe; Parameters: /Q; WorkingDir: {tmp}; Flags: postinstall; Check: not Is64BitInstallMode
Filename: {tmp}\vcredist_x64.exe; Parameters: /Q; WorkingDir: {tmp}; Flags: postinstall; Check: Is64BitInstallMode

[Code]
function InitializeSetup(): Boolean;
var
ResultCode: Integer;
s, ResultStr:string;
begin
Result:=True;
If not RegKeyExists(HKLM, 'Software\JoWooD Productions Software AG\Gothic III')
then
begin
MsgBox('Готика 3 не обнаружена на Вашем компьютере.' #13#13 'Установка патча отменяется.', mbError, mb_Ok);
Result:=False;
end
else
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Gothic III_is1', 'DisplayVersion', ResultStr)
then
begin
If ResultStr<>'1.12'
then
begin
ResultStr:=RemoveQuotes(ResultStr);
MsgBox('Официальное обновление версии 1.12 не обнаружено.' #13#13 'Установка патча отменяется.', mbError, mb_Ok);
Result:=False;
end
end;
end;
end;

[Registry]
Root: HKLM; Subkey: Software\JoWooD Productions Software AG\Gothic III Update 1.5.2 rus
Root: HKLM; Subkey: Software\JoWooD Productions Software AG\Gothic III Update 1.5.2 rus\1.00.0000
Root: HKLM; Subkey: Software\JoWooD Productions Software AG\Gothic III Update 1.5.2
Root: HKLM; Subkey: Software\JoWooD Productions Software AG\Gothic III Update 1.5.2\1.00.0000

[CustomMessages]
NameAndVersion=%1, версия %2:
AdditionalIcons=Дополнительные значки:
CreateDesktopIcon=Создать значок на &Рабочем столе:
CreateQuickLaunchIcon=Создать значок в &Панели быстрого запуска:
ProgramOnTheWeb=Сайт %1 в Интернете:
UninstallProgram=Деинсталлировать %1:
LaunchProgram=Запустить %1:
AssocFileExtension=Св&язать %1 с файлами, имеющими расширение %2:
AssocingFileExtension=Связывание %1 с файлами %2...:

[Languages]
Name: russian; MessagesFile: compiler:Default.isl

Пока.
Автор: regnad
Дата сообщения: 28.12.2007 22:03
помогите плиз с добавление пути в INI-файл.
кароче в папке с установленой игрой есть файл SteamEmu.ini
как сделать так чтобы инсталлятор в этом файле дописывал путь к установленой игре?
вот строчка с INI-файла для примера:
[Emulator]
BaseDir=C:\Program Files\Orange Box
Автор: Ruud
Дата сообщения: 29.12.2007 00:39
regnad

С помощью программы ISTool в секции Ini импортируйте этот файл и измените параметр
C:\Program Files\Orange Box на {app}.
Автор: Kindly
Дата сообщения: 29.12.2007 11:26
*****************************
InnoCry v1.2.4 Public release
*****************************
http://webfile.ru/1661258
Патчер для инсталляторов Inno Setup, позволяющий удалять пароли с инсталляторов. Новость узнал только что, сам еще не пробовал.
Genri - задашь тулзе жару? Если что
Автор: Genri
Дата сообщения: 29.12.2007 13:33
Kindly -- а отдыхать когда ?

Пару скриптов попробовал - плохо.

1. Если Encryption=yes - не работает. Пытается ставить, но файлы не вытягивает.

2. Нижеследующий скрипт не обрабатывает (даже без шифрования):

Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
Encryption=no

[Files]
Source: Files\*; DestDir: {app}

[Code]
function CheckPassword(Password: String): Boolean;
begin
if Password = 'aaa' then Result:= True;
end;
Автор: Kindly
Дата сообщения: 29.12.2007 14:12
Genri - отдыхать конечно надо
Прога обламывается также с Corona.
Может помочь авторам для развития тулзы?
Автор: RaP1D
Дата сообщения: 29.12.2007 15:59
Помогите пожалуйста сделать следущее:

Чтобы в директории установки создавался .bat файл с нужным мне содержанием, например:
@echo off
start hl2.exe

Только не надо говорить, что можно просто этот файл вогнать в инсталяху, надо чтобы он создавался!
Автор: iTASmania_Inc
Дата сообщения: 29.12.2007 17:14
RaP1D
procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep=ssPostInstall) then
SaveStringToFile(ExpandConstant('{app}\file.bat'),
'@echo off' + #13#10 + 'start hl2.exe',True)
end;
Автор: RaP1D
Дата сообщения: 29.12.2007 18:12
iTASmania_Inc
Большое спасибо!! Сейчас попробую... Всё РАБОТАЕТ!
Автор: Pacifist
Дата сообщения: 29.12.2007 20:23
Не секрет что почти одинаковые файлы ужимаются в 7zip solid архиве очень хорошо. Благодаря этому у меня получилось сжать полную версию английской игры Lost Planet Extreme Condition (7,15 GB) и русифицированную часть этой игры (несжатый размер 3,45 GB) в один архив, в аккурат на 4.37 GB. По отдельности эти данные с аналогичными настройками архиватора заняли Lost Planet Extreme Condition - 3,68 GB и Русификатор 1,75 GB и того 5,44 GB.
С помощью всеми нами обожаемой программы я хочу сделать сценарий с выбором установки версии игры из одного общего архива (как вы помните в нем две версии - инг и рус).
Т.е. сначала распаковывается архив в котором содержатся в дефолтном состоянии файлы англ версии и существует папочка "Rus" в которой собственно Русификация.
Если при установке будет вариант установки Русской версии, то должна запустится процедура которая переместит ресурсы из папочки "Rus" в папочку с такими же уже имеющимися английскими ресурсами, с их последующей заменой.
Важно, необходимо именно переместить из папочки, а не снова скопировать имеющиеся уже на этом логическом разделе файлы, т.к. это очень сэкономит время и итак порядком продолжительной инсталляции.
Но вот беда, я не знаю команд которыми можно реалезовать в инно или в отдельном батнике, процесс перемещения файлов. Господа, поделитесь советом, пожалуйста.

Автор: ShuraviTIC
Дата сообщения: 29.12.2007 21:12
создаеш бат на примере , на C в корне в папке RUS лежит "install.exe"

xcopy c:\rus\install.exe d:\rus\

все , он скопирован на d:\rus\
в корень

если заменить содержимое

replace c:\rus\*.* d:\rus\

удалить не нужную папку

rd /q/s c:\rus
Автор: Sampron
Дата сообщения: 30.12.2007 15:42
Kindly
Неплохая идея про игровой авторан, сейчас тоже этим занимаюсь.

2ALL
Подскажите как можно сделать по таймеру к примеру смену двух ВМР картинок на форме и неограниченый повтор этого действия?
Автор: Momchil
Дата сообщения: 31.12.2007 05:03
@Genri

I am one of the authors of the tool (proletsearch). I have coded it with a friend of mine.

I know that custom scripts are not supported for now. I will do a research about it and will try to make the tool better. What I have discovered is that InnoSetup engine uses one specific place to check any kind of custom scripts embedded into the main source - I am not talking about custom moduls like dll files. This means, that when I find the time, I will add support for such custom scripts.

Scripts like your example - > the password is stored in plain text and can be found in seconds time
with WinHex.

As for really complex scripts, sure the tool can not be made generic. It's so impossible, like the idea for example of making an universal keygen.

If you have any suggestions or questions, send me a pm here!

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Поиск в WinDjView


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.