Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Автоматическая установка приложений (http://forum.oszone.net/forumdisplay.php?f=61)
-   -   [архив] Inno Setup .:[все вопросы]:. (http://forum.oszone.net/showthread.php?t=60604)

Mchik 17-03-2005 21:42 402566

[архив] Inno Setup .:[все вопросы]:.
 
Лимит страниц.
Тема закрыта.
продолжаем тут:

Inno Setup. Обсуждение установщика

Скрипты Inno Setup. Помощь и советы



Полезные ресурсы:
Официальный сайт| Inno Setup 5.2.3 RU
Русская справка |Зеракало 1| Зеракало 2
ISTool 5.30 |Русификатор
Русификатор ISTool |Зеркало 1|Зеркало 2
Inno Setup Script Generator |Зеркало 1
Unpaker 2.1 от 21.04.2009 - распаковывает инсталляторы, созданные с помощью Inno Setup, начиная с версии 2.0.18 по 5.2.4.
InnoUnpaker 2.6b3 [от valeron87]- можнет просмотривать содержание CompiledCode.bin
Unpaker 0.23 - расширенная китайская версия 2008-08-08 ( модификация)
Unpacker 0.24 | Зеркало 1 | Зеркало 2 - Inno Setup Unpacker (innounp plus) - расширенная версия распаковщика инсталляторов Inno Setup начиная с версии 2.0.8 по 5.3.0 Beta. Поддерживаются версии Unicode. Русифицирована. Последний релиз: 0.24 [23.05.2009]
Набор Restools
Restools - расширенная версия Inno Setup от китайских разработчиков, добавляет вашему инсталлятору новые возможности по оформлению, а также более удобный редактор скриптов (требуется наличие установленного Preprocessor'а).
Последние версии разработок от Restools:
InnoCompiler090319_English - в него входят файлы: Compil32.exe и Templates.dat;
Inno_ISCmplr_Setup090302 - в него входят файлы, лучше из папки InnoSetup_FullVCL: setup.e32, ISCmplr.dls, ISCmplr.dll и SetupLdr.e32.
InnoCompiler090319_Russian - Русский перевод (80%) от tem000 - NEW !

QuickStart Pack - Inno Setup + Preprocessor (последняя версия ispack-5.2.4-dev)
"Всё в одном" от unikum111
читать дальше »

Цитата:

Цитата unikum111
В сборку входят следующие компоненты:
Inno Setup compiler 5.2.2 русская версия;
ISTool 5.2.1 русская версия;
Inno Script Generator английская версия;
Inno Setup Unpacker Explorer 1.0 аглийская версия;
Примечание: в Inno Setup Unpacker Explorer 1.0 заменён innounp.exe на тестовую версию 2.0, так что распаковывает инсталляторы вплоть до версии 5.2.2.
Есть возможность выбора компонентов.
Скачать: ifolder, RapidShare, iBox (Размер: 5.34 Mb).»




Полезные мелочи для Inno Setup:

- Converter v.0.1.2 - конвертор REG- файлов в формат скриптов Inno от Serega_ -новая версия
- Как убрать страницу приветствия (wpWelcome) в мастере установки приложения:
- Примеры скриптов на паскале
- Inno Setup Addon 0.07 For Total Commander
- Параметры командной строки инсталляторов InnoSetup:

Код:

/SP-
Отключает страницу "Эта программа установит... Вы хотите продолжить?" инсталятора.
Выполнится только если DisableStartupPrompt секции [Setup] равна yes.

/SILENT, /VERYSILENT
Установка в ускоренном или очень ускоренном режиме. При установке в ускоренном режиме
окно мастера и фоновое окно мастера не отображаются, отображается только окно прогресса.
При очень ускоренной установке окно прогресса тоже не отображается. Остальная установка
проходит как обычно - отображаются сообщения об ошибках в ходе установки, страница
приветствия (если ее отображение не отменено директивой DisableStartupPrompt или
параметром '/SP-' командной строки).

Если после установки необходима перезагрузка, команды '/NORESTART' не дано и установка
проходит в ускоренном режиме, появится сообщение "Перезагрузить компьютер?". Если режим
установки очень ускоренный, система перезагрузится не спрашивая.

/LOG
Указывает инсталятору создать log-файл в папке TEMP для подробного отчета о действиях
и событиях в секции [Run], предпринятых в ходе установки. Применяется при отслеживании
ошибок. Например, если вы подозреваете, что файл не был удален, хотя должен был,
log-файл сообщит, что файл былдействительно пропущен и почему.

log-файлу присваивается уникальное имя на базе текущей даты. (Существующие файлы не
перезаписываются и не дополняются).
Информация, содержащаяся в log-файле, техническая и поэтому не может быть понята
пользователем.

/LOG="filename"
Параметр похож на /LOG, но в отличие от него позволяет указать фиксированный
путь/имя файла для log-файла. Если файл с указанным именем уже существует, он будет
заменен. Если файл не может быть создан, установка прервется и выдаст сообщение
об ошибке.

/NOCANCEL
Не дает пользователю прервать установку, отключая кнопку Отменить и игнорируя клики на
кнопке Закрыть. Используется в комбинации с '/SILENT' или '/VERYSILENT'.

/NORESTART
Указывает инсталятору не перезагружать компьютер даже если это необходимо.

/RESTARTEXITCODE=exit code
Задает инсталятору код, который он должен возвратить, если необходима перезагрузка.
Используется с '/NORESTART'.
См. также Коды выхода инсталятора. (кому интерестно, могу выложить или же доступно в хелпе)

/LOADINF="filename"
Указывает инсталятору загрузить параметры установки из указанного файла после проверки
командной строки. Этот файл может быть подготовлен с помощью '/SAVEINF='command.
Не забудьте ставить кавычки при использовании имен, содержащих пробелы.

/SAVEINF="filename"
Указывает инсталятору сохранять параметры установки в указанный файл.
Не забудьте ставить кавычки при использовании имен, содержащих пробелы.

/LANG=language
Задает используемый язык. language задает имя языка, заданного в параметре секции
[Languages]. При использовании параметра /LANG появляется диалог Выбор языка установки.

/DIR="x:\dirname"
Меняет имя папки, заданное по умолчанию, на странице Выбор папки назначения.
Должен быть задан полный путь.

/GROUP="folder name"
Меняет имя папки на странице Выбор папки меню Пуск. Если директива
DisableProgramGroupPage секции [Setup] равна yes, этот параметр командной строки
игнорируется.

/NOICONS
Указывает инсталятору проверять, выбрана ли команда Не создавать значков на странице
Выбор папки меню Пуск.

/COMPONENTS="comma separated list of component names"
Меняет выбраные по умолчанию компоненты. В этом случае параметр командной строки
указывает инсталятору менять тип установки на Выборочный.

/PASSWORD=password Задает пароль. Если не указана директива Password секции [Setup],
этот параметр игнорируется. Если введен неправильный пароль, параметр
также игнорируется.


Vadikan 18-03-2005 01:27 402567

Mchik
Спасибо, я сошлюсь на эту тему на странице Инсталляторы.

Mchik 18-03-2005 20:09 402568

Прочитал внимательнее этот список. Оказывается есть и еще полезные параметры. Привожу пример.
Я ставлю альтернативные кодеки Real & QuickTime. Они как раз запакованы с помощью Inno Setup. Но если их просто ставить в автоматическом тихом режиме, каждый из них припишет на винт Media Player Classic. Плейер, безусловно, отличный, но в количестве трех штук он мне на винте не нужен. :)
Решение состоит в использовании ключей /SAVEINF и /LOADINF.

1. Устанавливаем кодек с созданием файла ответов:
realalt.exe /saveinf="real.txt"
Отвечаем на все вопросы так, как нравится. Я, например, еще убрал создание группы в меню ПУСК.
2. ...и теперь его тихая установка выглядит как
START /WAIT realalt.exe /loadinf="real.txt" /silent

Petya V4sechkin 19-03-2005 09:27 402569

Mchik
Цитата:

Я ставлю альтернативные кодеки Real & QuickTime. Они как раз запакованы с помощью Inno Setup. Но если их просто ставить в автоматическом тихом режиме, каждый из них припишет на винт Media Player Classic. Плейер, безусловно, отличный, но в количестве трех штук он мне на винте не нужен.
Кстати, Real Alt и QuickTime Alt ставят MPC в одну и ту же директорию, так что здесь проблемы нет. (А если не поставить MPC с одним из этих кодеков, то ассоциации с файловыми расширениями могут не прописаться.)
А вот K-Lite ставит MPC в другую директорию.
В принципе, можно использовать K-Lite Mega Codec Pack (включает всё, в том числе Real Alt и QuickTime Alt), но он весит довольно много.
Сорри за оффтопик.

EgOrus 20-03-2005 20:02 402571

Mchik
кстати ключи не все, не хватает этих:
Цитата:

/LOG
/LOG="filename"
/PASSWORD=password

Solitude 09-05-2005 03:21 402572

А не подскажите как можно подредактировать инсталяционный файлик Inno Setup ??

Dust112 09-05-2005 08:04 402573

Существует плагин к Total Commander и Far для рапаковки инсталлятора на файлы и скрипт, поищи на сайте _http://innounp.sourceforge.net/

Solitude 09-05-2005 17:08 402574

Dust112
Видел я эти программи!! Они не распаковывают старые архивы!!!

Dirk Diggler 03-02-2006 11:59 402575

Блин, что-то у Inno Setup с путями! Пишу
Код:

XnView-win-full.exe /saveinf="save.inf"
, и файл ложится в %windir%\, пишу
Код:

XnView-win-full.exe /saveinf=".\save.inf"
, и файл ложится в %ProgramFiles%, кидаю его в один каталог с XnView-win-full.exe, запускаю
Код:

XnView-win-full.exe /loadinf=save.inf /silent    или
XnView-win-full.exe /loadinf=.\save.inf /silent    или
XnView-win-full.exe /loadinf="save.inf" /silent    или
XnView-win-full.exe /loadinf=".\save.inf" /silent

не видит файл в упор, пока полное имя с каталогом не укажешь.
Это Inno 4.0.8. А Inno 5.08 файл пишет в текущий каталог, а читать все равно не читает. Как побороть скотину?

Dirk Diggler 03-02-2006 12:09 402576

не, вру. Даже полный путь не спасает:
Код:

E:\burn\soft\xnview>XnView-win-full.exe /LOADINF="E:\burn\soft\xnview\save.inf"
/silent

И все равно ставится целиком, хотя у меня в save.inf всего пара компонентов указана

boss911 03-02-2006 18:08 402577

Dirk Diggler

Я делаю проще, вытаскиваю скрипт от интсталятора Inno Setup и редактирую его как мне надо (добовляю, удаляю компонеты, ярлыки, патчу файлы и т.д), а потом обратно компилирую дистрибутив! Если есть у тебя такая возможность, то это лучший вариант!!

Dirk Diggler 04-02-2006 02:06 402578

расскажи кратко или дай ссылку

boss911 04-02-2006 23:55 402615

Сам компилятор - Inno Setup + русификатор

Дополнительная программа к Inno Setup, для удобного редактирования скрипта, если надо - ISTool + русификатор

Утилита для распаковки дисрибутивов и для вытаскивания скрипта из инсталятора Inno Setup, работающая из командной строки или как плагин к FAR'у или к TC - innounp.exe
Так же, можно добавить следующие строки в реестр и в контекстном меню проводника появится меню (кликая правой кнопкой мыши по ексешнику) "innounp Extract":
Код:

Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\exefile\shell\innounp Extract\command]
@="cmd.exe /k innounp.exe -x \"%1\""

Утилиту, положить в %WINDIR%, потом распаковывается дистр., а рядом сним скрипт со всеми необходимыми путями по распаковке файлов, реестр, регистация файлов ну и т.д!

Dirk Diggler 05-02-2006 13:23 403423

скачал, попробовал. Из 4 дистров распаковался 1 - остальные "uncompatible version", да и этот распакованный какой-то странный - я скрипта для Inno Setup не нашел...

boss911 06-02-2006 00:21 403593

Dirk Diggler

Цитата:

Из 4 дистров распаковался 1 - остальные "uncompatible version"
Хм! Бывает, иногда попадаетса и не Inno Setup, а что-то похожое на него или дистр. упакован старой версией копилятора! Иногда сам путаю с NSIS!
Цитата:

да и этот распакованный какой-то странный - я скрипта для Inno Setup не нашел...
Если ты использовал для распаковки дистра через импортирования *.reg файла, что я дал выше, то все рапакуетса в ту же папку, где сам лежит дистр., а рядом ты увидиш скрипт для компиляции ("install_script.iss").

Dirk Diggler 06-02-2006 12:19 403700

Цитата:

иногда попадаетса и не Inno Setup,
Это точно Innо, "about..." говорит Inno версии соот-но такой-то.

Цитата:

через импортирования *.reg файла, что я дал выше, то все рапакуетса в ту же папку, где сам лежит дистр., а рядом ты увидиш скрипт для компиляции
неа.... распаковывал xnview, получил папку типа {sab}, и никакого скрипта.

boss911 06-02-2006 17:40 403799

Dirk Diggler

Цитата:

неа.... распаковывал xnview, получил папку типа {sab}, и никакого скрипта.
Про это я незнаю нечего!! Я тебе дал утилиту и как ей пользоватса тоже, распакуй утилитой и все у тебя получитса!!
Xnview, это же помойму просмотрощик и редактор графических файлов!!?

Dirk Diggler 06-02-2006 20:33 403859

точно. я ЕГО распаковал. Указанной тобой утилитой распаковал дистр с xnview.А щаз еще один распаковал - все равно, распаковывается в папку {app}, а скрипта нет.

boss911 06-02-2006 22:30 403886

Dirk Diggler

Что нет рядом с папкой "{app}" скрипта "install_script.iss"?
Ай блин я все понял! Эта утилита по той ссылке, что я тебе дал, оказываетса старая версия и если дистр. был упакован версией от 5.х и выше, то оно его не распакует! Ссылку на утилиту поправил!!

Aspirine 13-02-2006 11:57 406042

boss911
Слушай, объясни как правильно запоковывать обратно в Inno Setup.
А то я пробую, всё время ошибки выдаёт...
Версия Inno Setup 5.1.6

boss911 13-02-2006 17:34 406155

Aspirine
Цитата:

Слушай, объясни как правильно запоковывать обратно в Inno Setup.
Если получил скрипт, спомощью innounp.exe, то проблем не должно быть с компиляцией!!
Цитата:

А то я пробую, всё время ошибки выдаёт...
Версия Inno Setup 5.1.6
Какие ошибки, опиши поподробней!? Лучше русифицируй компилятор и пользуйся дополнительной утилитой ISTool (она идет с русским фейсом), так я думаю тебе будет понятней, что там у тебя выдает за ошибки!! Все ссылки выше!!

Aspirine 13-02-2006 18:21 406163

boss911
Благодарю, всё прошло на ура...
А ошибки, это я по неопытности всякие мелочи не замечал...
Русский фейс рулит!!!

superteacher 27-02-2006 07:50 411400

не работает ваш компилятор. все доп проги установил.

superteacher 27-02-2006 07:53 411401

файл russian.exe для Acdsee 70102rus. Не могу установить автоматически. Запрашивает пункт назначения. Russian.exe распаковал. Но не могу запаковать.

boss911 27-02-2006 20:27 411697

superteacher
Цитата:

не работает ваш компилятор. все доп проги установил.
Что именно у Вас не работает, отображайте плиз полную инофрмацию, если хотите, чтоб Вас правильно понимали!!
Цитата:

Russian.exe распаковал. Но не могу запаковать.
Чем он запакован и чем Вы его распаковываете, а потом чем пакуете!?

PENDEJO 02-03-2006 22:03 413081

Подскажите, плиз!!!
 
Не программист. Есть некая прога - в тупую копируются файлы на винт и всё. Устанавливается на двух одинаковых объектах. Разница в том, что файлы из папки Dir1 надо копировать на первый объект, а файлы из папки Dir2 надо копировать на второй объект. Все файлы лежат в общем инсталляторе. Как сделать так, чтобы галочкой выбрать наименование объекта (Объект 1 или Объект 2), и файлы скопировались в нужные директории. Спасибо

boss911 03-03-2006 23:20 413571

PENDEJO

Это можно сделать через компоненты, в скрипте надо прописать что-то подобное:
Код:

[Files]
Source: Dir1\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Dir1
Source: Dir2\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Dir2
 
[Components]
Name: Dir1; Description: название 1
Name: Dir2; Description: название 2


PENDEJO 06-03-2006 08:27 414269

Boss911
Спасибо. Сейчас попробую

melato 31-03-2006 14:19 423592

2Vadikan

Почему-то не работает ссылка из статьи "Типы инсталляторов" о ключах Inno Setup...

Vadikan 31-03-2006 21:09 423727

melato
Цитата:

Почему-то не работает ссылка из статьи "Типы инсталляторов" о ключах Inno Setup...
Вы в правильной теме :)

melato 31-03-2006 21:45 423736


Цитата:

Цитата Vadikan
Вы в правильной теме

Сам этим заинтересовался (ключами), перешёл по ссылке, а там - "не указана тема". Как юзер, ничего не искал и написал туда, куда хоть как-нибудь подходит :)

boss911 10-05-2006 05:05 436122

Всем привет!! Столкнулся с проблемами!! Значетса имеютса такие значение в моем скрипте (*.iss):

Код:

[Run]
Filename: File.cmd; WorkingDir {app}; Flags: waituntilidle runhidden

1. как добитса того, чтоб инсталятор дожидался остановки батника, флаг waituntilidle непомогает, но почему-то при дэинсталяции
Код:

[UninstallRun]
Filename: File.cmd; WorkingDir: {app}; Flags: waituntilidle runhidden

инсталятор дожидаетса остановки батника, что за глюки!??

2. пожалуйста черкните, что надо добавить в скрипте, чтоб это значение реестра
Код:

[Registry]
Root: HKLM; Subkey: SYSTEM\CurrentControlSet\Control\Session Manager; ValueType: multisz; ValueName: PendingFileRenameOperations; ValueData: \??\{localappdata}\File.dll{break}{break}

восстанавливалось, создавалось снова при дэинсталяции, очень сильно надо!??

3. и почему Inno Setup нехочет компилировать скрипт, если указаны некоторые системные файлы, которые распаковывуютса в системную директорию, например:
Код:

[Files]
Source: C:\MyFolder\shell32.dll; DestDir: {sys}

короче как это обойти!??

Сразу хочу сказать, что в коде паскаль не шарю обсолютно нечего, так что прошу, если сможете, помогите конкретными записями (кодами), что надо добaвить в мой скрипт!! Спасибо!!!

boss911 18-06-2006 16:46 452192

Решил выложить все ключи командной строки из русского хелпа, думаю может кому-то будет полезно:
Код:

/SP-
Отключает страницу "Эта программа установит... Вы хотите продолжить?" инсталятора.
Выполнится только если DisableStartupPrompt секции [Setup] равна yes.

/SILENT, /VERYSILENT
Установка в ускоренном или очень ускоренном режиме. При установке в ускоренном режиме
окно мастера и фоновое окно мастера не отображаются, отображается только окно прогресса.
При очень ускоренной установке окно прогресса тоже не отображается. Остальная установка
проходит как обычно - отображаются сообщения об ошибках в ходе установки, страница
приветствия (если ее отображение не отменено директивой DisableStartupPrompt или
параметром '/SP-' командной строки).

Если после установки необходима перезагрузка, команды '/NORESTART' не дано и установка
проходит в ускоренном режиме, появится сообщение "Перезагрузить компьютер?". Если режим
установки очень ускоренный, система перезагрузится не спрашивая.

/LOG
Указывает инсталятору создать log-файл в папке TEMP для подробного отчета о действиях
и событиях в секции [Run], предпринятых в ходе установки. Применяется при отслеживании
ошибок. Например, если вы подозреваете, что файл не был удален, хотя должен был,
log-файл сообщит, что файл былдействительно пропущен и почему.

log-файлу присваивается уникальное имя на базе текущей даты. (Существующие файлы не
перезаписываются и не дополняются).
Информация, содержащаяся в log-файле, техническая и поэтому не может быть понята
пользователем.

/LOG="filename"
Параметр похож на /LOG, но в отличие от него позволяет указать фиксированный
путь/имя файла для log-файла. Если файл с указанным именем уже существует, он будет
заменен. Если файл не может быть создан, установка прервется и выдаст сообщение
об ошибке.

/NOCANCEL
Не дает пользователю прервать установку, отключая кнопку Отменить и игнорируя клики на
кнопке Закрыть. Используется в комбинации с '/SILENT' или '/VERYSILENT'.

/NORESTART
Указывает инсталятору не перезагружать компьютер даже если это необходимо.

/RESTARTEXITCODE=exit code
Задает инсталятору код, который он должен возвратить, если необходима перезагрузка.
Используется с '/NORESTART'.
См. также Коды выхода инсталятора. (кому интерестно, могу выложить или же доступно в хелпе)

/LOADINF="filename"
Указывает инсталятору загрузить параметры установки из указанного файла после проверки
командной строки. Этот файл может быть подготовлен с помощью '/SAVEINF='command.
Не забудьте ставить кавычки при использовании имен, содержащих пробелы.

/SAVEINF="filename"
Указывает инсталятору сохранять параметры установки в указанный файл.
Не забудьте ставить кавычки при использовании имен, содержащих пробелы.

/LANG=language
Задает используемый язык. language задает имя языка, заданного в параметре секции
[Languages]. При использовании параметра /LANG появляется диалог Выбор языка установки.

/DIR="x:\dirname"
Меняет имя папки, заданное по умолчанию, на странице Выбор папки назначения.
Должен быть задан полный путь.

/GROUP="folder name"
Меняет имя папки на странице Выбор папки меню Пуск. Если директива
DisableProgramGroupPage секции [Setup] равна yes, этот параметр командной строки
игнорируется.

/NOICONS
Указывает инсталятору проверять, выбрана ли команда Не создавать значков на странице
Выбор папки меню Пуск.

/COMPONENTS="comma separated list of component names"
Меняет выбраные по умолчанию компоненты. В этом случае параметр командной строки
указывает инсталятору менять тип установки на Выборочный.

/PASSWORD=password Задает пароль. Если не указана директива Password секции [Setup],
этот параметр игнорируется. Если введен неправильный пароль, параметр
также игнорируется.


pr-lp 17-07-2006 13:36 462114

НЕподскажите ли.. если Инно(4я версия) прописано -что он путь для инсталяции берет из реестра(тоесть когда дале-дале..нет вапроса с указанием вапроса о пути)..с какого ключа он считует путь или как можно принудительно включить чтоб он его запросил?

boss911 17-07-2006 18:38 462233

pr-lp
Цитата:

если Инно(4я версия) прописано -что он путь для инсталяции берет из реестра(тоесть когда дале-дале..нет вапроса с указанием вапроса о пути)..с какого ключа он считует путь
Нечего путного сказать немогу, так как не знаком с 4-ой версией и почему невыдает запроса пути установки, тут впервые с таким сталкиваюсь, наверно все же из-за 4-ой версии, попробуйте что-то поискать тут, но не уверен:
Код:

HKU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist
Цитата:

... или как можно принудительно включить чтоб он его запросил?
Попробуйте запустите инсталятор с ключем /DIR=
Код:

Setup.exe /DIR="x:\dirname"
опять же неуверен в 4-ой вересии инсталятора, как он отриогирует на этот ключ!!

pr-lp 17-07-2006 21:00 462272

ну не запрашивает она потому что ..это как бы идет обновление фаила ..Инно в каком то ключе(интересно в каком обычно при таких действиях) считывает где программа стоит и прописываает путь инстоляции..
Не спрашивать путь не хочит если прописываю ДИр..идет Информация,вод серийника,ЗАпрос на ярлык..а вапроса о пути инстоляции нет((
Вот как выглядит окно информаци:
Информация о пользователе:
CARTER
SunBlock

Каталог установки(нету):


Папка в меню 'Пуск':
1C\Activision\D3

Дополнительные задачи:
Создать иконку на рабочем столе

boss911 17-07-2006 21:13 462280

pr-lp
Цитата:

Инно в каком то ключе(интересно в каком обычно при таких действиях) считывает где программа стоит и прописываает путь инстоляции
Немогу я найти где этот ключ, может из-за того, что 4-я версия, а может оно хранитса не в реестре, откуда такие данные!?
Код:

Setup.exe /DIR="x:\dirname"
- не спасает ситуацию!!?

ANDYru 18-07-2006 16:52 462532

а как нить можно раздел скрипта [Registry]
конвертнуть в нормальный файл реестра .reg

тобиш преоразовать
Root: HKU; Subkey: ".DEFAULT\Software\PCTools\Spyware Doctor\Settings"; ValueName: "StartupAction"; ValueType: Dword; ValueData: "$0"; Flags: createvalueifdoesntexist uninsdeletekey

в нормальное ?

boss911 18-07-2006 17:12 462544

ANDYru
Цитата:

тобиш преоразовать ... в нормальное ?
А чего же нельзя, тут можно воссоздать все самому из скрипта или же, после инсталяции экспортировать нужные ветки!!
Например из твоего приведенного, получитса это:
Код:

[HKEY_USERS\.DEFAULT\Software\PCTools\Spyware Doctor\Settings]
"StartupAction"=dword:00000000


ANDYru 18-07-2006 18:44 462589

boss911
пасиб . уже и сам догадался после инталла рорытся в реестре и собрать всё это в один рег файл ..
результат уже на руборде в соот ветке варезника :)

pr-lp 20-07-2006 18:16 463153

[IMG]D:\13.JPG[/IMG]
ну если так как на скрине..то все по прежнему((

А возможно 4ю версию распоковать..и к примеру если все запаковано не втолько в ехе но и в bin

boss911 20-07-2006 22:06 463233

pr-lp
Цитата:

А возможно 4ю версию распоковать..и к примеру если все запаковано не втолько в ехе но и в bin
Думаю можно, но опять же все упираетса в 4-ю версию инсталятора! Попробуй распакуй, как это сделать, найдеш в этой же теме в моем сообщении!!

pr-lp 20-07-2006 23:03 463250

сделал по другому..программой которая следит за реестром отследил куда Инно обращался.. спасибо..

boss911 21-07-2006 00:41 463275

pr-lp
Цитата:

... отследил куда Инно обращался.
Так поделись с другими плиз, может кому-то пригодитса!! :)

pr-lp 21-07-2006 20:18 463591

Regmon -имя её..
www.sysinternals.com

boss911 21-07-2006 23:31 463648

pr-lp
Цитата:

Regmon -имя её..
Да не название софта, которым ты отслеживал реестр, а саму ветку реестра, куда обращался Inno!!

pr-lp 22-07-2006 15:05 463827

аа..HKEY_LOCAL_MACHINE\SOFTWARE

YuriPet 22-07-2006 15:35 463837

Не подскажет кто, где взять для ISTool v5.1.6 файл istool-ru.lng ?

boss911 22-07-2006 17:55 463882

YuriPet
Цитата:

где взять для ISTool v5.1.6 файл istool-ru.lng
Есть для 5.1.5 , отлично подходит и все на русском!!

YuriPet 22-07-2006 18:09 463887

boss911
Огромное спасибо! :beer:

YuriPet 22-07-2006 19:07 463896

"Ничё не понимаю!" :shocked:
Почему у меня внутри создаваемых инсталляций в каталог embedded почти все файлы "упаковываются" в двойном экземпляре (например: вместо исходного License.txt получается License,1.txt и License,2.txt)?
Соответственно "правится" и install_script.iss.
В чем причина? Подскажите, кто знает, пожалуйста! :shuffle:

YuriPet 24-07-2006 13:13 464310

"И тишина-а-а..." :lazy:
Неужели никто с подобным явлением не сталкивался? ;)

boss911 24-07-2006 16:27 464376

YuriPet
Цитата:

еужели никто с подобным явлением не сталкивался?
Сколько использую Inno , но такой проблемы не встречал, странно!! Я правда License.txt не использую! В данном каталоге, что и грфичиские файлы тоже в двойном экземпляре идут и откуда такие данные, что они дублируютса!? Узнаеш при распаковки через innounp.exe , в кактологе {app} все нормально??

YuriPet 24-07-2006 17:30 464405

Ну хоть кто-то проснулся - спасибо! :beer:

Да, действительно - при распаковке командой innounp.exe -x test.exe или при просмотре через 7-Zip File Manager в кактологе {app} все нормально, а содержимое каталога embedded выглядит примерно так:
Код:

embedded\uninstall,2.exe
embedded\License.txt
embedded\InfoBefore.txt
embedded\CompiledCode.bin
embedded\WizardImage.bmp
embedded\WizardSmallImage.bmp

Но вот в при просмотре с использованием Total Commander и MultiArc (который тоже использует innounp.exe), почти все файлы (в т.ч. и графические) отображаются "в двойном экземпляре". :o
Код:

embedded\uninstall,2.exe
embedded\License,1.txt
embedded\License,2.txt
embedded\InfoBefore,1.txt
embedded\InfoBefore,2.txt
embedded\CompiledCode.bin
embedded\WizardImage,1.bmp
embedded\WizardImage,2.bmp
embedded\WizardSmallImage,1.bmp
embedded\WizardSmallImage,2.bmp

Смущает то, что если я просматриваю с использованием Total Commander "фирменные" инсталляционные файлы - там такого "дубляжа" нет! :dont-know

boss911 24-07-2006 21:40 464470

YuriPet

Я бы на твоем месте болше доверял бы innounp.exe -x test.exe
MultiArc я использую в FARе и там все нормально!! Я тут где-то оставлял домашнюю ссылку на innounp.exe , так вот к нему уже давненько имеетса GUI-интерфейс, скачай и посмотри через него!!

P.S. Я очень удевлен, что 7-Zip File Manager умеет просматривать инсталяхи Inno , а скрипт он умеет вытаскивать - наверно удобно, правда я не юзаю этот архиватор!!

YuriPet 25-07-2006 00:29 464516

boss911

Совсем у меня голова кругом пошла... :insane:

Во-первых - по поводу 7-Zip File Manager - это я поторопился (перепутал). :) Не умеет он работать с Inno-инсталляторами.
Во-вторых - просмотр с помощью ISUnp.exe (GUI-интерфейс к innounp.exe) тоже показал, что файлы в каталоге embedded "двоятся".
Так что - извини за то, что дал неверную информацию в предыдущем посте :shuffle:

И наконец:

1. Распаковываю с помощью ISUnp.exe какой-нибудь инсталлятор, например, тот-же IsUnp10setup.exe (размер - 691 092 байт.).

2. В полученном install_script.iss среди прочего вижу строки
Код:

[Files]
Source: "embedded\uninstall.exe"; DestDir: "embedded";
Source: "embedded\License.txt"; DestDir: "embedded";
Source: "embedded\WizardImage.bmp"; DestDir: "embedded";
Source: "embedded\WizardSmallImage.bmp"; DestDir: "embedded";

3. В полученную папку embedded
Код:

embedded\License.txt
embedded\WizardImage.bmp
embedded\WizardSmallImage.bmp

добавляю файл uninstall.exe (его нахожу в папке IsUnp с ранее установленной программой под именем unins000.exe, и просто переименовываю его перед добавлением).

4. Компилирую обратно с использованием Inno Setup Compiler 5.1.6 - получаю в папке Output файл setup.exe размером 930 744 байт.

5. Распаковываю его тем-же ISUnp.exe - в папке embedded файлы:
Код:

embedded\uninstall,2.exe
embedded\License,1.txt
embedded\License,2.txt
embedded\WizardImage,1.bmp
embedded\WizardImage,2.bmp
embedded\WizardSmallImage,1.bmp
embedded\WizardSmallImage,2.bmp

и в "новом" install_script.iss сами "прописались" строки
Код:

[Files]
Source: "embedded\uninstall,1.exe"; DestDir: "embedded"; DestName: "uninstall.exe";
Source: "embedded\uninstall,2.exe"; DestDir: "embedded"; DestName: "uninstall.exe";
Source: "embedded\License,1.txt"; DestDir: "embedded"; DestName: "License.txt";
Source: "embedded\WizardImage,1.bmp"; DestDir: "embedded"; DestName: "WizardImage.bmp";
Source: "embedded\WizardSmallImage,1.bmp"; DestDir: "embedded"; DestName: "WizardSmallImage.bmp";
Source: "embedded\License,2.txt"; DestDir: "embedded"; DestName: "License.txt";
Source: "embedded\WizardImage,2.bmp"; DestDir: "embedded"; DestName: "WizardImage.bmp";
Source: "embedded\WizardSmallImage,2.bmp"; DestDir: "embedded"; DestName: "WizardSmallImage.bmp";

Все бы "Черт с ним!" - неприятен факт возрастания размера! :smirk:

Возникает вопрос: "Что я делаю не так?"

boss911 25-07-2006 03:36 464530

YuriPet
Цитата:

3. В полученную папку embedded ... добавляю файл uninstall.exe
Не могу понять почему ты добавляеш свои файлы именно в embedded , если надо в {app} , да и инсталятор сам умеет создавать дэинсталятор, если выбранна данная опция!!
Кажись я догодался в чем дело, но пока это всего лишь догадки, а пока просто дам совет - забей на эти строки в скрипте, да и вообще, что указывает на embedded:
Код:

[Files]
Source: "embedded\License.txt"; DestDir: "embedded";
Source: "embedded\WizardImage.bmp"; DestDir: "embedded";
Source: "embedded\WizardSmallImage.bmp"; DestDir: "embedded";

просто удали их, а если ты хочеш, чтоб именно эти рессурсы (графические файлы по умолчанию скомпилируютса, так как они уже лежат в каталоге, куда установлен компилятор) отоброжались в твоем инсталяторе, то воспользуйся данной опцией:
Код:

[Setup]
LicenseFile=ПУТЬ\License.txt
WizardImageFile=ПУТЬ\WizModernImage.bmp
WizardSmallImageFile=ПУТЬ\WizModernSmallImage.bmp

И еще один маленький совет, чтоб небыло заморочек и вечного вопроса
Цитата:

"Что я делаю не так?"
- создавай свой скрипт с нуля, на основе вытащенного с какого-нибудь дистрибутива, то есть подглядывая, что же делает скрипт!! :)

YuriPet 25-07-2006 04:27 464533

boss911
Огромное спасибо - разобрался! :beer:

starwork 06-10-2006 10:25 494162

Всем привет !!!
У меня проблема такая......
При распаковке (установке), не создаются каталоги, все файлы ложаться в корневую папку.
Где я недоглядел и чего ещё не знаю ???
Спасибо !

EgOrus 06-10-2006 11:24 494193

starwork
приведи секцию [Files] своего скрипта, скорей всего не указал флаг Flags: recursesubdirs

starwork 06-10-2006 12:00 494227

2EgOrus
Source: "D:\Games\Titan Quest\TextureCompiler.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Games\Titan Quest\Titan Quest.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Games\Titan Quest\AdobeAcrobat\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\Games\Titan Quest\Audio\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

EgOrus 06-10-2006 12:12 494239

starwork
должно быть вот так
Код:

Source: "D:\Games\Titan Quest\TextureCompiler.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Games\Titan Quest\Titan Quest.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Games\Titan Quest\AdobeAcrobat\*"; DestDir: "{app}\AdobeAcrobat"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\Games\Titan Quest\Audio\*"; DestDir: "{app}\Audio"; Flags: ignoreversion recursesubdirs createallsubdirs

а еще лучше вот так
Код:

Source: "D:\Games\Titan Quest\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

starwork 06-10-2006 12:15 494242

Ага, последний скрипт это полностью на всю папку с игрой?
т.е. всего одна строка?

EgOrus 06-10-2006 12:20 494247

starwork
да, если есть ненужные файлы или папки можешь выкинуть их через флаг исключения
например
Код:

Source: "D:\Games\Titan Quest\*"; Excludes: example1.file, example2.file; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

starwork 06-10-2006 12:23 494249

Спасибо !!!
Ща попробую в двух вариантах, потом отпишусь )))

starwork 06-10-2006 12:35 494260

2EgOrus

А подскажи ещё.....
Что нужно ещё добавить, что бы после установки в диалоговом окне было меню "установить DirectX" ?

EgOrus 06-10-2006 12:42 494267

Код:

[Files]
Source: "Путь до directx\directx.exe"; DestDir: "{tmp}"; Flags: ignoreversion

[Run]
Filename: "{tmp}\directx.exe"; Description: "Установить DirectX?"; Flags: postinstall nowait skipifsilent checked


fox_cub 26-10-2006 19:21 503127

А у меня вт такая фича:при установке через модифицированный скрипт в Программах вместо группы с названием программы, Apollo например, появляется группа (Default). В чём может быть проблема?

EgOrus 26-10-2006 22:43 503190

fox_cub
скрипт покажи

Dust112 27-10-2006 14:45 503413

fox_cub
В Program Group запиши название своей группы в Default group name: и будет тебе счастье.

fox_cub 27-10-2006 15:34 503433

EgOrus
Код:

[Setup]
AppName=Apollo
AppVerName=Apollo 37zy
DefaultDirName={pf}\Apollo
OutputBaseFilename=Apollo37zy
Compression=lzma
LicenseFile=embedded\License.txt
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp

[Files]
Source: "{app}\Apollo.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\License.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\HumanRights.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\RevisionHistory.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\ApolloCommands.h"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\Apollo.exe.manifest"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\Apollo.eq"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\bass.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\Plug-ins\MPEG_Apollo.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\Plug-ins\WAV_Apollo.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\Plug-ins\DSP_Apollo.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\Plug-ins\VIS_Apollo.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\Plug-ins\ApOGG.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\Plug-ins\ApWMA.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\Plug-ins\BASS_Apollo.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\Plug-ins\CDReader.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\Plug-ins\inModplug.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\Plug-ins\TTA_Apollo.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\Plug-ins\WavPack_Apollo.dll"; DestDir: "{app}\Plug-ins"; Flags: ignoreversion
Source: "{app}\docs\AAP.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\content.css"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\DocIndex.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\DocTitle.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\EditingPlaylist.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\EqualizerDialog.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\index.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\Introduction.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\KeyboardShortcuts.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\MainWindow.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\MiniWindow.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\OptionsDialog.Appearance.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\OptionsDialog.General.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\OptionsDialog.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\OptionsDialog.Internet.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\OptionsDialog.Output.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\OptionsDialog.Player.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\OptionsDialog.Playlist.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\OptionsDialog.Strings.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\Plug-insDialog.DSP.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\Plug-insDialog.GeneralPurpose.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\Plug-insDialog.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\Plug-insDialog.Input.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\Plug-insDialog.Visualization.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\RandomEntryPropertiesDialog.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\TrackPropertiesDialog.html"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{app}\docs\Welcome.html"; DestDir: "{app}\docs"; Flags: ignoreversion

[Registry]
Root: HKCU; Subkey: "Software\Capacala\Apollo"; Flags: uninsdeletekey

[Run]
Filename: "{app}\Apollo.exe"; Parameters: "/install";

[UninstallRun]
Filename: "{app}\Apollo.exe"; Parameters: "/uninstall";

[Icons]
Name: "{group}\Apollo"; Filename: "{app}\Apollo.exe";
Name: "{group}\Apollo documentation"; Filename: "{app}\docs\index.html";
Name: "{group}\Uninstall Apollo"; Filename: "{uninstallexe}";
Name: "{userdesktop}\Apollo"; Filename: "{app}\Apollo.exe"; Tasks: "desktopicon";
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Apollo"; Filename: "{app}\Apollo.exe"; Tasks: "quicklaunchicon";

[Tasks]
Name: "desktopicon"; Description: "Create a &Desktop icon"; GroupDescription: "Additional icons:";
Name: "quicklaunchicon"; Description: "Create a &Quick Launch icon"; GroupDescription: "Additional icons:";


EgOrus 27-10-2006 16:49 503465

fox_cub
у тебя используется переменная {group}, ты её неопределил добавь в [Setup]
DefaultGroupName=Apollo

EgOrus 12-11-2006 21:30 510619

2ALL
Может кто-то желает помочь в написании статьи по InnoSetup ? прошу сюда

Black Babay 16-11-2006 15:02 512688

EgOrus
Прошу извинить за дубль, но здесь актуальнее.
Думаю, что имеет смысл создать тему по конструкторам InnoSetup. Было бы очень полезно иметь возможность централизовано собрать скрипты и сборки.

EgOrus 16-11-2006 21:55 512924

Black Babay
спасибо за учатие
поясни свою мысль, что то я не совсем представляю как централизовано собирать скрипты и сборки

Помощи прошу потомучто очень занят, содержание как бы намечено, а вот со временем выходит полный облом, статья в дальнейшем скорей всего пойдет в офлайн учебник unnatend.oszone.net, если конечно Vadikan не забракует :-)
А на будущее запланирована еще и статья по NSIS.

Black Babay 16-11-2006 22:10 512936

Ну, собственно говоря как адоны. Выкладывается "конструктор", который включает в себя исходные папки (или папки с файлами) для компиляции, скрипт и описание. Думаю что обмен скриптами и мнениями будет весьма полезен.

EgOrus 16-11-2006 23:06 512957

не уверен что это намного лучше выложенного просто скрипта, в скрипте можно просто делать описание где какие папки должны лежать, в принципе Source: и DestDir: это самые основы при работе с Inno скриптами, думаю проблемм с расположением не возникнет, сами же "сырцы" программ качать бессмысленно, т.к. они имеют свойства обновляться...
Продложая твою мысль может имеет смысл выкладыть вместе со скриптом голую структуру папкок без файлов, которую уже каждый будет наполнять для себя сам.

Black Babay 16-11-2006 23:24 512967

Цитата:

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

molvi 30-11-2006 17:31 519016

Есть урезанный Nero 7570 (размер 15,4 Мб), упакованный Inno Setup. Опции /Verysilent /SP- делают установку тихой. Подскажите пожалуста, как теперь подставить серийник и снять галочки с азиатских языков.

boss911 30-11-2006 20:10 519077

molvi

За галочки отвечают ключи /COMPONENTS= и /TASKS , но надо знать внутренние имя этих значений, которые надо подставить, а серийник, наверно через reg файл только, тут надо смотреть сам инсталятор!!

Предлагаю подправить шапку, вот отсюда можно взять, более лучшие описанные, команды для тихой установки!!

pr-lp 04-12-2006 16:53 520750

Может кто подскажет,накопилось ряд вапросов (какие параметры задавать в скрипте):
1).Что нужно указать чтоб к примеру при сжатие инно пропускал некоторые фаилы,папки и не сжиал их,а оставлял в оригинальном размере
2).Где надо указать и какой параметр чтоб фаилы запакованые извлекались не в паку каторый инно сам себе создаст а в уже созданную папку ,вот пример :
[Setup]
AppName=Splinter Cell Double Agent
AppVerName=Splinter Cell Double Agent
AppPublisher=Carter_2006,Inc.
DefaultDirName={pf}\Splinter Cell Double Agent
DefaultGroupName=Splinter Cell Double Agent
OutputBaseFilename=Setup
UninstallStyle=classic
Compression=lzma/ultra
DiskSpanning= yes
DiskSliceSize=733989400
SlicesPerDisk=3
VersionInfoCompany=carter
VersionInfoDescription=Splinter Cell Double Agent
VersionInfoVersion=2.0

[Tasks]
; NOTE: The following entry contains English phrases ("Create a desktop icon" and "Additional icons"). You are free to translate them into another language if required.
Name: "desktopicon"; Description: "Создание иконки на Рабочем Столе"; GroupDescription: "Создание иконки:"; Flags: checkedonce

[Files]
Source: "F:\GAMES\Splinter Cell Double Agent\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files


в данном варианте игра себе создает папку еще и туда скидует фаилы,а мне необходимо чтоб она в корень папки ранее созданной все скидывала
3).К примеру , я сжал группу файлов 7зип ,как сделать чтоб инно распокавал чать файлов и т д ..потом запустил распаковку из этого 7зип ..распаова из 7 зип ..инно продолжил истоляцию дальше ...

4) . если ехе находится не сразу в
карне, а в папке \System ..у меня в
свойствах
ярлыка пути получается к примеру,
"F:\GAMES\Splinter Cell Double Agent\System\SplinterCell4.exe" -ll

а Расположение "F:\GAMES\Splinter Cell Double Agent" ,а надо
"F:\GAMES\Splinter Cell Double Agent\System\" а вот как это прописать я не
пойму (((

boss911 04-12-2006 21:19 520831

pr-lp

1. Flags: nocompression

2. Честно говоря, нечего не понял, может плохо вникнул в вопрос, сори!!

3. Тут лучше упаковать группу файлов в SFX архив и запустить этот архив с необходимым ключами или, можно использовать флаг hidewizard, который скроет окно распаковки файлов, например (SFX 7z):

Код:

[Files]
Source: "C:\SFX.exe"; DestDir: "{app}"; Flags: deleteafterinstall nocompression

[Run]
Filename: "{app}\SFX.exe"; Parameters: "-y"; Flags: waituntilterminated hidewizard

Распаковка SFX архива, произойдет только после извлечения всех файлов из инсталятора Inno!!

4.
Код:

[Icons]
Name: {userdesktop}\Название ярлыка; Filename: {app}\System\SplinterCell4.exe; WorkingDir: {app}\System; Parameters: -ll


pr-lp 06-12-2006 02:52 521384

2. Я уже имею ранее установленную програму,с тем что я описал скрипт, получается что указываеш путь к той папке где уже что то стоит(ранее установленная программа) ,вместо того чтоб файлам извлечься в корень ,создается папка с именем программы и в неё уже извлекаются файлы ,а мне надо чтоб файлы извлекались в корень папки... а в примере скрипта

[Setup]
AppName=ШтырлиЦ-Любимый бюст Гитлера
AppVerName=ШтырлиЦ-Любимый бюст Гитлера
AppPublisher=Carter_2006, Inc.
DefaultDirName={pf}\ШтырлиЦ
DefaultGroupName=ШтырлиЦ-Любимый бюст Гитлера
UninstallDisplayIcon={app}\STRLIZ.exe
OutputBaseFilename=Setup
UninstallStyle=classic
Compression=lzma/ultra
ShowComponentSizes=yes
ShowTasksTreeLines=yes


[Tasks]
; NOTE: The following entry contains English phrases ("Create a desktop icon" and "Additional icons"). You are free to translate them into another language if required.
Name: "desktopicon"; Description: "Создание иконки на Рабочем Столе"; GroupDescription: "Создание иконки:"; Flags: checkedonce

[Files]
Source: "D:\Games\Stirliz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files


[Icons]
Name: "{group}\ШтырлиЦ-Любимый бюст Гитлера"; Filename: "{app}\STRLIZ.exe"; WorkingDir: "{app}"; IconFilename: "{app}\Icon.ico"
Name: "{group}\Удолить "; Filename: "{uninstallexe}"
Name: "{userdesktop}\ШтырлиЦ-Любимый бюст Гитлера"; Filename: "{app}\STRLIZ.exe";WorkingDir: "{app}" ;Tasks: desktopicon ; IconFilename: "{app}\Icon.ico"


получается что я указываю папку ранее уже созданую примеру D:\Games\Stirliz5\ ..идет извлечение ..получается в папке Stirliz5 папка ШтырлиЦ и в ней уже фаилы ,а надо чтоб afsks извлекались в корень \Games\Stirliz5 ..мне кажется что то надо дописать в секции [Setup] или вообще что не писать чтоб фаилы запакованые в инно извлекались не в каталог задуманный а в корень ... если просто оставить DefaultDirName={pf}\ тогда создается Новая папка ...ну вот в краации что я для себя не уяснил

DenchikK 12-12-2006 08:05 523701

Хочу научится более или менее нормально писать скрипты на InnoSetup. Прочитал множество материлов, форумов по этому вопросу, узнал много нового и нужного, что смог воплотить в жизнь, но одна идея, которая у меня появилась, всё никак не может воплотиться в жизнь. Самому просто очень интересно!Надеюсь на Вашу помощь.

Идея заключается вот в чем:

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

Для тех кто не в теме:
В Qip смайлики находятся по следующему пути:
c:\Program Files\QIP\Skins\
дальше - анимированные смайлики (файлы gif и ini) находятся в подпапке скина, например по умолчанию смайлики находятся по этому пути:
c:\Program Files\QIP\Skins\ICQ5\Smilies\Animated\
если я например использую скин Batterfly, то смайлики соответственно будут тут:
c:\Program Files\QIP\Skins\Batterfly\Smilies\Animated\

Файл, в котором записано, какой скин сейчас используется, находится тут:
c:\Program Files\QIP\Skins\current.cfg

В нем первая строчка название скина, которое равно названию каталога.

То бишь основная проблема сводится к тому - как извлечь из файла current.cfg название скина и подставить его в путь для установки смайликов.

Сохранение текущих смайликов средствами скрипта, я так и не понял, как осуществить, хотя что то подобное встретил в "Руководстве по Inno Setup 5, версия 4". Я подошел более тупо - через скрипт AutoIT, при первом его запуске происходит переименование каталога со смайликами, при uninstall - запускается ещё раз и переименовывается обратно :
Код:

If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)

If FileExists("Animated") Then
DirMove ( "Animated", "Animated_1" )
else
If FileExists("Animated_1") Then
DirMove ( "Animated_1", "Animated" )
EndIf
EndIf
Exit

а вот сам скрипт (вернее рабочий черновик), без определения текущего скина, ставящий смайлики в каталог по умолчанию:
[code]
[Setup]
AppName=Смайлики
AppVerName=Смайлики Для QIP
DefaultDirName={pf}\QIP\Skins\ICQ5\Smilies\Animated\
DefaultGroupName=Смайлики Для QIP
AllowNoIcons=yes
OutputBaseFilename=setup
SetupIconFile=C:\Program Files\QIP\qip.ico
Compression=lzma
SolidCompression=yes
FlatComponentsList=no
UsePreviousAppDir=no
UsePreviousGroup=no
UsePreviousSetupType=no
UsePreviousTasks=no
AlwaysShowDirOnReadyPage=yes
DirExistsWarning=no
InfoBeforeFile=C:\123\MyInfoBefore.txt
UninstallFilesDir="{pf}"

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

[LangOptions]
;Параметры для русского языка
rus.LanguageName=<0420><0443><0441><0441><043A><0438><0439>
rus.LanguageID=$0419
rus.LanguageCodePage=1251
rus.DialogFontName= MS Shell Dlg
rus.DialogFontSize=8
rus.WelcomeFontName=Verdana
rus.WelcomeFontSize=12
rus.TitleFontName=Arial
rus.TitleFontSize=29
rus.CopyrightFontName=Arial
rus.CopyrightFontSize=8

[Types]
Name: "first"; Description: "Смайлики для Qip";

Код:

var
  ResultCode: Integer;
  s1, s2:string;
Procedure MyBeforeInstall;
Begin
//  s1:=ExpandConstant('{pf}')+'\QIP\Skins\ICQ5\Smilies\';
//  s2:=ExpandConstant('c:\123\DirRen.exe');
//  FileCopy(s2, s1+'\DirRen.exe', True);
//  Sleep(1000);
  Exec(ExpandConstant('{pf}\QIP\Skins\ICQ5\Smilies\DirRen.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
  Sleep(1000);
end;

//[InstallDelete]
//Type: files; Name: "{app}\*.gif"
//Type: files; Name: "{app}\_define.ini"

[Files]
Source: "C:\123\DirRen.exe"; DestDir: "{pf}\QIP\Skins\ICQ5\Smilies\"; Flags: ignoreversion;
Source: "C:\123\Animated1\*.ini"; DestDir: "{app}"; BeforeInstall: MyBeforeInstall; Flags: ignoreversion;
Source: "C:\123\Animated1\*.gif"; DestDir: "{app}"; Flags: ignoreversion;

[Icons]
Name: "{group}\{cm:UninstallProgram,Смайлики для Qip}"; Filename: "{uninstallexe}"

[UninstallRun]
FileName: "{pf}\QIP\Skins\ICQ5\Smilies\DirRen.exe"; Flags: nowait

[UninstallDelete]
Type: files; Name: "{app}\*.gif"
Type: files; Name: "{app}\_define.ini"

Заранее благодарен за помощь!

EgOrus 12-12-2006 19:38 523938

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

var
  cfgfile: TArrayOfString;
  skin: String;
begin
  LoadStringsFromFile('C:\Program Files\QIP\Skins\current.cfg', cfgfile);
  // пеерменная skin и есть название твоего скина используй её при указании путей
  skin := cfgfile[0];
  // для отладки выводит значение переменной skin
  MsgBox( skin, mbInformation, MB_OK );
end;


DenchikK 13-12-2006 07:34 524131

EgOrus
Спасибо большое за ответ, но я пока не понимаю, как потом это
склеить - получается как бы три части:

1. C:\Program Files\QIP\Skins\
2. Название полученного скина
3. \Smilies\Animated\

и как потом это полученное подставить в
[Setup]
DefaultDirName={pf}\QIP\Skins\ICQ5\Smilies\Animated\

Еще раз извините за беспокойство!

EgOrus 13-12-2006 08:52 524152

Пример почти из справки
[code][Setup]
DefaultDirName={pf}\QIP\Skins\{code:GetSkinName}\Smilies\Animated\

Код:

function GetSkinName(Param: String): String;
var
  cfgfile: TArrayOfString;
  skin: String;
begin
  LoadStringsFromFile(ExpandConstant('{pf}')+'QIP\Skins\current.cfg', cfgfile);
  // пеерменная skin и есть название твоего скина используй её при указании путей
  skin := cfgfile[0];
  result := skin;
  // для отладки выводит значение переменной skin
  MsgBox( skin, mbInformation, MB_OK );
end;

Перечитал задачу, и что-то не могу понять чем тебе поможет данный скрипт, я так понял тебе название текущего скина нужно для бэкапа существующего?
Если так то нужно вычитывать название из конфига, затем бэкапить средствами паскаля этот каталог (ремувить в папку с именем название.bak предположим) и всё.
При ините деиснтоляции (procedure DeinitializeUninstall();) удалять новый скрипт и восстанавливать опять же переименованием первоначальный скин.

DenchikK 14-12-2006 01:19 524439

Там не только бекап - туда же и новые смайлы запихиваются. Для каждого скина - свой набор смайлов.
Спасибо - попробую разобраться!

P.S.
На строчке
result := skin;
выдается ошибка Out Of Range

поправил строчку
LoadStringsFromFile(ExpandConstant('{pf}')+'\QIP\Skins\current.cfg', cfgfile);
заработало

Спасибо Вам огромное!!!

ALWagner 10-01-2007 18:33 534385

2 ALL

Есть старая программа запакованная Inno Setup v. 1.3.25. С 2001 г. не обновлялась. Есть желание сделать тихую инсталяшку. Ключи: /SILENT, /VERYSILENT, /SP- не проходят.
Innounp не распаковывает.

Кто поможет?

ZaV 11-01-2007 08:06 534626

а что за программа то поподробнее если можно ...

ALWagner 11-01-2007 12:21 534745

ZaV

Path2Clipboard v1.0.7 for Win95/Win98/WinNT4/Win2000 - маленькая бесплатная программка, которая дает Вам возможность
быстро и удобно копировать путь к файлу(ам)/папке(ам) в Буфер Обмена.

Автор: Валерий Доможиров (d_valery@mail.ru) офсайт - http://www.myfreeware.narod.ru/produ...2Clipboard.htm

Пользуюсь давно, и хотя установить ее не составляет труда хочу попробовать сделать тихую инсталяшку.

jameszero 11-01-2007 14:52 534801

ALWagner
У меня эту программу распаковал Total Commander с Multiаrc плагином.
Вот, то что получилось http://ifolder.ru/840107
Только там нет привычного iss файла, но при желании можно написать с нуля, он элементарный.

ZaV 12-01-2007 10:06 535115

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

ALWagner 12-01-2007 19:35 535203

jameszero ZaV

Thanks

Black Babay 18-01-2007 14:30 537893

Цитата:

запаковал по быстрому может где что поправить надо поэтому выкладываю и скрипт и setup ...
Немного подправил: setup

Код:

[Setup]
AppName=Path2Clipboard
AppVerName=Path2Clipboard 1.0.7.67
DefaultDirName={pf}\Path2Clipboard
OutputBaseFilename=Path2Clipboard-1.0.7.67
Compression=lzma
SolidCompression=yes
VersionInfoVersion=1.0.7.67
DisableFinishedPage=yes
DisableReadyPage=yes
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp
AllowNoIcons=yes

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

[Messages]
BeveledLabel=—— Compiled by 3B Group

[Files]
Source: "{app}\ReadMe_Rus.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\Path2Clipboard.dll"; DestDir: "{app}"; Flags: regserver uninsrestartdelete
Source: "{app}\ReadMe_Eng.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "{sys}\Path2ClipboardSetup.cpl"; DestDir: "{sys}"; Flags:

[Registry]
Root: HKLM; Subkey: "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\Path2Clipboard"; ValueType: String; ValueData: "{{8e3e0f0a-0fcc-11ce-bcb0-b3fd0e25381f}";
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{8e3e0f0a-0fcc-11ce-bcb0-b3fd0e25381f}"; ValueType: String; ValueData: "Copy Path to Clipboard";
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{8e3e0f0a-0fcc-11ce-bcb0-b3fd0e25381f}\InprocServer32"; ValueType: String; ValueData: "{app}\Path2Clipboard.dll";
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{8e3e0f0a-0fcc-11ce-bcb0-b3fd0e25381f}\InprocServer32"; ValueName: "ThreadingModel"; ValueType: String; ValueData: "Apartment";
Root: HKLM; Subkey: "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\Path2Clipboard"; ValueType: String; ValueData: "{{8e3e0f0a-0fcc-11ce-bcb0-b3fd0e25381f}";
Root: HKLM; Subkey: "SOFTWARE\Classes\Drive\shellex\ContextMenuHandlers\Path2Clipboard"; ValueType: String; ValueData: "{{8e3e0f0a-0fcc-11ce-bcb0-b3fd0e25381f}";
Root: HKCU; Subkey: "Software\VD\Path2Clipboard"; ValueName: "Cascade"; ValueType: String; ValueData: "True";
Root: HKCU; Subkey: "Software\VD\Path2Clipboard"; ValueName: "Icon"; ValueType: String; ValueData: "True";
Root: HKCU; Subkey: "Software\VD\Path2Clipboard\Rus"; ValueName: "Long"; ValueType: String; ValueData: "Длинные пути всех выбранных";
Root: HKCU; Subkey: "Software\VD\Path2Clipboard\Rus"; ValueName: "Main"; ValueType: String; ValueData: "Копировать путь";
Root: HKCU; Subkey: "Software\VD\Path2Clipboard\Rus"; ValueName: "Name"; ValueType: String; ValueData: "Имена всех выбранных";
Root: HKCU; Subkey: "Software\VD\Path2Clipboard\Rus"; ValueName: "Share"; ValueType: String; ValueData: "Длинные пути всех выбранных через Share";
Root: HKCU; Subkey: "Software\VD\Path2Clipboard\Rus"; ValueName: "Short"; ValueType: String; ValueData: "Короткие пути всех выбранных";
Root: HKCU; Subkey: "Software\VD\Path2Clipboard\Rus"; ValueName: "UNC"; ValueType: String; ValueData: "UNC-пути всех выбранных";
Root: HKCU; Subkey: "Software\VD\Path2Clipboard\Rus"; ValueName: "URL"; ValueType: String; ValueData: "Длинные пути всех выбранных в URL-формате";
Root: HKCU; Subkey: "Software\VD\Path2Clipboard\Rus"; ValueName: "woExt"; ValueType: String; ValueData: "Имена всех выбранных без расширения";


jameszero 18-01-2007 15:52 537936

Black Babay
За что ж вы так безжалостно копирайт автора удалили?
Перепаковать себе и в паблик выкладывать это, как говорят в Одессе - две большие разницы ;)

Vlad09 21-01-2007 05:31 539202

А почему бы не пользоваться последней версией программы? Кажется 5,1,9, я этой программой несколько хороших программ перепаковал - jv16 PowerTools 2006 1.52.350, Apollo 37zz, Easy CD-DA Extractor 10, Flash Get1.81Final. Довольно неплохо получается, а со старыми версиями больше мороки. Кстати, перепакованные программы можно взять с моего сайтика (если он жив еще), вот ссылка на него:
http://vlad09.mylivepage.ru/file

EgOrus 21-01-2007 11:12 539241

Vlad09
Цитата:

а со старыми версиями больше мороки
интересно ты чэнджлог версий читаешь? поясни чем например версия 5.0.1 замороченее 5.1.9. По логике вещей наоборот с каждой новой версией появл. больше возможность и общая сложность программы возрастает, принципиально же нового в создании скриптов ничего не появилось.

Grantsfer 09-02-2007 17:47 547871

Здравствуйте!Подскажите плиз, а есть какие-нить ключи для установки ярлыков в меню Пуск и в панель быстрого запуска(именно для инсталяторов InnoSetup)?

boss911 09-02-2007 20:16 547907

Grantsfer
Код:

/NOICONS
Указывает инсталятору проверять, выбрана ли команда Не создавать значков на странице
Выбор папки меню Пуск.

Подробно о ключах для InnoSetup, можно узнать сдесь, на русском!

Grantsfer 10-02-2007 10:24 548055

boss911
Эт я уже читал, тока меня интересовали ключи установки ярлыков, а не их отмена. :)

boss911 11-02-2007 01:39 548349

Grantsfer
Цитата:

Эт я уже читал
Ну так, что Вы хотите, это с официального хелпа к программе, думаю, что стандартных методов нет! :)

Grantsfer 12-02-2007 18:19 549004

Ок! Спасибо!

strelok-ac 25-05-2007 01:27 590673

Это конечно хорошо пересобрать инсталятор. Но проблема в том, что инсталятор от K-Lite Codec Pack стоит на пароле, и распаковать его невозможно. А вот и суть проблемы: создал файлик коммандой /Saveinf. Там записано: Dir=C:\Program Files\K-Lite Codec Pack. Нельзя ли там что-нибудь написать чтобы место ProgramFiles он смотрел в реестре. Например если системный раздел D: , возникает проблема. Если кто знает, Прошу помочь!

boss911 25-05-2007 03:37 590688

strelok-ac
Цитата:

Но проблема в том, что инсталятор от K-Lite Codec Pack стоит на пароле, и распаковать его невозможно.
Ну не все так плохо, например! :)
Цитата:

Там записано: Dir=C:\Program Files\K-Lite Codec Pack.
Путь можно указать через командную строку инсталлятора -
Код:

/DIR="x:\dirname"
Так же, посмотрите [addon] K-Lite Mega Codec Pack, может, еще, что-то узнаете для себя полезного!

jameszero 25-05-2007 12:24 590822

strelok-ac
Если проблема в том, чтобы сделать универсальную установку K-Lite, не приязанную у букве диска, то здесь я расписал метод (дистрибутив подготавливается к установке с помощью параметра -makeunattended)

conductor 26-08-2007 21:33 633381

http://sabbathblacklab.narod.ru/i.html
Inno Setup от Kindly
может кому интересно
У кого есть видео пример или инструкция с скриншотами
какой нибуть проги для начинающего хакера-ламера?
Пришлите плиз

di2blo 14-10-2007 22:45 660538

Привет всем помогите с программой Net SPEAKERPHONE(http://clx-soft.com/netsph/distr/netsph_setup.exe) как сделать её чтобы устанавливалась автоматом?если не сложно сделайте плиз или обьясните поподробнее

boss911 14-10-2007 23:46 660571

di2blo

Читаем ->
Код:

/SILENT, /VERYSILENT 
Установка в ускоренном или очень ускоренном режиме. При установке в ускоренном режиме
окно мастера и фоновое окно мастера не отображаются, отображается только окно прогресса.
При очень ускоренной установке окно прогресса тоже не отображается. Остальная установка
проходит как обычно - отображаются сообщения об ошибках в ходе установки, страница
приветствия (если ее отображение не отменено директивой DisableStartupPrompt или
параметром '/SP-' командной строки).

Код:

netsph_setup.exe /VERYSILENT

AlexALSP 08-12-2007 07:26 693142

А скажите чем сейчас можно распаковать новую версию программы. А то утилита предложенная здесь ее не поддерживает пока.

Spirkaa 08-12-2007 11:34 693198

AlexALSP, innounp 0.20 . http://www.msilab.net/rus.4447

AlexALSP 08-12-2007 11:54 693208

Spirkaa,

Спасибою Забрал.

snark 25-12-2007 10:08 703398

Spirkaa, перезалейте пожалуйста
уже не надо. все нашел

ChVL 26-12-2007 16:27 704469

В скрипте прописываю запуск приложения из PF. При инсталляции зависает окно с прогрессом установки (оно при этом неактивное) и процесс убивается только через диспетчер задач. Можно другим способом: закрыть приложение, тогда инсталляция проходит до конца. Другими словами, приложение уже запустилось, а процесс инсталляции не закончился и завис.
Пробовал Inno 5.1.10 и 5.2.2 - одинаково. От приложения не зависит - такой баг у всех.
Это каким-то образом лечится?

ZaV 26-12-2007 16:58 704485

ChVL,не очень понял про что ты написал
может пример скрипта выложишь или поподробнее расскажешь что за приложение ?

ChVL 27-12-2007 08:33 704821

ZaV,
В аттаче простейший проект, на самом деле пригодный для начального обучения. Тем не менее это рабочая (между прочим, полезная) утилита. В проекте оставил и свой экзешник на тот случай, если у Вас компиляция пройдёт по-другому.
Проблема следующая. При запуске без ключей а также с ключами /SILENT и /VERYSILENT зависает инсталляция, при этом прога оказывается запущенной. Если [Run] убрать - всё работает без проблем. Аналогичная ситуация и с другими приложениями.

snark 27-12-2007 10:57 704915

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

[Run]
Filename: {app}\ClipTray.exe; Flags: waituntilidle runminimized postinstall

запусткает исполнение ClipTray.exe после установки (postinstall) в минимизированном окне.
при желании можно потом пришибить этот процесс командой:
Код:

[Run]
Filename: taskkill.exe; Parameters: /F /IM ClipTray.exe; Flags: postinstall runminimized

у меня поставилось без проблем

ChVL 27-12-2007 12:59 704984

snark
Спасибо!! Всё работает как надо.

Следующая проблема. Как заставить сразу загружать интерфейс Ru вместо дефолтного En?
В аттаче проект, в котором я поступил грубо: запретил переписывать модуль En, при этом инсталлятору ничего не остаётся делать, как загружать Ru. Однако такое надругательство позволяют далеко не все программы, и уж совсем неприлично лишать юзеров возможности переключиться на интерфейс En. Подозреваю, что существует грамотное и универсальное решение.

Уп-с... Превышаю квоту, не грузит файл.
Можно загрузить отсюда .

snark 27-12-2007 14:55 705045

ChVL
чтоб загрузить сразу русский интерфейс вместо английского, нужно:
1. поставить прогу
2. выбрать нужный язык
3. залезть в "%userprofile%\Local Settings\Application Data\Martau\Total Uninstall 3\" и найти там файл user.dat/ Это и есть файл настроек.
4. Остается только добавить его в папку {localappdata} проекта и дописать строку
Код:

Source: {localappdata}\user.dat; DestDir: {localappdata}\Martau\Total Uninstall 3
Еще было б неплохо добавить имя группы в меню пуск
Код:

[Setup]
DefaultGroupName=Total Uninstall 3


ChVL 28-12-2007 08:28 705436

Спасибо! За решение проблемы и подсказку.
Из предложенного решения можно сделать вывод, что скрипт не заведует какими-то индивидуальными настройками, в частности, выбором интефейса при загрузке. Однако сколько программ (точнее, программеров) - столько и вариантов их структур. Это означает, что каждый раз придётся проявлять интуицию при поиске решения (или спрашивать грамотных людей...).

snark 28-12-2007 09:03 705453

ChVL
интуиция + RegShot + FileMon = 95 % настроенная как надо программа :)
Еще предложение: если не надо кидать ярлык на рабочий стол, можно не комментировать строку
Код:

[Icons]
;Name: "{userdesktop}\Total Uninstall 3"; Filename: "{app}\Tu.exe"; Tasks: "desktopicon";

а вписать
Код:

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: Additional icons:; Flags: unchecked

это принудительно снимает галку "Установить ярлык на рабочий стол"

ChVL 28-12-2007 10:49 705524

snark,
А если найти аналог Regshot'у, который бы выдавал результат сравнения в виде готового reg-файла - совсем был бы кайф...

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

boss911 28-12-2007 18:28 705813

Цитата:

Цитата ChVL
А если найти аналог Regshot'у, который бы выдавал результат сравнения в виде готового reg-файла - совсем был бы кайф... »

Зачем аналог! RegShot умеет сохранять снимок в виде готового reg файла, это реализовано только в версии 1.7.2.2.

ChVL 28-12-2007 20:35 705875

boss911,
Спасибо за сногсшибательную новость! - Давно мечтал...

snark 29-12-2007 08:27 706051

ChVL
а вот RegShot 1.8.2

ChVL 29-12-2007 11:21 706112

snark,
Спасибо, конечно. Обязательно проверю обе версии. Только вот по Вашей ссылке скачать не получилось - не смог разобраться с дурацкой системой webfile'a. Гоняет по кругу, а закачки нет. И номер вставлял куда-то там, и напрямую пытался...

snark 29-12-2007 11:25 706114

Вложений: 1
ChVL, вот тут

ChVL 29-12-2007 12:25 706141

snark,
Спасибо!
Подробно не разбирался, но это явно разные RegShot'ы.
1.8.2 - от производителя, объём распакованной папки около 86 КБ.
1.7.2.2 - сборка boss911, объём экзешника около 411 КБ.
Будем пробовать.

МИШАНЧИК 07-01-2008 05:30 710821

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

boss911 07-01-2008 22:39 711425

Цитата:

Цитата МИШАНЧИК
чтоб в инсталяторе собраном в Inno Setup для ярлыка деинсталятора можно было назначать какую либо иконку »

Стандартными средствами Inno нельзя, а о не о стандартных решениях, я не слышал. Можно взять заранее подготовленный деинсталлятор (unins000.exe и unins000.dat), пропатчить его другой иконкой и скомпилировать с основным дистрибутивом. Только не забываем в скрипте отключить создание деинсталлятора:
Код:

[Setup]
Uninstallable=false

Добавлено:
Извиняюсь, возможно, я изначально не правильно понял вас: вам нужно изменить иконку самого деинсталлятора (unins000.exe) или иконку ярлыка на запуск деинсталлятора?

МИШАНЧИК 08-01-2008 05:00 711558

boss911, как изменить иконку ярлыка деинсталятора, чтобы в Пуск-Прграммы и в Удалении программ иконка деинсталятора отличалась бы от иконки инсталятора(если иконку инсталятора назначаешь сам)?

boss911 08-01-2008 19:16 711938

Цитата:

Цитата МИШАНЧИК
как изменить иконку ярлыка деинсталятора, чтобы в Пуск-Прграммы ... иконка деинсталятора отличалась бы от иконки инсталятора »

Код:

[Icons]
Name: {group}\{cm:UninstallProgram,}; Filename: {uninstallexe}; IconFilename: {sys}\SHELL32.dll; IconIndex: 31

IconIndex - последовательный номер индекса иконки в ресурсе, отсчет начинается с "0" (31 - пустая корзина).

Цитата:

Цитата МИШАНЧИК
в Удалении программ иконка деинсталятора отличалась бы от иконки инсталятора »

Пост #134.

ZaV 09-01-2008 10:44 712285

У меня по моему сделано вот так

добавляем В Секции следующие строчки

Код:

[Setup]
SetupIconFile=compiler:dm.ico
UninstallDisplayIcon={app}\dmaster.exe

compiler:dm.ico
в данном случае это путь к файйлу dm.ico для инсталлятора, где compiler это папка с компилятором скрипта innosetup (Compil32.exe). Я складываю туда иконки для всех программ для того чтобы не прописывать путь вручную)

UninstallDisplayIcon={app}\dmaster.exe
указывает использовать для uninstall иконку из файла dmaster.exe из папки с установленной программой,
также можно прописать любую другую иконку, но при установке программы придется ее добавлять в дистрибутив и помещать как отдельную иконку, например в папку с установленной программой.
например можно сделать так
UninstallDisplayIcon={app}\newdm.ico
в этом случае файл иконки должен быть в c:\Program Files\Download Master\newdm.ico
если данного файла не будет то будет использована иконка по умолчанию.

boss911 09-01-2008 20:02 712692

Цитата:

Цитата МИШАНЧИК
в Удалении программ иконка деинсталятора отличалась бы от иконки инсталятора »

Простите, совсем забыл про параметр 'UninstallDisplayIcon=путь к файлу' в секции [Setup]. ZaV освежил мою память. :)



Цитата:

Цитата ZaV
например можно сделать так
UninstallDisplayIcon={app}\newdm.ico
в этом случае файл иконки должен быть в c:\Program Files\Download Master\newdm.ico
если данного файла не будет то будет использована иконка по умолчанию. »

В этом случав не обязательно, чтобы иконка или ресурс компилировался вместе с дистрибутивом, можно указать на внешнюю иконку или ресурс с нужным индексом иконки, например:
Код:

[Setup]
UninstallDisplayIcon={sys}\SHELL32.dll,31

31 - последовательный номер индекса иконки в ресурсе, отсчет начинается с "0" (31 - пустая корзина).

ChVL 10-01-2008 20:53 713648

Нет ли плагина к Inno, который бы трансформировал reg-файл в скрипт?
Уж слишком хлопотно ручками copy-paste более сотни ключей, да ещё и отдельными элементами...

jameszero 10-01-2008 21:24 713661

ChVL
Зачем плагин.
Есть удобный редактор, который умеет не только импортировать в скрипт reg файлы, но и ещё много чего полезного.
http://www.istool.org/

snark 13-01-2008 13:14 715572

ChVL, для импорта регфайла в скрипт инно будет достаточно драг-н-дропом перетащить нужный регфайл в программу ISTool в секцию Registry

2 all
script.bat - маленький батник для тех кому неохота для перекомпиляции скрипта заходить в InnoSetup, нажимать кнопку компиляции, закрывать программу...
Код:

@echo off
SET wdir=%~dp0
SET wdir=%wdir:~0,-1%
"%ProgramFiles%\Inno Setup 5\Compil32" /cc "%wdir%\install.iss"
exit

структура каталога
Код:

Embedded
Output
{app} (и др.)
script.bat
install.iss

имя скрипта InnoSetup должно быть всегда install.iss (ну или какое назначите, но только одинаковое для всех)
путь к компилятору тоже может быть отличный от вышеуказанного %ProgramFiles%\Inno Setup 5\Compil32. Меняйте на свой.

Если к тому же хочется сразу запаковать получившийся скомпилированный ехе-шник в sfx-архив (вариант для 7zip; фанаты WinRAR'a могут сотворить нечто подобное) с нужными параметрами, то добавьте к скрипту строки (пример для тотал коммандера 7.02):
Код:

SET INST=totalcmd
SET VERS=702pp
SET INN=.\Output\%INST%%VERS%
SET OUTD=.\Output\%INST%_%VERS%
DEL /Q /S %INN%.7z && DEL /Q /S %OUTD%.exe
"%PROGRAMFILES%\7-zip\7z.exe" a -t7z %INN%.7z %INN%.exe -mx9 -m0=LZMA:d24
COPY /b .\Output\7zSD.sfx + .\Output\config.txt + %INN%.7z %OUTD%.exe
DEL /Q /S %INN%.7z
:: копирование получившегося ехе-шника в папку с софтом
SET beta=d:\UNATTENDED\Silent_install\_beta_
xcopy %OUTD%.exe "%beta%\" /q /y /c
exit


ChVL 15-01-2008 11:09 717195

Когда в ISTool перетаскиваю файлы и папки, то прописывается полный путь каждой(ого) из них. Приходится в каждой строке вручную удалять всё, что находится до {app}. Или я не нашёл какой-то опции?

jameszero 15-01-2008 12:56 717316

ChVL
Самое простое, в том же ISTool выбрать Section-Script (отобразится весь листинг скрипта)
Далее Edit-Replace
В верхнем поле пишем полный путь, например C:\Program Files\MyProg, а в нижнем пишем константу, например {app} и применяем ко всему листингу.

ChVL 15-01-2008 18:34 717637

jameszero,
Понял, спасибо!
Вообще довольно странно, что для такой очевидной цели не предусмотрено конкретного решения.

Litstat 02-02-2008 18:31 731543

snark, несколько упрощенный ваш батник
Код:

@ECHO off
"%ProgramFiles%\Inno Setup 5\Compil32" /cc "%1"
EXIT

Команда на запуск: script.bat имя_скрипта.iss
При предложенной вами структуре каталога указывать путь к скрипту не нужно, плюс батник обрабатывает скрипты с любым именем
Ну и для "совсем ленивых" :wink: ! В реестр добавьте след информацию:
Код:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.iss]
@="InnoSetupScriptFile"

[HKEY_CLASSES_ROOT\InnoSetupScriptFile\shell\CompileWithInnoSetup]
@="Compile with I&nnoSetup"

[HKEY_CLASSES_ROOT\InnoSetupScriptFile\shell\CompileWithInnoSetup\command]
@="\"C:\\Program Files\\Inno Setup 5\\Compil32.exe\" /cc \"%1\""

и будете компилировать из контекстного меню.
(проверьте только путь к компилятору. он может отличаться от здешнего)

HiGH_ZeRO 05-02-2008 17:40 733608

Вопрос
Есть Autpost firewall pro 2008 исталятор Inno 5.2.1!
Делаю "OutpostProInstall_ru.exe /VERYSILENT /SP-" - но всеравно вилазит окошко выбора языка!
Вопрос как забрать ето окошко или подскажыте чем распаковать Inno 5.2.1 - пробовал Inno Setup unpacker но он говорит что неможет распаковать что файы установки повреждены хотя інсталяция проходит нормально

snark 05-02-2008 19:18 733665

HiGH_ZeRO
поставь в скрипте инно
Код:

[Setup]
ShowLanguageDialog=no

а innounp забирай отсюда (88 кб)

boss911 05-02-2008 20:13 733700

Цитата:

Цитата HiGH_ZeRO
Делаю "OutpostProInstall_ru.exe /VERYSILENT /SP-" - но всеравно вилазит окошко выбора языка! »

Код:

/LANG=language
Задает используемый язык. language задает имя языка, заданного в параметре секции
[Languages]. При использовании параметра /LANG появляется диалог Выбор языка установки.


HiGH_ZeRO 05-02-2008 20:31 733715

boss911
спасибо незаметил

Теперь делаю так

OutpostProInstall_ru.exe /SILENT /LANG=ru /NORESTART - язык вибирается руский но нет тихой установки а появляется стандартое окно продолжения инсталяции

OutpostProInstall_ru.exe /LOADINF="1.inf" /SILENT /NORESTART - такой метод тоже неработает

А содержимое 1.inf уж больно маленькое:
[Setup]
Lang=ru
Dir=D:\Program Files\Agnitum\Outpost Firewall Pro
Group=Agnitum
NoIcons=0
Tasks=

boss911 05-02-2008 21:35 733764

HiGH_ZeRO

Попробуйте так:
Код:

OutpostProInstall_ru.exe /VERYSILENT /SP- /LANG=ru

HiGH_ZeRO 05-02-2008 21:48 733774

Цитата:

Цитата boss911
Код:
OutpostProInstall_ru.exe /VERYSILENT /SP- /LANG=ru »

Не работает
А если извлечь и добавить
Цитата:

Цитата snark
[Setup]
ShowLanguageDialog=no »

То при компиляции возникает куча ошибок:
В скрипте инсталятора указываются пути к файла которых несуществует например:
Source: "{code_GetDest}\zlib,2.dll"; DestDir: "{code:GetDest}"; DestName: "zlib.dll"; AfterInstall: "UpdateComponentControl"; Flags: restartreplace overwritereadonly uninsrestartdelete ignoreversion uninsremovereadonly
mvnmvbnfxcs
zlib,2.dll -такого файла нет есть только zlib,1.dll


когда я удаляю ети ветки то следущая ошибка нет файла licence, я в нужной папке делаю файл licence и после етого выбивает ошыбку {code:GetDest} нет такой переменной

Clim 07-02-2008 09:57 734760

Ветки не удаляй, а сделай из этого файл *,2. Таких там куча будет. На 110 линии кричит, что SandBox.cat нету. А его и правда нет. Чо делать? Попробую накатить из дистрибутива и поискать в виндах.
И по поводу языка установки: в этой версии еще не дошел, но в прошлой, да и во всех инсталяхах, где есть несколько языков, удаляю все нерусские файлы, в секции [Files] удаляю все строки, со ссылками на них, секцию [CustomMessages] тоже чищу, ну и по мелочам, в каждой инсталяхе по разному, но понять без проблем. На выходе имеем только русский язык и меньший размер дистрибутива.
и в секции [Languages] оставляй только ru

HiGH_ZeRO 10-02-2008 00:13 736952

SandBox.cat - есть но в другом каталоге. Я потом посмотрел ето просто дублируются строчки незнаю почему!

Мне уже позно разбиратся- написал AUTOIT скрипт сразу с регистрацыей :)

ChVL 12-02-2008 20:18 738822

Чем лучше всего защитить сборку, скомпилированную с помощью Inno, от распаковывания?

snark 12-02-2008 22:45 738907

ChVL
в корне папки программы InnoSetup есть файл ISCrypt.dll. Это модуль криптования, и его необходимо скачивать отдельно. Подробнее тут, там же и ссылка на закачку.

Цитата:

[Setup]: Encryption
Valid values:
yes or no
Default value:
no
Description:
If set to yes, files that are compiled into the installation (via [Files] section entries) will be encrypted using ARCFOUR encryption, with a 128-bit key derived from the value of the Password [Setup] section directive.
Because of encryption import/export laws in some countries, encryption support is not included in the main Inno Setup installer and must be downloaded and installed separately if you wish to use it. See the Inno Setup Downloads page for more information.
If encryption is enabled and you call the ExtractTemporaryFile function from the [code] section prior to the user entering the correct password, the function will fail unless the noencryption flag is used on the [Files] section entry for the file.
The key used for encryption is a 128-bit MD5 hash of 64-bit random salt plus the value of Password.
При распаковке инсталляционного файла, защищенного паролем, программа распаковки запросит пароль.

в скрипте добавить строки
Код:

[Setup]:
Encryption=true
Password=123456


unikum111 13-02-2008 03:39 739049

Вопрос: при установки собранных с помощью данного инсталятора программ при выборе пункта "Запустить программу такую-то" (по окончании установки) инсталлятор не закрывается, а уходит в свёрнутый режим, и закрывается только после закрытия программы. Как это можно исправить?

Litstat 13-02-2008 03:56 739054

В скрипте в секции [Run] указываем след. флаг:
Код:

Было:
Filename: {app}\dmaster.exe; Description: Запустить Download Master; Flags: postinstall unchecked
Стало:
Filename: {app}\dmaster.exe; Description: Запустить Download Master; Flags: postinstall unchecked nowait

nowait - не ждать завершения запущенной программы и выйти из установки

unikum111 13-02-2008 04:21 739056

Вот так всё просто, мог бы и сам догадаться=)
Спасибо!

ChVL 13-02-2008 17:35 739509

snark,
Вообще-то работает, но чрезвычайно криво.
Открываю запароленный MyProg.exe в Inno Setup Unpacker'e и он спокойно показывает всё содержимое сборки (впрочем, мне это тоже бы не хотелось). Даю команду распаковать и он, как обычно, просит папку. Тыкаю носом - всё, Unpacker намертво зависает. До этого момента, правда, успевает появиться папка {app} с файликом is-00001.tmp нулевого объёма. Никакого запроса пароля не последовало.
В принципе такой сценарий устраивает и даже вполне - это какой же будет мат при попытке распаковать.... Однако, смешно: я ведь тоже не смогу это сделать. Не дай Бог потерять исходники... И зачем тогда пароль?

Для справки:
Inno Setup Compiler 5.2.2
Inno Setup Unpacker 5.2.1

snark 13-02-2008 20:35 739634

ChVL, содержимое сборки - это еще не весь скрипт :)
Я пробовал распаковывать тестовую программу (сделано Inno Setup Compiler 5.2.2) через Uniextract 1.5 + innounp.exe v 0.20 (перепакованная версия с обновленными модулями). Распаковать пытается, спрашивает пароль; если пароля нет - тогда "до свиданья"...
Цитата:

Цитата ChVL
я ведь тоже не смогу это сделать. Не дай Бог потерять исходники... И зачем тогда пароль? »

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

ChVL 14-02-2008 08:33 739873

snark,
Спасибо за деятельное участие.
Ещё. Как построить процедуру введения в скрипт внешних данных через ключ? Например, необходимо ввести в реестр регистрационные данные, которые у каждого пользователя программой свои. Понятно, что для внутреннего использования всё вводится прямо в скрипт.

jameszero 14-02-2008 12:05 739978

ChVL
Если предусматривать поля для ввода регистрационных данных во время установки, то нужно будет "рисовать" эти поля в секции [code], не скажу, что это просто... мануалы почитать придётся.

А с помощью ключей установки регистрацию можно реализовать так:

В скрипт добавляется секция [code]
Код:

[code]
function GetSerial(Param: String): String;
begin
if ExpandConstant('{param:SERIAL}') = '' then
Result := ExpandConstant('{cm:DemoSerial}')
else Result := ExpandConstant('{param:SERIAL}')
end;

function GetName(Param: String): String;
begin
if ExpandConstant('{param:USER}') = '' then
Result := ExpandConstant('{sysuserinfoname}')
else Result := ExpandConstant('{param:USER}')
end;

function GetOrganisation(Param: String): String;
begin
if ExpandConstant('{param:COMPANY}') = '' then
Result := ExpandConstant('{sysuserinfoorg}')
else Result := ExpandConstant('{param:COMPANY}')
end;

В [CustomMessages] и [Registry] добавляется
Код:

[CustomMessages]
DemoSerial=1111-2222-3333-4444

[Registry]
Root: HKLM; SubKey: SOFTWARE\Program; ValueType: string; ValueName: Serial; ValueData: {code:GetSerial}
Root: HKLM; SubKey: SOFTWARE\Program; ValueType: string; ValueName: User; ValueData: {code:GetName}
Root: HKLM; SubKey: SOFTWARE\Program; ValueType: string; ValueName: Company; ValueData: {code:GetOrganisation}

Установка программы с регистрацией:

program.exe /SERIAL=9999-8888-7777-6666 /USER=Pupkin /COMPANY=Home

При установке программы без ключей, подхватится демонстрационный серийный номер из секции [CustomMessages], а имя пользователя и название организации будут взяты системные из Windows

ChVL 14-02-2008 15:44 740139

jameszero,
Понял, спасибо! Особенно интересна последняя фишка. А вот если б ещё без ключей прописывалось "демонстрационное" имя - цены бы ей не было...

К сожалению, дальнейшие исследования функции Encryption показали её полную несостоятельность. Оказалось, что если в секции [Setup] происана строка Encryption, причём, неважно(!) с каким значением: yes или no, то при попытке инсталляции сборки запрашивается Password. Мне это совсем не надо. Что-то тут Jordan Russell или Martijn Laan явно перемудрили (или недомудрили). Если же строку Password не писать или оставить пустой - не компилируется.
Похоже, придётся искать стороннюю программу для защиты от распаковки...

jameszero 14-02-2008 21:19 740350

ChVL
Цитата:

если б ещё без ключей прописывалось "демонстрационное" имя
Если я правильно понял вопрос, то это делается по аналогии с серийным номером.
При отсутствии ключа /USER, в реестр пропишется слово Tester
Код:

[CustomMessages]
DemoSerial=1111-2222-3333-4444
DemoName=Tester

[code]
function GetSerial(Param: String): String;
begin
if ExpandConstant('{param:SERIAL}') = '' then
Result := ExpandConstant('{cm:DemoSerial}')
else Result := ExpandConstant('{param:SERIAL}')
end;

function GetName(Param: String): String;
begin
if ExpandConstant('{param:USER}') = '' then
Result := ExpandConstant('{cm:DemoName}')
else Result := ExpandConstant('{param:USER}')
end;
...


ChVL 15-02-2008 05:21 740485

jameszero,
Да, конечно. Извините за глупый вопрос - в спешке недосмотрел очевидное решение.

Ещё. При старте подключается (при желании) окно с выбором языка инсталлятора. А можно ли к нему "прицепить" и синхронное переключение языка интерфейса, загружаемого по умолчанию? Для этого обычно делается изменение в .ini (или просто выбрать один из двух .ini), или же изменение ключа реестра (или просто запускать один из двух reg-файлов)...

snark 16-02-2008 13:10 741450

ChVL, такое делается следующим образом: есть два ini-файла - русский и английский соответственно. Они привязываются к языку установки, и в зависимости от того, какой язык выбран, устанавливается соответствующий ини файл. В секции Setup должна быть строка
Код:

[Setup]
ShowLanguageDialog=yes

В общем случае ее можно и не писать, так как это опция по умолчанию; главное - чтобы значение параметра не равнялось no, иначе диалога выбора языка не появится.

Снова пример из жизни - установка программы ApBackUp 3.0
Код:

[Files]
Source: {app}\APBackUp,1.exe; DestDir: {app}; DestName: APBackUp.exe
Source: {app}\ApBackUp,1.ini; DestDir: {app}; DestName: ApBackUp.ini
Source: {app}\apbackup,2.ini; DestDir: {app}; DestName: apbackup.ini; Languages: en; Flags: onlyifdoesntexist
Source: {app}\apbackup,3.ini; DestDir: {app}; DestName: apbackup.ini; Languages: ru; Flags: onlyifdoesntexist

Файл ApBackUp,1.ini содержит основные параметры, а файлы apbackup,2.ini и apbackup,3.ini дописывают значения, различные для каждого языка. Можно поступить проще и
Цитата:

Цитата ChVL
Для этого обычно делается изменение в .ini (или просто выбрать один из двух .ini) »

оперировать лишь двумя разными ini - каждый для своего языка. Для первого назначить имя settings,1.ini, для второго - settings,2.ini.
Подобным образом следует поступать и с ключами реестра.

Maxx_81 17-02-2008 17:52 742442

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

unikum111 27-02-2008 16:49 749321

Модераторы, добавьте, пожалуйста следующую информацию в шапку темы.
Официальный сайт
Inno Setup 5.2.2 RU, Зеракло
Русская справка, Зеракло, Зеракло
ISTool 5.2.1, Зеркало, Зеракло
Русификатор ISTool, Зеркало, Зеркало
Inno Setup Script Generator, Зеркало
Unpaker 2.0, Зеркало, зеркало - распаковывает инсталляторы версии 5.2.2
Inno Setup Pack 5.2.2 RU
Примеры скриптов на паскале
Inno Setup Addon 0.07 For Total Commander
Параметры командной строки инсталлятора
читать дальше »

Код:

Программа-инсталлятор поддерживает приведенные ниже параметры командной строки. Они пригодятся системным администраторам и другим программам, вызывающим инсталлятор.
/SP-
Отключает страницу "Эта программа установит... Вы хотите продолжить?" инсталлятора. Выполнится только если DisableStartupPrompt секции [Setup] равна yes.
/SILENT, /VERYSILENT
Установка в ускоренном или очень ускоренном режиме. При установке в ускоренном режиме окно мастера и фоновое окно мастера не отображаются, отображается только окно прогресса. При очень ускоренной установке окно прогресса тоже не отображается. Остальная установка проходит как обычно - отображаются сообщения об ошибках в ходе установки, страница приветствия (если ее отображение не отменено директивой DisableStartupPrompt или параметром '/SP-' командной строки).
Если после установки необходима перезагрузка, команды '/NORESTART' не дано и установка проходит в ускоренном режиме, появится сообщение "Перезагрузить компьютер?". Если режим установки очень ускоренный, система перезагрузится не спрашивая.
/LOG
Указывает инсталлятору создать log-файл в папке TEMP для подробного отчета о действиях и событиях в секции [Run], предпринятых в ходе установки. Применяется при отслеживании ошибок. Например, если вы подозреваете, что файл не был удален, хотя должен был, log-файл сообщит, что файл был действительно пропущен и почему.
log-файлу присваивается уникальное имя на базе текущей даты. (Существующие файлы не перезаписываются и не дополняются).
Информация, содержащаяся в log-файле, техническая и поэтому не может быть понята пользователем.
/LOG="filename"
Параметр похож на /LOG, но в отличие от него позволяет указать фиксированный путь/имя файла для log-файла. Если файл с указанным именем уже существует, он будет заменен. Если файл не может быть создан, установка прервется и выдаст сообщение об ошибке.
/NOCANCEL
Не дает пользователю прервать установку, отключая кнопку Отменить и игнорируя клики на кнопке Закрыть. Используется в комбинации с '/SILENT' или '/VERYSILENT'.
/NORESTART
Указывает инсталлятору не перезагружать компьютер даже если это необходимо.
/RESTARTEXITCODE=exit code
Задает инсталлятору код, который он должен возвратить, если необходима перезагрузка. Используется с '/NORESTART'.
См. также Коды выхода инсталлятора.
/LOADINF="filename"
Указывает инсталлятору загрузить параметры установки из указанного файла после проверки командной строки. Этот файл может быть подготовлен с помощью '/SAVEINF=' command.
Не забудьте ставить кавычки при использовании имен, содержащих пробелы.
/SAVEINF="filename"
Указывает инсталлятору сохранять параметры установки в указанный файл.
Не забудьте ставить кавычки при использовании имен, содержащих пробелы.
/LANG=language
Задает используемый язык. language задает имя языка, заданного в параметре секции
[Languages]. При использовании параметра /LANG появляется диалог Выбор языка установки.
/DIR="x:\dirname"
Меняет имя папки, заданное по умолчанию, на странице Выбор папки назначения. Должен быть задан полный путь.
/GROUP="folder name"
Меняет имя папки на странице Выбор папки меню Пуск. Если директива DisableProgramGroupPage секции [Setup] равна yes, этот параметр командной строки игнорируется.
/NOICONS
Указывает инсталлятору проверять, выбрана ли команда Не создавать значков на странице Выбор папки меню Пуск.
/COMPONENTS="comma separated list of component names"
Меняет выбраные по умолчанию компоненты. В этом случае параметр командной строки указывает инсталлятору менять тип установки на Выборочный.
/PASSWORD=password
Задает пароль. Если не указана директива Password секции [Setup], этот параметр игнорируется.
Если введен неправильный пароль, параметр также игнорируется.


boss911 27-02-2008 18:08 749360

Цитата:

Цитата unikum111
Параметры командной строки инсталлятора »

Я уже давно просил.

unikum111 27-02-2008 19:09 749390

Подскажите, пожалуйста, каким образом можно извлечь из инсталлятора секцию [code]? При распаковке инсталлятора в папке "embended" появляется файл CompiledCode.bin, как его расшифровать не понятно, а в самом извлечённом скрипте секция [code] отсутствует.

jameszero 27-02-2008 21:04 749491

unikum111,
Цитата:

Цитата unikum111
Модераторы, добавьте, пожалуйста следующую информацию в шапку темы. »

Добавить не проблема, только кто будет следить за актуальностью ссылок на ifolder?

Цитата:

Цитата unikum111
каким образом можно извлечь из инсталлятора секцию [code]? »

Это невозможно, по крайней мере, никому ещё не удавалось.

unikum111 28-02-2008 09:13 749755

jameszero, хорошо, сделаю ссылки на оффициальные сайты + парочку зеркал, а следить особо на ifolder за ссылками не надо, т.к. по истечении срока файлы перекинут в архив, и их также можно скачать, но посмтрев рекламку.

ChVL 29-02-2008 09:07 750399

Требуется запустить reg файлик. Делаю так:
Код:

[Run]
Filename: {sys}\Regedt32.exe; Parameters: Reg.reg;

Редактор реестра требует подтверждения: "Вы действительно хотите добавить..."
1. Как убрать (пропустить) это окно?
2. Как уничтожить этот Reg.reg после его запуска?

ZaV 29-02-2008 09:35 750409

а требуется именно испоьзование reg файла ? может быть лучше использовать секцию registry
а так
по первому вопросу строка должна быть вида
Код:

regedit /s Reg.reg
т.е надо еще ключик дописать

а насчет удаления можно также в секцию run прописать команду на удаление файла reg.reg

ChVL 29-02-2008 10:56 750452

ZaV,
В том-то и дело, что встретился необычный случай (для меня, по крайней мере), когда программа не видит прописанный в реестр ключ через секцию [Registry]. Запускаю reg файлик - всё нормально, при этом в реестре ничего не меняется.

snark 29-02-2008 11:32 750480

ChVL,
Цитата:

Цитата ChVL
В том-то и дело, что встретился необычный случай (для меня, по крайней мере), когда программа не видит прописанный в реестр ключ через секцию [Registry]. Запускаю reg файлик - всё нормально, при этом в реестре ничего не меняется. »

скрипт в студию!..

ChVL 29-02-2008 13:34 750559

Нашёл решение. Спасибо ZaV за подсказку поставить ключ впереди. Я же пытался прицепить в конце.
Может кому понадобится, рабочий код запуска reg файлика такой:
Код:

[Run]
Filename: {sys}\Regedt32.exe; Parameters: /s Reg.reg; WorkingDir: {app};

Или такой:
Код:

[Run]
Filename: {win}\regedit.exe; Parameters: /s Reg.reg; WorkingDir: {app};

Уточняю второй вопрос: надо удалить файлик Reg.reg из DestDir после того, как он сделал своё дело. Как?

snark:
Из скрипта никакой доп. инфо не вытащить - там самая обыкновенная секция [Registry], которая исправно делает своё дело. Это такая необычная особенность программы.

unikum111 29-02-2008 13:44 750569

ChVL,
Код:

[InstallDelete]
Name: {app}\Reg.reg; Type: files

Лучше стоит разобраться почему не работает из секции [Registry], а то столько лишних проблем, имхо.

ChVL 29-02-2008 13:55 750579

unikum111,
Спасибо!
Дык, проблемы решены, и вылилось это в пару строчек...
А разобраться не удалось - потратил уйму времени на это.

unikum111 29-02-2008 14:02 750588

В следующий раз выкладывй скрипт, вместе подумаем:) Может чего и выйдет.

ZaV 29-02-2008 14:44 750619

если загонял данные в секцию registry через импорт из reg файла
в программе подобной Istool то просто они бывает некорректно их преобразовывают
попробуй поставиь программу с использованием секции registry потом в regedit экспортируй эту ветку в reg файл и сравни с тем reg файлом что есть у тебя. Скорей всего они будут отличаться.
у меня это по моему налюдалось на типе данных
ValueType: binary;

я для того чтобы все работало приводил ее к такому виду
Код:

Root: HKLM; SubKey: Software\test\test; ValueType: binary;ValueData:(23 2a 4d 45 4e 55 5f 53 45 43 54 49 4f 4e 2a 0d 0a cc e5 d4)
у тебя может быть что нибудь наподобие

unikum111 29-02-2008 15:21 750647

jameszero, думаю, можно добавить в шапку. Вот привёл в надлежащий вид, вроде:)
Кто-нибудь знает как пользоваться ROPS 3.0.3.53 disassembler? Вроде он секцию [code] расшифровывает, есил я ничего не путаю.

ChVL 29-02-2008 16:38 750693

unikum111,
Самое интересное: функция удаления не работает! Ничего не понимаю - там даже трёх сосен нет, где можно было бы заблудиться...
Делал так:
Код:

[InstallDelete]
Type: files; Name: {app}\Reg.reg;

И вот так:
Код:

[InstallDelete]
Type: files; Name: {pf}\MyProg\Reg.reg;

- файл не удаляется! Где можно покопать?

ZaV,
Очень хорошая подсказка. Обязательно проверю. В том файле именно binary.
Меня смутило то, что RegShot до запуска файла и после запуска исправно докладывает: изменений в реестре - 0. Если ValueData он не сравнивает, то такой фокус точно может быть.

unikum111 29-02-2008 17:41 750738

ChVL, по идее должен, может с путями что-то... В путях обычно кавычки пишутся, попробуйте так:
Код:

Type: files; Name: "{app}\Reg.reg";

ChVL 02-03-2008 18:36 751878

Вложений: 1
Сложилось впечатление, что гуру этого топика мне не поверили.
В аттаче тестовая программка, где прописано удаление файла в полном соответствии с документацией на Inno Setup Compiler 5.2.2.
В таком виде функция не работает. Помогите разобраться: где тут моя ошибка, или это баг ISC, о чём стОит запросить авторов?

snark 02-03-2008 20:12 751940

ChVL, а если так
Код:

[Files]
Source: {app}\Test.txt; DestDir: {app}; Flags: deleteafterinstall


unikum111 04-03-2008 04:28 752859

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

ChVL 04-03-2008 11:25 753018

snark,
Эта функция работает, пользовался ею. В данном случае она не устраивает: файл надо удалить после того, как он сделает своё дело - будет запущен или открыт.
Так что, потревожить авторов Inno?

jameszero 04-03-2008 12:27 753071

ChVL
А если так:
Код:

[Files]
Source: {app}\Test.txt; DestDir: {app}; Flags: deleteafterinstall

[Run]
Filename: "{app}\Test.txt"; Flags: shellexec

Если не подходит, опишите конкретную задачу, что и в какой момент времени нужно запустить, а потом удалить.

ChVL 05-03-2008 09:07 753659

jameszero,
Всё работает как надо.
Очевидно, что флаг deleteafterinstall срабатывает тогда, когда пройден весь скрипт, в том числе и секция [Run]. На такой алгоритм мне и следовало обратить внимание. Спасибо за науку.
И всё-таки секция [InstallDelete] команды не выполняет - явный баг, IMHO.

snark,
Вероятно Вы имели ввиду это же решение. Прошу прощения, что не понял сразу.

jameszero 05-03-2008 16:06 753973

ChVL
[InstallDelete] отрабатывает до установки. По крайней мере, так сказано в справке.
Цитата:

... entries are processed as the first step of installation.

ChVL 05-03-2008 17:04 754014

jameszero,
Дык, не отрабатывает ни - до, ни - после! - Файл не удаляется.

jameszero 05-03-2008 18:13 754065

ChVL
На примере скрипта из 181 поста:
Предварительно создаём папку Profram Files\Test, кладём в неё файл Test2.txt и компилируем скрипт
Код:

[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputBaseFilename=Test
DefaultGroupName=Test
Compression=lzma

[Files]
Source: "{app}\Test.txt"; DestDir: "{app}";

[InstallDelete]
Type: files; Name: "{app}\Test2.txt";

Инсталлируем программу - файл Test2.txt удалён, Test.txt "установлен".

Из [InstallDelete] неполучится удалить файл Test.txt потому, что эта секция срабатывает до секции [Files] (если быть точнее, файл удаляется и сразу создаётся опять).

ChVL 06-03-2008 10:51 754488

jameszero,
То, что и как Вы раскопали, - просто класс!
Реально имеет право на существование и такой вариант: файлы имеют одинаковое название, а содержание - разное. Это может быть полезно в том случае, когда делается инсталляция программы более поздней версии поверх предыдущей, и при этом необходимо какой-то файл(ы) заменить новой версией.

snark 06-03-2008 14:32 754672

ChVL,
Цитата:

Цитата ChVL
файлы имеют одинаковое название, а содержание - разное. Это может быть полезно в том случае, когда делается инсталляция программы более поздней версии поверх предыдущей, и при этом необходимо какой-то файл(ы) заменить новой версией. »

вот в мануале условия замены существующих файлов
Цитата:

Remarks
If a file already exists on the user's system, it by default will be replaced according to the following rules:

If the existing file is an older version than the file being installed (as determined by the files' version info), the existing file will be replaced.
If the existing file is the same version as the file being installed, the existing file will not be replaced, except if the replacesameversion flag is used and the content of the two files differs.
If the existing file is a newer version than the file being installed, or if the existing file has version info but the file being installed does not, the existing file will not be replaced.
If the existing file does not have version info, it will be replaced.
то есть вкратце, существующий файл заменяется новым, если:
1. он старше по дате (определяется по дате в свойствах файла);
2. указан флаг replacesameversion в свойствах нового файла или содержание файлов различно;
3. у существующего файла нет версии (version info).

jameszero 06-03-2008 15:35 754727

snark
Всё верно, для замещения старого файла новым, шаманств с [InstallDelete] не потребуется, но допустим такая ситуациия:
Программа при первом запуске создаёт свои конфигурационные файлы и с ними работает, а в следующей версии автор решает изменить формат (имена) этих файлов. Вот тут и пригодится [InstallDelete]

snark 06-03-2008 17:39 754804

jameszero, да, такой вариант я что-то не продумал... Подходит идеально.
И хотя ChVL имел в виду именно одинаковое имя и разное содержание, бывают же случаи, когда все наоборот

sabah 12-03-2008 00:40 758259

скажите можно ли извлеч файлы из setup-1.bin,setup-2.bin,... если фаил setup.exe потерян?
при запуске innounp.exe выдает сообщение о повреждениях и несовместимостях
unpacker последней версии

ChVL 12-03-2008 20:20 758879

Как сделать, чтобы любым unpacker'ом нельзя было добраться до скрипта? Устроит любой вариант, к примеру:
- скрипт не извлекается (как будто его и нет);
- извлекается, но не читается;
- извлекается, но запаролен.

boss911 13-03-2008 02:50 759119

Цитата:

Цитата ChVL
Как сделать, чтобы любым unpacker'ом нельзя было добраться до скрипта? »

Запаролить дистрибутив, но кому надо, тот распакует. :)
Но опять же, не все так просто. ;)

ChVL 13-03-2008 05:27 759148

boss911,
Это я уже пробовал. Не подходит. Речь идёт о скрипте. Дистрибутив должен использоваться как обычно, т.е. пользователь сборки может и не догадываться о существовании скрипта в принципе.

ZaV 13-03-2008 10:04 759236

Цитата:

Цитата ChVL
Как сделать, чтобы любым unpacker'ом нельзя было добраться до скрипта? »

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

ChVL 13-03-2008 16:05 759504

ZaV,
Цитата:

секцию code по идее её средствами можно сделать все что угодно
IMHO, с помощью секции [code] можно творить чудеса в пределах компилятора, но она, в моём представлении, бессильна вне скрипта, что по определению требуется для решения поставленной задачи. Или я не прав?
Цитата:

перейти на другой инсталлятор
Это понятно, только вот нет желания...
Цитата:

действительно такой серьезный проект
Да нет, не так уж серьёзно. Понадобилось скрыть регистрационные данные. В реестре это явным образом не засвечено, а вот в скрипте легко можно засечь. Есть и другой прецедент. Сознаю, что для грамотного программера любые ухищрения с защитой – семечки, но никто из них копаться не станет. Хотелось бы защититься от массы любителей запускать unpacker.

WindoStroy 15-03-2008 23:15 761317

ChVL,

вот может поможет:


Цитата:

Простенький способ криптования инсталлятора c использованием подсчета хеша MD5 "обманных" символов. (Пароль будет находиться в памяти). Требуется ISCrypt.dll в одной папке с Inno Setup

Цитата:

[Setup]
AppName=Pass
AppVerName=Pass
DefaultDirName={pf}\Pass
Uninstallable=No
Encryption=Yes
;MD5 сумма, подсчитанная ниже
Password=449f2546d2a51b20442c5025c43f126f

[Files]
Source: "C:\1.txt"; DestDir: "{app}"

[code]
procedure InitializeWizard();
var
MD5: String;
begin
//Подсчитываем сумму слагаемых в MD5 калькуляторе, на примере сумма MD5 "````" равна 449f2546d2a51b20442c5025c43f126f
MD5 := GetMD5OfString(''+'`'+'``'+'`')
WizardForm.PasswordEdit.Visible:= False;
//Вставляем то, что складываем
WizardForm.PasswordEdit.Text:= MD5;
end;

//Как обычно нажимаем страницу с пассом
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpPassword then
WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;
(с) Kindly

YikxX 16-03-2008 04:09 761403

Не в курсе, писалось или нет - После отработки инсталлера Inno Setup в секции реестра [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ появляется раздел, в котором прописаны все опции, выбранные при установке программы. Если эти записи добавить в реестр перед запуском самого инсталлятора, то прога поставится точно в такой же конфигурации. Имя раздела, вроде, для каждой проги прописано жестко и не меняется (остается его лишь найти и экспортировать в reg-файл с последующим удалением ненужных строк).

ChVL 18-03-2008 08:38 762658

Проблему защиты от распаковки можно решить следующим образом. В простейшем случае в секцию [Setup] дописываются две строчки и добавляется секция [ Code ]:
Код:

[Setup]
Encryption=Yes
Password=1a2b3c4d

 [ Code ]
procedure InitializeWizard();
begin
WizardForm.PasswordEdit.Visible := False;
WizardForm.PasswordEdit.Text := '1a2b3c4d'
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpPassword then
WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;

В этом случае пароль сохраняется в инсталляторе в явном виде.
Если же у вас есть желание скрыть пароль, то сгенерируйте для него MD5 хэш и сравните с помощью функции GetMD5OfString. Полностью этот способ привёл WindoStroy в посте #200.
Не забудьте в папку Inno Setup 5 (в PF) положить файл ISCrypt.dll.
В обоих случаях при инсталляции программы пользователь не заметит, что она запаролена, т.к. на старте пароль вводится из памяти с помощью скрипта секции [code]. Если же попытаться программу распаковать, то unpacker намертво зависает…

jameszero 18-03-2008 08:58 762671

ChVL
К сожалению, способ не универсален - защищаются от распаковки только файлы программы, а сам скрипт легко извлекается Unpacker-ом

ChVL 18-03-2008 10:30 762730

jameszero,
Цитата:

скрипт легко извлекается Unpacker-ом
Каким? Пробовал Inno Setup Unpacker Explorer 2.0 - не распаковывает, в том числе и скрипт.

jameszero 18-03-2008 16:15 763004

ChVL
В Unpacker-е нужно выделить не все файлы, а только скрипт.

WindoStroy 18-03-2008 22:15 763280

Вышла версия 5.2.3.
http://www.jrsoftware.org/download.php/is.exe
http://www.jrsoftware.org/download.php/is.exe?site=1

Секция Code, идёт в бинарном файле, через секцию Code можно добавить параметры в реестр, и вот защита.

могу порекомендовать обратится сюда, возможно найдётся другое решение:
http://forum.ru-board.com/topic.cgi?...&start=1080#lt

ChVL 19-03-2008 09:26 763479

jameszero,
Цитата:

Цитата jameszero
К сожалению, способ не универсален »

Ну, не всё совсем уж так безрадостно, ибо извлечённый скрипт усечён. В нём нет пароля и нет секции [code] – это наиболее важные моменты. Тем не менее в каких-то случаях может не устроить то, что там полностью представлена секция [Registry].

boss911 20-03-2008 00:46 763990

Цитата:

Цитата ChVL
В нём нет пароля »

Пароль можно достать из бинарного файла, но, насколько мне известно, это немного геморно.

woodyfon 20-03-2008 02:37 764026

Как убрать окно приветствия мастера Inno Setup
 
Можно ли, и если можно, то как убрать окно приветствия в мастере установки приложения Inno Setup?
Окно приветстия добавляю как скриншот. Хочу сделать на подобие самораспаковівающиегося архива, но в inno setup можно прописать ключи реестра, путь установки, назначить иконки и т. д.
В общем хотелось узнать как сделать установку программі, чтобы она устанавливалась в фоновон режиме, т. е. пользователь не мог ни на что повлиять, а программа корректно установится. Короче говоря, хочется иметь такой дистрибутив прог, который есть на диске Zver-я.

boss911 20-03-2008 02:53 764027

Цитата:

Цитата woodyfon
В общем хотелось узнать как сделать установку программі, чтобы она устанавливалась в фоновон режиме »

Для этого достаточно запустить инсталлятор с ключом /VERYSILENT
Inno Setup Command Line Options

Цитата:

Цитата woodyfon
как убрать окно приветствия в мастере установки приложения »

Пропишите в секцию [code] -
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;


woodyfon 20-03-2008 03:02 764029

Цитата:

Цитата boss911
Для этого достаточно запустить инсталлятор с ключом /VERYSILENT
Inno Setup Command Line Options »

Немного уточню, запустить скомпилированный инсталлятор из командной строки Windows?
Цитата:

Цитата boss911
[Codе]
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end; »

Код не проканывает! Дописал его в конце скрипта, ничего не изменилось! может ее надо где-то вызвать?

boss911 20-03-2008 03:41 764032

Цитата:

Цитата woodyfon
запустить скомпилированный инсталлятор из командной строки Windows? »

Совершенно верно.

Цитата:

Цитата woodyfon
Код не проканывает! »

А вы пропишите название секции 'Code' самостоятельно.

woodyfon 20-03-2008 03:58 764037

Правильно заметили, что просто скопировал и вставил :).
Расскажите немного о функции SendMessage. Прочитал справку, а описания ее параметров не наешл.
Процедура CurPageChanged отвечает за определенную страницу мастера. Ее параметр CurPageID=wpWelcome есть страница приветствия или окно приветствия. Когда появляется окно приветствия вызывается процедура SendMessage. Она имеет 4 параметра. Расскажите плиз о самой функции и ее параметрах.

boss911 20-03-2008 04:21 764040

Цитата:

Цитата woodyfon
Расскажите плиз о самой функции и ее параметрах. »

Это уже не ко мне, так как с программированием я на "вы", увы. :not-me:

Цитата:

Цитата woodyfon
есть страница приветствия или окно приветствия. »

Это я точно знаю, что страница приветствия. :)

ChVL 20-03-2008 08:46 764095

boss911,
Цитата:

Цитата boss911
Пароль можно достать »

Дык, можно закриптовать. А извлечённый хэш никому не нужен...

WindoStroy 20-03-2008 21:11 764559

имея хеш, можно легко подобрать пароль.

mariolast 25-03-2008 00:34 766998

Распаковал файл GoldfishAquarium-V2.exe

Получил install_script.iss с содержанием ниже. Только если его обратно запаковать, то при установке оно ставит в меню Пуск-Программы название Default, а как его вообще убрать, чтоб не ставило, то не вижу такой строки...

[Setup]
AppName=LifeGlobe Goldfish Aquarium 2.0
AppVerName=Goldfish Aquarium 2.0
DefaultDirName={pf}\Prolific Publishing, Inc.\Goldfish Aquarium 2.0
OutputBaseFilename=setup
Compression=lzma

[Files]
Source: {sys}\Goldfish2.scr; DestDir: {sys}; Flags: ignoreversion
Source: {app}\ReadMe.txt; DestDir: {app}; Flags: ignoreversion
Source: {app}\www.prolific.com.url; DestDir: {app}; Flags: ignoreversion

[Registry]
Root: HKLM; Subkey: Software\Prolific Publishing, Inc.\LifeGlobe; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: Software\Prolific Publishing, Inc.\LifeGlobe\GoldfishAquarium2; Flags: uninsdeletekey
Root: HKLM; Subkey: Software\Prolific Publishing, Inc.\LifeGlobe\GoldfishAquarium2; ValueName: Version; ValueType: String; ValueData: 2.0; Flags: uninsdeletekey
Root: HKCU; Subkey: Software\Prolific Publishing, Inc.\LifeGlobe; Flags: uninsdeletekeyifempty
Root: HKCU; Subkey: Software\Prolific Publishing, Inc.\LifeGlobe\GoldfishAquarium2; Flags: uninsdeletekeyifempty
Root: HKCU; Subkey: Software\Prolific Publishing, Inc.\LifeGlobe\GoldfishAquarium2; ValueName: gAtt; ValueType: Binary; ValueData: 04 00 00 00; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Prolific Publishing, Inc.\LifeGlobe\GoldfishAquarium2; ValueType: binary; ValueName: RegCode; ValueData:xxx - модератор: Публикация лицензионных ключей и кодов запрещена ОПК 3.18 !!!
Root: HKLM; SubKey: SOFTWARE\Prolific Publishing, Inc.\LifeGlobe\GoldfishAquarium2; ValueType: binary; ValueName: RegCode; ValueData: xxx - модератор: Публикация лицензионных ключей и кодов запрещена ОПК 3.18 !!!
Root: HKCU; SubKey: Control Panel\Desktop; ValueType: string; ValueName: SCRNSAVE.EXE; ValueData: Goldfish2.scr

[Run]

[Icons]
Name: {group}\Goldfish Aquarium 2.0\Goldfish Aquarium 2.0; Filename: {sys}\Goldfish2.scr; WorkingDir: {sys}
Name: {group}\Goldfish Aquarium 2.0\Goldfish Aquarium 2.0 Read Me; Filename: {app}\ReadMe.txt
Name: {group}\Goldfish Aquarium 2.0\Uninstall LifeGlobe Goldfish Aquarium 2.0; Filename: {app}\unins000.exe
Name: {group}\Goldfish Aquarium 2.0\Prolific Publishing on the Web; Filename: {app}\www.Prolific.com.url
Name: {userdesktop}\Goldfish Aquarium 2.0; Filename: {sys}\Goldfish2.scr; WorkingDir: {sys}
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\Goldfish Aquarium 2.0; Filename: {sys}\Goldfish2.scr; WorkingDir: {sys}

[Tasks]

[CustomMessages]
NameAndVersion=%1 version %2
AdditionalIcons=Additional icons:
UninstallProgram=Uninstall %1
AssocFileExtension=&Associate %1 with the %2 file extension
AssocingFileExtension=Associating %1 with the %2 file extension...

mariolast 25-03-2008 01:00 767008

метод /LOADINF="filename" не работает, неизвестно, откуда он его считывает

unikum111 25-03-2008 08:47 767087

Цитата:

Цитата mariolast
Получил install_script.iss с содержанием ниже. Только если его обратно запаковать, то при установке оно ставит в меню Пуск-Программы название Default »

Нужно добавить в секцию [Setup] строку:
Код:

DefaultGroupName=LifeGlobe Goldfish Aquarium 2.0 (полсе знака "=" можеете написать всё что угодно)
Цитата:

Цитата mariolast
а как его вообще убрать, чтоб не ставило, то не вижу такой строки... »

добавить в секцию [Setup] строку (страница с выбором будет, но установка в меню пуск не произойдёт, там будет стоять отменяющий флажок):
Код:

AllowNoIcons=yes
Чтобы совсем отключить стрницу выбора программной группы нужно добавить в секцию [Setup] строку:
Код:

DisableProgramGroupPage=yes
Для более плотного сжатия можно также в секцию [Setup] добавить строку:
Код:

SolidCompression=yes
Обычно распакованный скрипт несколько отличается от оригинального, поэтому приходится подправлять.

fox_cub 25-03-2008 19:30 767597

Столкнулся с проблемой распаковки инсталляторов созданных последней версией...В частности DVDFab4120...В чём проблема не знаю....

boss911 26-03-2008 01:06 767762

Цитата:

Цитата fox_cub
Столкнулся с проблемой распаковки инсталляторов созданных последней версией... »

Если было упаковано 5.2.3 версией, то innounp 0.20, тестовый билд от 27.10.07, не распакует его. Новой версии на данный момент нет, к сожалению, а разработчик что-то давно не шевелится.

unikum111 27-03-2008 16:48 769085

В Inno Setup есть встроенная функция SetIniString, она задаеётся в секции [code]. Подскажите как должен выглядеть скрипт, если мне необходимо, после окончания установки прописать в секцию [Settings] , параметр Language, значение {app}\test.lng. Сам ini-файл находится {userappdata}\test\test.ini

boss911 27-03-2008 17:33 769139

unikum111

Если я правильно понял, то секцию [code] тут не обязательно использовать, так как Inno Setup умеет работать с ini файлами через секцию [INI] -

Код:

[INI]
Filename: {userappdata}\test\test.ini; Section: Settings; Key: Language; String: {app}\test.lng


unikum111 28-03-2008 14:22 769762

Представляю Вашему вниманию полный комплект Inno Setup.
В сборку входят следующие компоненты:
Inno Setup compiler 5.2.2 русская версия;
ISTool 5.2.1 русская версия;
Inno Script Generator английская версия;
Inno Setup Unpacker Explorer 1.0 аглийская версия;
Примечание: в Inno Setup Unpacker Explorer 1.0 заменён innounp.exe на тестовую версию 2.0, так что распаковывает инсталляторы вплоть до версии 5.2.2.
Есть возможность выбора компонентов.
Не предусмотрена деинсталляция отдельных компонентов, только всех сразу (пока не знаю как сделать).
Скачать: ifolder, RapidShare, iBox (Размер: 5.34 Mb).

SamLab 10-04-2008 14:46 778935

Что прописать в командной строке после /VERYSILENT чтобы блокировать запуск программы после установки? иначе придется taskkill /F /IM *.exe /T

unikum111 11-04-2008 03:28 779297

SamLab, можно перепаковать инсталлятор, убрав запуск после установки (хотя бы отменить умолчание):)
Иначе taskkill.

WindoStroy 13-04-2008 09:36 780490

SamLab, а что вообще за программа. Если это Uninstall Tool, то у меня есть готовый скрипт.

SamLab 15-04-2008 08:42 781618

WindoStroy, STDU Viewer

4sag 15-04-2008 10:15 781661

SamLab, у меня есть готовый скрипт

SamLab 19-04-2008 19:28 784964

4sag, Можешь выложить или выслать на samlab(гав)list.ru

katok888 24-04-2008 15:29 788292

Вышел новый Unpacker 0.23 , поддерживает Inno Setup 5.2.3

katok888 24-04-2008 21:32 788569

Китайский Unpacker 0.23+GUI . Работает нормально, только название скрипт после распаковки на китайском.

12gauge 26-04-2008 10:05 789511

woodyfon,

в секции [Setup] прописать:

DisableStartupPrompt=yes

Котяра 23-05-2008 19:34 809414

Делаю инсталлятор для скринсейвера, так вот вопрос: как добавить экран "Выберите папку для сохранения инсталлятора", меняющий UninstallFilesDir.

Помогите!

katok888 24-05-2008 16:26 809889

Котяра, UninstallFilesDir определяет папку деинсталятора.

Котяра 24-05-2008 19:30 809971

Цитата:

Цитата katok888
Котяра, UninstallFilesDir определяет папку деинсталятора. »

Мне нужно именно это. Просто опечатался :)

zombie2003 03-06-2008 18:13 817546

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

Grabber2006 03-06-2008 18:56 817575

Я бы сделал так:
1. Ставим драйвер/сервис
2. Распаковываем вторую часть инсталлера в %TEMP%
3. Добавляем ключ для запуска в HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce
4. Перезагружаем

Serega 03-06-2008 23:44 817808

Здравствуйте, хочу предложить Inno Setup Unpacker Explorer 1.0 русская версия скачать с iBox
а также очень полезная утилита Regshot 2.0 unicode Автор: Белогорохов Юрий Павлович сайт в отличие от общераспространенного regshot 1.8.2, эта утилита сохраняет изменения сделанные при установке программ прямо в виде *.reg и *.inf файлов!!!
читать дальше »
Цитата:

Утилита умеет делать снимки реестра. Снимки может сохранять в файл, чтобы в последствие снятый снимок можно было загрузить снова. Так же может сравнивать два снимка с формированием отчёта по изменениям содержимого реестра. Отчёт формируется только в HTML формате для придания ему большей читабельности. Кроме отчёта в процессе сравнения формируются два файла (UNDO.reg и REDO.reg) в формате REGEDIT5 для приведения реестра в состояние соответствующее снимку 1 и снимку 2 соответственно. Руками уже ничего править не нужно, в файлах уже всё записано, какие новые параметры и разделы удалить, и какие изменённые и удалённые параметры восстановить. Кроме этого можно включить по желанию генерацию INF-файлов, содержащих информацию об изменениях реестра.

Котяра 04-06-2008 00:50 817896

Цитата:

Цитата Grabber2006
Распаковываем вторую часть инсталлера »

А как сделать вторую часть?
Как автономный инсталлер, сделанный Inno Setup?

Grabber2006 04-06-2008 01:07 817905

Котяра, zombie2003,

К сожалению, я с такой задачей не сталкивался. Обычно я сетапы делаю NSIS.
Попробуйте отследить действия инсталляторов Alcohol и Daemon Tools (с помощью FileMon, RegMon, Advanced Registry Tracer).

Скорее всего, будет достаточно легко определить алгоритм их работы. Вторая часть должна повторно проверять права пользователя, наличие драйвера/сервиса, обеспечивать корректную деинсталяцию всего этого добра при отмене установки на этом этапе и т.д. и т.п.

prodist 07-06-2008 22:49 821177

Можно ли в Inno Setup сделать так, чтобы при установке файлы копировались из папки, лежащей вместе с инсталлятором). Т.е. не запаковывались ни в архив (с сжатием или без), ни в отдельный bin-файл. Например, setup.exe копирует папки и файлы из папки) Setup, в которую можно зайти и без установки запустить приложение.

boss911 07-06-2008 23:33 821199

Цитата:

Цитата prodist
чтобы при установке файлы копировались из папки, лежащей вместе с инсталлятором »

Код:

[Files]
Source: {src}\Setup\PROG.exe; DestDir: {app}; Flags: external

{src} - папка, из которой запущен инсталлятор.
external - означает, что файл внешний.

prodist 08-06-2008 00:52 821228

спасибо. сейчас проверим)

все работает. как это я не догадался про external))

Serega 08-06-2008 01:16 821237

Цитата:

Цитата prodist
Можно ли в Inno Setup сделать так, чтобы при установке файлы копировались из папки, лежащей вместе с инсталлятором). Т.е. не запаковывались ни в архив (с сжатием или без), ни в отдельный bin-файл. Например, setup.exe копирует папки и файлы из папки) Setup, в которую можно зайти и без установки запустить приложение.

Если я правильно понял - рядом с инсталятором должна находится папка например data в которой размещены файлы, которые нужно копировать в папку устанавки прграммы, тогда:
Код:

[Files]
Source: "{src}\data\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs external


boss911 08-06-2008 01:45 821250

Цитата:

Цитата Serega_
Если я правильно понял »

Да, вы правильно поняли, но вы практически повторили мой ответ.

Serega 08-06-2008 08:09 821279

Цитата:

Цитата boss911
Да, вы правильно поняли, но вы практически повторили мой ответ.

Извиняюсь за неопытность, просто не обновлял данную страницу и не видел, что решение проблемы уже есть... а как удалить сообщение - не знаю. В следующий раз буду повнимательней...sorry...

qwer81 08-06-2008 11:52 821341

Как поставить папку на пароль?

Котяра 08-06-2008 18:23 821577

Цитата:

Цитата qwer81
Как поставить папку на пароль? »

Причем тут Inno Setup? Пароль на инсталляцию?

MAY8 16-06-2008 20:15 827516

Вопрос к специалистам.
Решил перепаковать кодеки Combined Community Codec Pack с целью заменить плеер на русскую версию.
При компиляции ругается: Required function or procedure "HaaliRendererRegister" not found

Код:

Source: "{app}\Filters\Haali\dxr.dll"; DestDir: "{app}\Filters\Haali"; Components: "HaaliSplitter"; AfterInstall: "HaaliRendererRegister"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Что делаю не так ?

boss911 16-06-2008 20:56 827548

Цитата:

Цитата MAY8
Required function or procedure "HaaliRendererRegister" not found »

Видимо дело в том, что когда распаковался инсталлятор и его скрипт, то в нем потерялась секция 'Code' (код в Паскале). Вот в этом коде и была написана процедура "HaaliRendererRegister". Что было написано в секции 'Code', можно только догадываться.

Сдается мне, что это банальная регистрация библиотеки (компонента), тогда зачем надо было писать для этого код, когда достаточно добавить флаг 'regserver', хотя, я могу ошибаться, а код может выполнять и другие дополнительные функции. Попробуйте заместь:
Код:

Source: "{app}\Filters\Haali\dxr.dll"; DestDir: "{app}\Filters\Haali"; Components: "HaaliSplitter"; AfterInstall: "HaaliRendererRegister"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
заменить на:
Код:

Source: "{app}\Filters\Haali\dxr.dll"; DestDir: "{app}\Filters\Haali"; Components: "HaaliSplitter"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion regserver

ChVL 20-06-2008 15:22 831081

Есть ли у Inno возможность работать с процессом, находящимся в RAM?
Конкретнее: запущена программа, её процесс находится в RAM системы. Может ли Inno обратиться к нему и там сделать правки с помощью, например, секции [code]? Надо что-то аналогичное BOOL WriteProcessMemory.

Serega 22-06-2008 15:17 832314

Уважаемые модераторы, предлагаю в шапке темы разместить следующие ссылки:
Обложка для Inno Setup с проверкой системных требований - Corona Skin & Check System Requirements, Домашняя страница, Скриншот, Скачать обложку для Inno Setup
описание:
Кроме визуального стиля Corona(WMP9) в инсталлятор по выбору пользователя добавляется:
Проверка системы/минимальных требований. Подсчёт времени установки. Вывод даты сборки. Защита от многократного запуска. Деинсталляция программы перед установкой. Удаление оставшихся после деинсталляции файлов. Автонастройка процесса сборки. Шифрование. Поддержка файлов пользователя. Подсчёт объёма папок. Разные действия при левом/правом щелчке мыши. Запуск настроек системы клавишами F1-F12. Объём и кол-во скопированных файлов на прогрессбаре. Экран справки/скриншотов. Слайдшоу, SCR, BMP или AVI-файл в фоновом окне. Проигрывание музыки в фоне и многое другое...
К инсталлятору добавляется всего 35 Кб (~313 Кб со всеми необязательными файлами), для компиляции скрипта требуется Inno Setup Preprocessor.

Inno Setup на практике, скачать

Inno Setup Unpacker Explorer 1.0 русская версия (перевод), скачать

Если требуется узнать, какие ключи в реестр вносит та или иная программа, то понадобится Regshot 2.0 unicode - домашняя страница,
описание:
Утилита умеет делать снимки реестра. Снимки может сохранять в файл, чтобы в последствие снятый снимок можно было загрузить снова. Так же может сравнивать два снимка с формированием отчёта по изменениям содержимого реестра. Отчёт формируется только в HTML формате для придания ему большей читабельности. Кроме отчёта в процессе сравнения формируются два файла (UNDO.reg и REDO.reg) в формате REGEDIT5 для приведения реестра в состояние соответствующее снимку 1 и снимку 2 соответственно. Руками уже ничего править не нужно, в файлах уже всё записано, какие новые параметры и разделы удалить, и какие изменённые и удалённые параметры восстановить. Кроме этого можно включить по желанию генерацию INF-файлов, содержащих информацию об изменениях реестра.

Если необходимо использовать метод проверки внешнего файла через сумму MD5 для запуска инсталлятора, то понадобится калькулятор хеша MD5, калькулятор сумм MD5, SHA-256, CRC32.

boss911 22-06-2008 17:32 832386

Serega_

Уж больно она будет похожа на шапку из ru-board, текст то оттуда.

Serega 22-06-2008 19:01 832457

boss911, извини, а причём тут похожесть или схожесть? Да, некоторые ссылки оттуда, но если это кому-то поможет, то почему бы и нет? Ведь тема называется Inno Setup .:[все вопросы]? Скажу честно, я об Inno Setup узнал только с этого форума, заинтересовался... Прочитав "Русская справка" к Inno Setup и "Примеры скриптов на паскале" начало кое-что получаться... нашёл где-то в интернете "Inno Setup на практике", тоже интересная вещь. Ведь не все сразу рождаются программистами, у меня допустим это - хобби. Я предложил, а добавлять или нет, решать Вам...

boss911 22-06-2008 19:42 832484

Цитата:

Цитата Serega_
извини, а причём тут похожесть или схожесть? »

А то, что получается под копирку, имхо.

alex_84 17-07-2008 13:30 853975

а каким образом сделать дополнение к программе с помощью него? Например чтобы он определил, что программа установлена и если установлена то куда? Чтоб самому путь не прописывать. (на примере патчей для Сталкера)

МИШАНЧИК 03-08-2008 12:50 866870

Подскажите пожалуйста!
Как сделать, чтоб внизу инсталятора была "бледная" надпись Copyright © 2008?
Я добавляю в [Setup]
WindowVisible=yes
AppCopyright=Copyright © 2008 - но надписи нет. В чём ошибка?

jameszero 03-08-2008 15:02 866948

МИШАНЧИК

Код:

[Messages]
BeveledLabel=Copyright © 2008


МИШАНЧИК 04-08-2008 08:29 867315

jameszero,
Большое Человеческое спасибо!

МИШАНЧИК 06-08-2008 14:38 869444

Подскажите пожалуйста!
Не получается назначить принудительно каталог установки: C:\Program Files\Total Commander\Utils\ХХХХ.
Прописываю:
[Setup]
DefaultDirName={pf}\Total Commander\Utils\ХХХХ
А получается:C:\Program Files\ХХХХ
Как правильно прописать?

Serega 12-08-2008 23:49 874089

Цитата:

Цитата МИШАНЧИК
А получается:C:\Program Files\ХХХХ

не может такого быть - всё у вас правильно написано:
Цитата:

[Setup]
.....
DefaultDirName={pf}\Total Commander\Utils\ХХХХ
.....
- туда и должна ставить. Если всё равно не получается, то напечатайте скрипт.

boss911 13-08-2008 00:55 874116

Цитата:

Цитата МИШАНЧИК
Не получается назначить принудительно каталог установки »

Какой каталог назначения указываете в секции Files? Дайте полный пример скрипта.

МИШАНЧИК 17-08-2008 08:48 876974

boss911,
Выкладываю скрипт.

Serega 17-08-2008 14:17 877124

МИШАНЧИК, видимо вы используете скрипт после распаковки?
1. Сразу, что бросилось в глаза
Цитата:

[Setup]
...........................
DefaultDirName=={pf}\Total Commander\Utils\USB Safely Remove
...........................
один знак "=" надо удалить.
2. Зачем перичислять все файлы, когда можно просто
Цитата:

[Files]
Source: C:\USB Safely Remove\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
т.е создайте папку USB Safely Remove на диске С или укажите свой путь к папке.
... всё вроде освободился, можно продолжить...
Флаги обозначают:
ignoreversion - перемещать существующие файлы не обращая внимание на номера версий;
recursesubdirs - указывает компилятору или инсталлятору также искать файлы с тем же именем/маской в подпапках папки, указанной в параметре Source;
createallsubdirs - создаёт все подпаки.
Если программа у вас уже установлена, тогда пропишите правельный путь до неё. Если хотите, чтоб компилятор исключил какие-то файлы из каталога установленной программы, нужно использовать Excludes
Цитата:

[Files]
Source: C:\USB Safely Remove\*; Excludes: unins000.*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
у себя я исключал unins000.dat и unins000.exe, поэтому и использовал маску unins000.*

boss911 17-08-2008 17:44 877189

МИШАНЧИК
Код:

DefaultDirName=={pf}\Total Commander\Utils\USB Safely Remove
Да, видимо в этом и есть ваша проблема.

МИШАНЧИК 18-08-2008 10:38 877631

Serega_, boss911,
Всем большое спасибо. Да, не доглядел я.

Junos 24-08-2008 10:50 882420

Подскажите как избавится от этого файла?

Serega 24-08-2008 12:18 882448

Junos, из скрипта я не понял, почему ставиться этот ярлык, судя по всему вы дали не полный скрипт. Если он прописывается всё равно, то можно удалить его с помощью cleanup.cmd, т.е. делаете cleanup.cmd в котором прописываете удаление этого ярлыка. В секции Files прописываете копирование cleanup.cmd в папку с приложением с флагом удаления после установки программы, а в секции Run прописываете запуск этого *.cmd. Т.е должно получиться так:
Код:

[Files]
…………………………
Source: J:\cleanup.cmd; DestDir: {app}; Flags: deleteafterinstall
………………………………

[Run]
Filename: {app}\cleanup.cmd; WorkingDir: {app}; Flags: runhidden

deleteafterinstall – указывает инсталлятору устанавливать файл как обычно, но удалять его после завершения (или прервания) установки;
runhidden - программа запустится в скрытом окне.

Junos 24-08-2008 12:28 882456

Serega_,
Цитата:

судя по всему вы дали не полный скрипт.
Я дал полный

Цитата:

ставиться этот ярлык
то не ярлык, а просто файл без разшырения, размером 0 байт

Код:

[Files]
…………………………
Source: J:\ cleanup.cmd; DestDir: {app}; Flags: deleteafterinstall
………………………………

[Run]
Filename: {app}\ cleanup.cmd; WorkingDir: {app}; Flags: runhidden

Спасибо, помогло!

FlatX007 25-08-2008 22:03 883712

Как заставить компилятор выполнить после установки "основной" части - "-дополнительную", которая находиться в тойже папке например :

Setup.exe - "основная" часть - InnoSetup
Setup1.exe (запакованна в 7z + Sfx)- ''дополнительная'' часть1 например её размер 2 гига
Setup2.exe (запакованна в 7z + Sfx)- ''дополнительная'' часть2 например её размер 2 гига

Нужно:
Как решить проблему с путём установки ''дополнительных'' частей 1-2- нужно, что бы путь установился такой же какой я выбрал в начале установки в окне InnoSetup.
После распаковки "дополнительной" части2 вылезло стандартное окно InnoSetup о завершении установки.
При удалении программы (нажимаем на - unis000.exe) "дополнительная" часть удалилась тоже.

И возможно ли при распаковке "дополнительной" части1-2 (запакованна в 7z + Sfx) скрыть окно 7z - а процент распаковки отображался на полосе прогресса InnoSetup....

Вот такая задачка - заранее спасибо!
Если можно скрипт полностью ...

Котяра 25-08-2008 22:17 883728

Цитата:

Цитата FlatX007
И возможно ли при распаковке "дополнительной" части1-2 (запакованна в 7z + Sfx) скрыть окно 7z - а процент распаковки отображался на полосе прогресса InnoSetup.... »

Скрыть окно можно, а отобразить процент в InnoSetup - нет.

Serega 26-08-2008 00:34 883857

Цитата:

Цитата FlatX007
...путём установки ''дополнительных'' частей 1-2- нужно, что бы путь установился такой же какой я выбрал в начале установки в окне InnoSetup.

можно - установить архивы в папку с программой с последующим удалением архивов после распаковки
Цитата:

........................
[Files]
Source: D:\Setup.exe; DestDir: {app}; Flags: ignoreversion
Source: {src}\Setup1.exe; DestDir: {app}; Flags: ignoreversion external deleteafterinstall
Source: {src}\Setup2.exe; DestDir: {app}; Flags: ignoreversion external deleteafterinstall
.........................
[Run]
Filename: {app}\Setup1.exe; WorkingDir: {app}; Parameters: -y; StatusMsg: "Любое сообщение если надо..."; Flags: waituntilterminated skipifdoesntexist
Filename: {app}\Setup2.exe; WorkingDir: {app}; Parameters: -y; StatusMsg: "Любое сообщение если надо..."; Flags: waituntilterminated skipifdoesntexist
external - указывает, что файл внешний;
deleteafterinstall - устанавливать файл как обычно, но удалять его после завершения (или прервания) установки;
waituntilterminated - инсталлятор подождет, пока процесс полностью завершится (хотя он задан по умолчанию);
skipifdoesntexist - инсталлятор не выдаст сообщения об ошибке, если какой нибудь Setup1.exe и Setup2.exe не существует.
Цитата:

Цитата FlatX007
...при распаковке "дополнительной" части1-2 (запакованна в 7z + Sfx) скрыть окно 7z

можно, необходимо в секции [Run] поставить флаг runhidden для запуска в скрытом режиме, но я бы несоветовал. Будет распаковываться два архива по 2 Гига - это займет длительное время и пользователь может подумать о зависании компьютера, и какой шаг будет следующим? Естественно перезагрузка компьютера, при этом я думаю, пользователь будет нелестно отзываться о вашей программе.
Цитата:

Цитата FlatX007
...а процент распаковки отображался на полосе прогресса InnoSetup....

Котяра, правильно сказал - нельзя. Только использование окон распаковки самих 7z архивов.

FlatX007 26-08-2008 23:18 884604

Цитата:

Цитата Serega_
можно - установить архивы в папку с программой с последующим удалением архивов после распаковки »

а просто не удаляя можно ???

boss911 26-08-2008 23:36 884629

Цитата:

Цитата FlatX007
а просто не удаляя можно ??? »

Просто не указывайте флаг (Flags) 'deleteafterinstall'.

FlatX007 27-08-2008 00:18 884647

Вобщем всё работает но то что находиться внутри архива Setup1.exe и Setup2.exe остается после удаления программы ...
Как можно сделать что бы это всё удалялась вместе с программой ???

boss911 27-08-2008 00:46 884666

Цитата:

Цитата FlatX007
что бы это всё удалялась вместе с программой ??? »

Добавить в скрипт -
Код:

[UninstallDelete]
Name: {app}\*; Type: files


icestranger 31-08-2008 10:24 887630

Здраствуйте, а какой ключ вписать чтобы он комп не перезагружал?

Serega 31-08-2008 14:31 887780

Цитата:

Цитата icestranger
Здраствуйте, а какой ключ вписать чтобы он комп не перезагружал?

Я не совсем понял ваш вопрос. Если вас интересует с каким ключом запустить инсталлятор из командной строки, чтоб он не перезагружал компьютер, то используйте /NORESTART - указывает инсталлятору не перезагружать систему, даже если это необходимо.
Если в самом скрипте, то просто не используйте в секции [Files] флаг - restartreplace.

FlatX007 31-08-2008 16:08 887835

Цитата:

Цитата Serega_
[Files]
Source: D:\Setup.exe; DestDir: {app}; Flags: ignoreversion
Source: {src}\Setup1.exe; DestDir: {app}; Flags: ignoreversion external deleteafterinstall
Source: {src}\Setup2.exe; DestDir: {app}; Flags: ignoreversion external deleteafterinstall
.........................
[Run]
Filename: {app}\Setup1.exe; WorkingDir: {app}; Parameters: -y; StatusMsg: "Любое сообщение если надо..."; Flags: waituntilterminated skipifdoesntexist
Filename: {app}\Setup2.exe; WorkingDir: {app}; Parameters: -y; StatusMsg: "Любое сообщение если надо..."; Flags: waituntilterminated skipifdoesntexist »


а если к примеру все архивы неуместились на один диск DVD (4.7)
если Setup1.exe распакуется, а Setup2.exe находиться на другом диске - запрос будет, что бы вставить другой диск ??? если нет то как это зделать ?

И немного тупой вопрос - как сменить картинку в окне инсталятора, и поставить задним планом (на весь размер экрана) любую свою картинку.

Тока с объяснениями... :help:

Serega 31-08-2008 17:22 887866

Цитата:

Цитата FlatX007
...архивы неуместились на один диск DVD (4.7)...

Ни разу не делал, но как записано в руководстве от Kindly:
Код:

[Setup]
;Разбиение на диски
DiskSpanning=yes
;Размер тома в байтах (здесь 695 мегабайт)
DiskSliceSize=730000000

т.е. если высчитать пропорцией на 4,7Гига, то получиться (4936690647), думаю надо округлить DiskSliceSize=4940000000
Цитата:

Цитата FlatX007
...- запрос будет, что бы вставить другой диск ??? ...

да
Цитата:

Цитата FlatX007
...как сменить картинку в окне инсталятора, и поставить задним планом (на весь размер экрана) любую свою картинку..

смена картинки
читать дальше »
Код:

[Setup]
WizardImageFile=путь до большой картинки\1.bmp
WizardSmallImageFile=путь до маленькой картинки\2.bmp

вставка фонового изображения
Цитата:

[Setup]
WindowVisible=yes
;и по желанию
WindowResizable=no

[Files]
Source: "C:\My_Image.bmp"; DestDir: "{tmp}"; Flags: dontcopy

[code]
procedure InitializeWizard();
var
BackgroundBitmapImage: TBitmapImage;
s:string;
begin
ExtractTemporaryFile('My_Image.bmp'); //My_Image.bmp - указываемое изображение в секции [Files]
s:=ExpandConstant('{tmp}')+'\My_Image.bmp';
BackgroundBitmapImage := TBitmapImage.Create(MainForm);
BackgroundBitmapImage.Bitmap.LoadFromFile(s);
BackgroundBitmapImage.Align := alClient;
BackgroundBitmapImage.Parent := MainForm;
BackgroundBitmapImage.Stretch:=True;
end;
WindowVisible - позади окна мастера будет отображаться фоновое окно;
WindowResizable - при значении no пользователю не придется менять размеры фонового окна инсталлятора когда оно развернуто.

FlatX007 31-08-2008 22:19 888042

Чем распаковать и запаковать " *.bin - Inno Setup " от игры Сталкер ???

Проги: uni.extractor и Ultra ISO не предлагать !!!!

HUGO75 01-09-2008 02:12 888149

boss911 у вас получилось решить эту проблему?
Цитата:

Цитата boss911
как добитса того, чтоб инсталятор дожидался остановки батника, флаг waituntilidle непомогает »


boss911 01-09-2008 03:14 888157

Цитата:

Цитата HUGO75
у вас получилось решить эту проблему? »

Код:

Flags: waituntilterminated

HUGO75 01-09-2008 06:11 888169

boss911 спасибо, заработало ).

icestranger 01-09-2008 21:59 888821

Цитата:

Цитата Serega_
Если вас интересует с каким ключом запустить инсталлятор из командной строки, чтоб он не перезагружал компьютер, то используйте /NORESTART - указывает инсталлятору не перезагружать систему, даже если это необходимо. »

Вот это надо было мне, Спасибо

boss911 01-09-2008 23:17 888874

Цитата:

Цитата icestranger
Вот это надо было мне »

Все ключи для автоматической установки инсталляторов, сделанных с помощью InnoSetup, я выкладывал в посте #33.

zombie2003 02-09-2008 16:01 889337

Доброго времени суток.
Подскажите пожалуйста, может ли инсталлятор удалить сам себя?
Вот что я имею ввиду:
Есть инсталляционный пакет, он запускается 1 раз (из реестра, RunOnce) и после того как он отработает, желательно чтобы этого пакета не стало на жестком диске. Сможет ли сам инсталлятор сделать это или придется прибегать к помощи чего-то извне?
спасибо.

boss911 02-09-2008 20:49 889539

Цитата:

Цитата zombie2003
Подскажите пожалуйста, может ли инсталлятор удалить сам себя? »

Попробуйте это:
Код:

[Run]
Filename: {cmd}; Parameters: "/Q /C Ping 127.0.0.1 && Del /S /Q ""{srcexe}"""; Flags: postinstall nowait runhidden; Description: Удалить дистрибутив по окончании установки?

Но есть закавыка, дабы удаление не производилось во время запущенного инсталлятора, пришлось вынести на страницу завершения чекбокс с выбором вопроса удаления. Но, можно отключить эту страницу завершения ->
Код:

[Setup]
DisableFinishedPage=true


mariolast 03-09-2008 12:46 890006

Как добавить в скрипте в раздел [Registry] значение типа binary равное (пишу как в экспорте из реестра)

"SlowInfoCache"=hex:28,02,00,00,01,00,00,00,00,40,85,00,00,00,00,00,20,73,4d,\
c7,b7,0c,c9,01,05,00,00,00,43,00,3a,00,5c,00,49,00,6e,00,66,00,6f,00,74,00,\
65,00,63,00,5f,00,4c,00,74,00,64,00,5c,00,1f,04,1a,04,5f,00,11,04,1f,04,5c,\
00,42,00,6c,00,61,00,6e,00,6b,00,69,00,5f,00,50,00,53,00,2e,00,65,00,78,00,\
65,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00

А то в скрипте оно не влазит, что то не нашел как разделить его.

zombie2003 03-09-2008 14:46 890102

к сожалению отключить страницу завершения не могу(в смысле нужно чтобы она была).
я пишу в секции [ Code ] следующую строчку:
Код:

Exec(ExpandConstant('{cmd}'), '/Q /C Ping 127.0.0.1 && Del /S /Q ""{srcexe}"" && Pause', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
вот только в паскале я не силен(совсем не силен) и не могу сделать так чтобы cmd получил правильный путь и имя файла инсталятора.
я пытался туда прикрутить как-то ExpandConstant, но ничего у меня не вышло...

zombie2003 03-09-2008 15:20 890127

по предыдущему своему посту хочу сказать, что путь мне передать удалось(слепил как смог).
в переменной соединил все параметры в кучу, а потом в Exec передал эту переменную.
но чего я не учел, так это того что в этот момент файл инсталятора еще занят и не может быть уделан... :(

HUGO75 03-09-2008 16:39 890177

Подскажите пожалйста. Есть компонент Oracle в инсталяторе. Сам дистрибутив оракла находиться на сервере. Инсталятор должен запускать
Код:

[Run]
Filename: \\server\Oracle\Disk1\setup.exe; Parameters: -responseFile {tmp}\clientruntime_c.rsp -nowelcome; Components: mal\ora; Tasks: c; Flags: waituntilterminated runhidden

, но при таком раскладе как только запускается Оракл, то сразу завершаеться работа инсталятора. В дальнейшем будет добавлен параметр -silent. Как можно добиться чтоб инсталятор завершал работу после установки Оракла?

boss911 03-09-2008 17:32 890227

Цитата:

Цитата zombie2003
но чего я не учел, так это того что в этот момент файл инсталятора еще занят и не может быть уделан... »

О чем я и говорил:
Цитата:

Цитата boss911
дабы удаление не производилось во время запущенного инсталлятора, пришлось вынести на страницу завершения чекбокс с выбором вопроса удаления. »

Иначе вопрос можно было бы и не выносить на страницу завершения, то есть, убрать флаг postinstall.

С Паскалем я не дружу, но точно знаю, что вам нужно создать процедуру, которая бы выполнялась во время закрытия инсталлятора. Вот почему я использовал флаг postinstall.



Цитата:

Цитата HUGO75
но при таком раскладе как только запускается Оракл, то сразу завершаеться работа инсталятора. »

По сути, инсталлятор должен был дождаться остановки процесса setup.exe (флаг waituntilterminated). В момент установки Оракла процесс setup.exe запущен, есть в процессах?

HUGO75 03-09-2008 17:45 890234

Цитата:

Цитата boss911
В момент установки Оракла процесс setup.exe запущен, есть в процессах? »

да, setup.exe есть в процессах, а инсталятор стоит с кнопкой "завершить". Хотя окно установки Оракла еще не появилось, и если нажать кнопку "завершить", то сразу удаляеться файл {tmp}\clientruntime_c.rsp и начинаеться обычная установка Оракла. Насколько я понимаю...инсталятор просто вызвал \\server\Oracle\Disk1\setup.exe и посчитал, что на этом работа закончена ;).

boss911 03-09-2008 18:19 890262

Цитата:

Цитата HUGO75
инсталятор просто вызвал \\server\Oracle\Disk1\setup.exe и посчитал, что на этом работа закончена »

Не знаю, у меня все работает, к примеру:
Код:

[Run]
Filename: {app}\run.exe; Flags: waituntilterminated

Инсталлятор запускает приложение, ждет его остановки, после остановки переходит на страницу завершения (кнопка "завершить").

HUGO75 03-09-2008 20:38 890333

Цитата:

Цитата boss911
[Run]
Filename: {app}\run.exe; Flags: waituntilterminated »

это конечно будет работать потому, что run.exe находить внутри инсталятора. В моем случае командой вызываеться внешний интсалятор setup.exe. Наверно с этим и связано, что инсталятор не дожидаеться его завершения.

boss911 03-09-2008 23:04 890401

Цитата:

Цитата HUGO75
это конечно будет работать потому, что run.exe находить внутри инсталятора. »

Ну, это вы конечно и придумали. :)
Код:

[Run]
Filename: {sys}\calc.exe; Flags: waituntilterminated

Аналогично - все работает (дожидается остановки).

Решил проверить, запустил сторонний инсталлятор на шаре -
Код:

[Run]
Filename: \\Comp\PROGram\Setup.exe; Flags: waituntilterminated

Также все срабатывает, как и в первом варианте. Вы кстати это тоже можете проверить, только, запускайте установщик другого дистрибутива, ради эксперимента. Видимо тут проблема в установщике Оракла.

HUGO75 03-09-2008 23:46 890437

Цитата:

Цитата boss911
Ну, это вы конечно и придумали. »

ну я имел ввиду "локально". а вот на счет стороннего инсталлятора из шары я не подумал что то :). Завтра буду на работе, опять попробую. Спасибо за подсказку.

HUGO75 04-09-2008 19:46 891094

ПопробЫвал, действительно установщик дожидаеться установки других приложений запущенных из шар, даже без
Код:

Flags: waituntilterminated
А вот установки оракла дожидаться ни как не хочет :(.

HUGO75 04-09-2008 22:08 891216

вроде разобрался. setup.exe от Oracle передаёт параметры установки файлу javaw.exe и закрывается. Поэтому и завершается работа установщика. Можно тогда сделать так, чтоб установщик отследил когда завершится процесс javaw.exe и после этого уже завершил работу инсталятора? Или...Как запустить установку клиента оракла не через запуск Setup.exe, а через запуск javaw.exe?

boss911 04-09-2008 22:27 891239

Цитата:

Цитата HUGO75
даже без »

Правильно. Но если у меня стоит задача, чтобы инсталлятор дожидался остановки, то флаг waituntilterminated использую как бы для перестраховки.

Цитата:

Цитата HUGO75
установки оракла дожидаться ни как не хочет »

Вы мне отвечали:
Цитата:

Цитата HUGO75
да, setup.exe есть в процессах, а инсталятор стоит с кнопкой »

Видимо установщик Оракла (setup.exe) перезагружается в момент его запуска или идет передача к другому процессу, возможно это происходит из-за его запуска с ключами командной строки, поробуйте запуск делать без них.

HUGO75 04-09-2008 22:40 891247

Цитата:

Цитата boss911
Вы мне отвечали:
Цитата HUGO75:да, setup.exe есть в процессах, а инсталятор стоит с кнопкой » »

Я ошибся, извиняюсь. Я видел что запускаеться setup.exe и успокаивался, закрывал диспетчер задач. Оказывается он запускался на несколько секунд, передавал параметры javaw.exe и закрывался.
Цитата:

Цитата boss911
Попробуйте сделать все то же самое, только без запуска с ключами командной строки: »

Пробывал, тоже самое. Запускается setup.exe и видимо передает файлу javaw.exe запуск без параметров, после чего опять закрывается.

boss911 04-09-2008 23:16 891262

Цитата:

Цитата HUGO75
передавал параметры javaw.exe и закрывался. »

Стандартной функции слежения за процессами в IS нет, возможно, программисты на Паскале что-то и смогут придумать (код), но я от этого далек.

Можно попросить знатоков AutoIt, чтобы написали скрипт, который при запуске, будет передавать все ключи командной строки установщику Оракла (файл setup.exe), после чего, скрипт отлавливает на протяжении 10 секунд процесс javaw.exe, если такой процесс находится, то скрипт ждет его остановки. Пока скрипт ждет остановки процесса javaw.exe, инсталлятор ждет, когда остановится работа скрипта. Думаю, суть вы уловили.

HUGO75 05-09-2008 00:10 891294

ну вроде сделал в AutoIt
Код:

ProcessWaitClose("setup.exe")
ProcessWaitClose("javaw.exe")

чтоб не передавать параметры setup.exe. Просто боюсь, что потом не найду файл ответов, т.к. он {tmp}\clientruntime_c.rsp. Конечно с кодом на Паскале было б лучше...но и так работает :). ОГРОМНОЕ спасибо за помощь!

zombie2003 06-09-2008 19:32 892507

Подскажите, пожалуйста, может ли Inno останавливать службы?
Если да, то как?

boss911 06-09-2008 19:51 892521

Цитата:

Цитата zombie2003
может ли Inno останавливать службы? »

Остановить можно из командной строки:
Код:

net stop <имя_службы>

zombie2003 06-09-2008 23:36 892694

Цитата:

Цитата boss911
net stop <имя_службы> »

Спасибо, буду знать.
Хотя я немного поторопился с вопросом. :)
Утилита, которая удаляет службу сама ее и стопает. Тем не менее, спасибо еще раз. В будущем пригодится.

zombie2003 11-09-2008 12:52 896313

Подскажите, может ли Inno писать что-либо в файл?
В смысле есть текстовый файл, в нем есть строчка, в которой указывается путь. Путь должен изменяться в зависимости от того куда установлено ПО. Это возможно сделать только средствами Inno? Спасибо.

boss911 11-09-2008 17:23 896530

Цитата:

Цитата zombie2003
может ли Inno писать что-либо в файл? »

Во пример работы с INI файлом:
Код:

[INI]
Filename: {userappdata}\MyProg\MyFile.ini; Section: MySection; Key: MyLanguageFile; String: {app}\MyProg\Rus.lng


FlatX007 15-09-2008 17:36 900005

Вобщем например Есть игра со сделанным к ней модом v1.0 (всё это добро ставиться за обин раз инсталлятором)

В последующим к этой игре будет сделан ещё один мод v1.1 ... КАК сделать что бы установщик этого мода сам нащел ИМЕННО ЭТУ версию игры, без ввода пути установки?

И вот ещё как сделать верификацию папки установки - на предмет нахождения в ней файлов которые должны быть обязательно (проверка по имени, размеру)?

AlexNeo 16-09-2008 13:49 900672

Решил перепаковать Paint.Net в Inno Setup но не импортируются параметры реестра, не добавляется пункт в “Открыть с помощью”, если импортировать вручную то в “Открыть с помощью” всё появляется.

Скрипт :
читать дальше »
[Setup]
AppName=Paint.NET
AppVerName=Paint.NET 3.36
AppPublisherURL=http://www.getpaint.net/
AppSupportURL=http://www.getpaint.net/
AppUpdatesURL=http://www.getpaint.net/
DefaultDirName={pf}\Paint.NET
DefaultGroupName=Paint.NET
LicenseFile=.\Files\License.txt
OutputDir=.\
OutputBaseFilename=Setup
Compression=lzma/ultra
SolidCompression=true
InternalCompressLevel=ultra
CompressionThreads=2
VersionInfoVersion=3.36.0.0
VersionInfoTextVersion=3.36.0.0
AppVersion=3.36
UsePreviousAppDir=false
UsePreviousGroup=false
UninstallDisplayName=Paint.NET 3.36
VersionInfoDescription=Image and photo editing software written in C#.
VersionInfoCompany=dotPDN LLC
AppPublisher=dotPDN LLC
VersionInfoCopyright=Copyright © 2008 dotPDN LLC, Rick Brewster, Tom Jackson, and past contributors. Portions Copyright © Microsoft Corporation. All Rights Reserved.
AppCopyright=Copyright © 2008 dotPDN LLC, Rick Brewster, Tom Jackson, and past contributors. Portions Copyright © Microsoft Corporation. All Rights Reserved.

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: .\Files\PaintDotNet.exe; DestDir: {app}; Flags: ignoreversion
Source: .\Files\ICSharpCode.SharpZipLib.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\Interop.WIA.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\License.txt; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Base.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Core.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Data.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Effects.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.exe.config; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Resources.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Strings.3.DE.resources; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Strings.3.ES.resources; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Strings.3.FR.resources; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Strings.3.it.resources; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Strings.3.JA.resources; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Strings.3.KO.resources; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Strings.3.PT-BR.resources; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Strings.3.resources; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Strings.3.RU.resources; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.Strings.3.ZH-CN.resources; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.StylusReader.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PaintDotNet.SystemLayer.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PdnRepair.exe; DestDir: {app}; Flags: ignoreversion
Source: .\Files\PdnRepair.exe.config; DestDir: {app}; Flags: ignoreversion
Source: .\Files\SetupNgen.exe; DestDir: {app}; Flags: ignoreversion
Source: .\Files\SetupNgen.exe.config; DestDir: {app}; Flags: ignoreversion
Source: .\Files\ShellExtension_x64.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\ShellExtension_x86.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\Squish_x64.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\Squish_x86.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\Squish_x86_SSE2.dll; DestDir: {app}; Flags: ignoreversion
Source: .\Files\UpdateMonitor.exe; DestDir: {app}; Flags: ignoreversion
Source: .\Files\UpdateMonitor.exe.config; DestDir: {app}; Flags: ignoreversion
Source: .\Files\WiaProxy32.exe; DestDir: {app}; Flags: ignoreversion
Source: .\Files\WiaProxy32.exe.config; DestDir: {app}; Flags: ignoreversion
Source: .\Files\FileTypes\*; DestDir: {app}\FileTypes; Flags: ignoreversion recursesubdirs createallsubdirs
Source: .\Files\Resources\*; DestDir: {app}\Resources; Flags: ignoreversion recursesubdirs createallsubdirs
Source: .\System32\wiaaut.dll; DestDir: {sys}; Flags: ignoreversion

[Dirs]
Name: {app}\Effects

[Icons]
Name: {group}\Paint.NET; Filename: {app}\PaintDotNet.exe; WorkingDir: {app}; IconFilename: {app}\PaintDotNet.exe; IconIndex: 0
Name: {group}\{cm:UninstallProgram,Paint.NET}; Filename: {uninstallexe}; WorkingDir: {app}
Name: {commondesktop}\Paint.NET; Filename: {app}\PaintDotNet.exe; Tasks: desktopicon; WorkingDir: {app}; IconFilename: {app}\PaintDotNet.exe; IconIndex: 0
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\Paint.NET; Filename: {app}\PaintDotNet.exe; Tasks: quicklaunchicon; WorkingDir: {app}; IconFilename: {app}\PaintDotNet.exe; IconIndex: 0

[Run]
Filename: {app}\PaintDotNet.exe; Description: {cm:LaunchProgram,Paint.NET}; Flags: nowait postinstall skipifsilent; WorkingDir: {app}

[Registry]
Root: HKLM; SubKey: SOFTWARE\Classes\.bmp\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.jpe\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.jpeg\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.jpg\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.png\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; Flags: uninsdeletevalue
Root: HKCR; SubKey: CLSID\{{D292F82A-50BE-4351-96CC-E86F3F8049DA}; ValueType: string; ValueData: Paint.NET Shell Extension; Flags: uninsdeletekey
Root: HKCR; SubKey: CLSID\{{D292F82A-50BE-4351-96CC-E86F3F8049DA}\InProcServer32; ValueType: string; ValueName: ThreadingModel; ValueData: Apartment; Flags: uninsdeletekey
Root: HKCR; SubKey: CLSID\{{D292F82A-50BE-4351-96CC-E86F3F8049DA}\InProcServer32; ValueType: string; ValueData: {app}\ShellExtension_x86.dll; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\jpegfile\shell\edit\command; ValueType: string; ValueData: "\""{app}\PaintDotNet.exe\"" \""%1\"""; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.Picture\shell\edit\command; ValueType: string; ValueData: "\""{app}\PaintDotNet.exe\"" \""%1\"""; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\pngfile\shell\edit\command; ValueType: string; ValueData: "\""{app}\PaintDotNet.exe\"" \""%1\"""; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.pdn; ValueType: string; ValueData: Paint.NET.1; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\.pdn; ValueType: string; ValueName: PerceivedType; ValueData: Image; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\.pdn\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\.pdn\ShellEx\{{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}; ValueType: string; ValueData: {{D292F82A-50BE-4351-96CC-E86F3F8049DA}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\.tga; ValueType: string; ValueName: Content Type; ValueData: image/targa; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.tga; ValueType: string; ValueName: PerceivedType; ValueData: Image; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.tga; ValueType: string; ValueData: Paint.NET.1; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.tga\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.1; ValueType: string; ValueData: Paint.NET Image; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.1\shell\edit\command; ValueType: string; ValueName: ; ValueData: "\""{app}\PaintDotNet.exe\"" \""%1\"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.1\shell\open\command; ValueType: string; ValueName: ; ValueData: "\""{app}\PaintDotNet.exe\"" \""%1\"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.1\shell\print\command; ValueType: string; ValueName: ; ValueData: "\""{app}\PaintDotNet.exe\"" \""print:%1\"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.ThumbExtract\CLSID; ValueType: string; ValueName: ; ValueData: {{D292F82A-50BE-4351-96CC-E86F3F8049DA}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.ThumbExtract\CurVer; ValueType: string; ValueName: ; ValueData: Paint.NET.ThumbExtract.1; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.ThumbExtract.1\CLSID; ValueType: string; ValueName: ; ValueData: {{D292F82A-50BE-4351-96CC-E86F3F8049DA}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDlls; ValueType: dword; ValueName: {sys}\wiaaut.dll; ValueData: $00000002; Flags: uninsdeletevalue
Root: HKCR; SubKey: Applications\PaintDotNet.exe\shell\open\command; ValueType: string; ValueData: "\""{app}\PaintDotNet.exe\"" \""%1\"""; Flags: uninsdeletevalue
Root: HKCU; SubKey: Software\Classes\Applications\PaintDotNet.exe\shell\open\command; ValueType: string; ValueData: "\""{app}\PaintDotNet.exe\"" \""%1\"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\PaintDotNet.exe; ValueType: string; ValueData: {app}\PaintDotNet.exe; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\PaintDotNet.exe; ValueType: string; ValueName: Path; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\CLSID\{{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}; ValueType: string; ValueData: VideoPreview Class; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\CLSID\{{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\InprocServer32; ValueType: string; ValueName: ; ValueData: {sys}\wiaaut.dll; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\CLSID\{{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\InprocServer32; ValueType: string; ValueName: ThreadingModel; ValueData: Apartment; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\CLSID\{{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\MiscStatus; ValueType: string; ValueName: ; ValueData: 0; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\CLSID\{{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\MiscStatus\1; ValueType: string; ValueName: ; ValueData: 131473; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\CLSID\{{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\ProgID; ValueType: string; ValueName: ; ValueData: WIA.VideoPreview.1; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\CLSID\{{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\ToolboxBitmap32; ValueType: string; ValueName: ; ValueData: {sys}\wiaaut.dll, 101; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\CLSID\{{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\TypeLib; ValueType: string; ValueName: ; ValueData: {{94A0E92D-43C0-494E-AC29-FD45948A5221}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\CLSID\{{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\Version; ValueType: string; ValueName: ; ValueData: 1.0; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\CLSID\{{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\VersionIndependentProgID; ValueType: string; ValueName: ; ValueData: WIA.VideoPreview; Flags: uninsdeletekey


Рег Файл:
читать дальше »
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.bmp\OpenWithProgids]
"Paint.NET.1"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.jpe\OpenWithProgids]
"Paint.NET.1"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.jpeg\OpenWithProgids]
"Paint.NET.1"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.jpg\OpenWithProgids]
"Paint.NET.1"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.png\OpenWithProgids]
"Paint.NET.1"=""

[HKEY_CLASSES_ROOT\CLSID\{D292F82A-50BE-4351-96CC-E86F3F8049DA}]
@="Paint.NET Shell Extension"

[HKEY_CLASSES_ROOT\CLSID\{D292F82A-50BE-4351-96CC-E86F3F8049DA}\InProcServer32]
"ThreadingModel"="Apartment"
@="C:\\Program Files\\Paint.NET\\ShellExtension_x86.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\jpegfile\shell\edit\command]
@="\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Paint.Picture\shell\edit\command]
@="\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pngfile\shell\edit\command]
@="\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.pdn]
@="Paint.NET.1"
"PerceivedType"="Image"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.pdn\OpenWithProgids]
"Paint.NET.1"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.pdn\ShellEx\{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}]
@="{D292F82A-50BE-4351-96CC-E86F3F8049DA}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.tga]
"Content Type"="image/targa"
"PerceivedType"="Image"
@="Paint.NET.1"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.tga\OpenWithProgids]
"Paint.NET.1"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Paint.NET.1]
@="Paint.NET Image"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Paint.NET.1\shell\edit\command]
@="\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Paint.NET.1\shell\open\command]
@="\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Paint.NET.1\shell\print\command]
@="\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"print:%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Paint.NET.ThumbExtract\CLSID]
@="{D292F82A-50BE-4351-96CC-E86F3F8049DA}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Paint.NET.ThumbExtract\CurVer]
@="Paint.NET.ThumbExtract.1"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Paint.NET.ThumbExtract.1\CLSID]
@="{D292F82A-50BE-4351-96CC-E86F3F8049DA}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDlls]
"C:\\WINDOWS\\system32\\wiaaut.dll"=dword:00000002

[HKEY_CLASSES_ROOT\Applications\PaintDotNet.exe\shell\open\command]
@="\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"%1\""

[HKEY_CURRENT_USER\Software\Classes\Applications\PaintDotNet.exe\shell\open\command]
@="\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\PaintDotNet.exe]
@="C:\\Program Files\\Paint.NET\\PaintDotNet.exe"
"Path"="C:\\Program Files\\Paint.NET"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}]
@="VideoPreview Class"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\Control]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\InprocServer32]
@="C:\\WINDOWS\\system32\\wiaaut.dll"
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\Insertable]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\MiscStatus]
@="0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\MiscStatus\1]
@="131473"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\ProgID]
@="WIA.VideoPreview.1"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\Programmable]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\ToolboxBitmap32]
@="C:\\WINDOWS\\system32\\wiaaut.dll, 101"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\TypeLib]
@="{94A0E92D-43C0-494E-AC29-FD45948A5221}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\Version]
@="1.0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0B5F2CC8-5E1E-44F9-899B-3B789705AFCA}\VersionIndependentProgID]
@="WIA.VideoPreview"

Serega 20-09-2008 00:04 903764

AlexNeo, просмотрел ваш скрипт. Сильно разбираться не стал, в чём может быть не соответствие Рег Файла и секцией скрипта [Registry], но с начала я бы попробовал импортировать Рег Файл в скрипт не меняя полных путей, т.е С:\Program Files\Paint.NET\... и так далее.
Если в контекстном меню не появиться надпись, тогда попробуйте произвести регистрацию через *.cmd, с последующим удалением последних. Т.е. делаете, допустим Paint.NET.cmd, в котором записываете
Код:

cls
@echo off
REGEDIT /S Paint.NET.reg
EXIT

Затем сохраняете Paint.NET.reg и Paint.NET.cmd, чтоб в последствии не потерялись, в папку проекта программы, у вас насколько я понял это папка Files.
Я бы вам предложил немного сократить скрипт
Код:

............................
[Files]
Source: Files\*; Excludes: Paint.NET.reg, Paint.NET.cmd; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: System32\wiaaut.dll; DestDir: {sys}; Flags: onlyifdoesntexist
Source: Files\Paint.NET.reg; DestDir: {app}; Flags: ignoreversion deleteafterinstall skipifsourcedoesntexist
Source: Files\Paint.NET.cmd; DestDir: {app}; Flags: ignoreversion deleteafterinstall skipifsourcedoesntexist
............................

[Run]
Filename: {app}\Paint.NET.cmd; WorkingDir: {app}; Flags: runhidden waituntilterminated skipifdoesntexist
............................

Excludes - указывает какие файлы не копировать;
onlyifdoesntexist - устанавливать файл только в случае, если такого файла в системе пользователя нет;
deleteafterinstall - удалить файл после установки;
skipifsourcedoesntexist и skipifdoesntexist - не выводить сообщение об ошибке, если такого файла нет;
runhidden - запустится в скрытом окне.

P.S.
Да, чего-то я сразу не подумал. При регистрации через *.cmd, инсталлятор потеряет свою универсальность.

mariolast 23-09-2008 01:14 906212

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

boss911 23-09-2008 02:11 906234

Цитата:

Цитата mariolast
сделать так, чтобы была возможность выбора компонентов для установки? »

Код:

[Components]
Name: File1; Description: My File 1
Name: File2; Description: My File 2

[Files]
Source: C:\Program\MyProg1.exe; DestDir: {app}; Components: File1
Source: C:\Program\MyProg2.exe; DestDir: {app}; Components: File2

Если вам нужно, чтобы один из компонентов или все они были выбраны (стояла птичка) по умолчанию, тогда делаем так:
Код:

[Components]
Name: File1; Description: My File 1; Types: full custom
Name: File2; Description: My File 2

- означает, что компонент File1 будет выбран по умолчанию, все остальные - нет.

Junos 28-09-2008 09:35 910697

Чем распаковать inno setup 2.0.17?

Unpaker пишет:
Цитата:

Signature detected: Inno Setup Setup Data (2.0.17). This is not a supported vers
ion.

snark 01-10-2008 18:48 913509

Вложений: 1
Хотел создать в скрипте резервное копирование файлов. Скачал Примеры скриптов на паскале, нашел то что нужно:
Цитата:

Этот метод резервирования заключается в том, что, например, при создании обновления, нам необходимо зарезервировать все перезаписываемые файлы, например, в папку Backup с сохранением их расположения в подпапках. Затем при деинсталляции обновления мы восстанавливаем резервные файлы на место и удаляем уже не нужную папку Backup. Для данной работы необходим установленный Inno Setup Preprocessor, доступный при установке пакета Inno Setup QuickStart Pack с официального сайта Inno Setup. Итак, для работы нам необходим внешний SHFileOperation.iss, который помещаем в одну папку с Inno Setup. СКРИПТ ИМЕЕТСЯ В КОМПЛЕКТЕ. Затем создаем новый скрипт следующего содержания
Скрипт SHFileOperation.iss поместил в папку со своим скриптом. При компиляции вываливается ошибка:



файл SHFileOperation.iss прикрепил.
Inno Setup Preprocessor, Inno Setup QuickStart Pack установлены.

snark 03-10-2008 11:00 914863

Решена загвоздка в предыдущем посте!
Оказалось что проблема была вот в чем: я дважды прописал строку
Код:

#include "SHFileOperation.iss"
в начале скрипта и в секции [code]. Из последней эту строку надо было удалить. :)

Resylenr 04-10-2008 19:36 915793

У меня такаеже проблемма как у AlexNeo, помогите ктонибудь решить!

Serega 04-10-2008 23:22 915966

Цитата:

Цитата Resylenr
У меня такаеже проблемма как у AlexNeo, помогите ктонибудь решить!

Я конечно не специалист, но попробуйте добавить двойной \\ в скрипт, т.е. пример из скрипта AlexNeo
читать дальше »
Код:

Root: HKCR; SubKey: CLSID\{{D292F82A-50BE-4351-96CC-E86F3F8049DA}\InProcServer32; ValueType: string; ValueData: {app}\ShellExtension_x86.dll; Flags: uninsdeletekey
соответствующий ключ реестра, из рег файла AlexNeo
Код:

[HKEY_CLASSES_ROOT\CLSID\{D292F82A-50BE-4351-96CC-E86F3F8049DA}\InProcServer32]
"ThreadingModel"="Apartment"
@="C:\\Program Files\\Paint.NET\\ShellExtension_x86.dll"

мне кажется, нужно написать в скрипте так
Код:

Root: HKCR; SubKey: CLSID\{{D292F82A-50BE-4351-96CC-E86F3F8049DA}\InProcServer32; ValueType: string; ValueData: {app}\\ShellExtension_x86.dll; Flags: uninsdeletekey
и так далее, в соответствии с рег файлом. Проверить не на чем, но думаю должно работать...

Serega 05-10-2008 13:36 916260

Цитата:

Цитата Junos
Чем распаковать inno setup 2.0.17? »

По-моему самый первый: Inno Setup Unpacker v0.04 (2004.02.27) Supports IS versions 4.0.1 - 4.1.8.
Так, что мне кажется самый простой вариант, это произвести установку на виртуальной машине, проследив изменения с помощью RegShot.

Resylenr 07-10-2008 13:51 917874

Serega
Непомагло!
Помагите очень надо.

hb860 07-10-2008 15:31 917950

Resylenr, А что распаковываешь ?

Resylenr 07-10-2008 16:41 918012

Пытаюсь пережать Adobe Photoshop CS3 в Inno Setup, но не как не могу добавить ярлык в контекстное меню проводника.

hb860 07-10-2008 18:41 918119

Кинь код который регистрирует контекстное меню

Serega 07-10-2008 18:53 918126

Цитата:

Цитата Resylenr
Непомагло! »

сказать честно - не знаю почему. Попробуйте в самом рег файле заменить C:\Program Files на переменную %PROGRAMFILES%, а C:\WINDOWS на %WINDIR% - это придаст универсальность рег файлу. Произведите регистрацию рег файла через запуск *.cmd из инсталлятора.

Resylenr 07-10-2008 19:00 918132

Если импортировать рег файл то всё ОК! А если через инсталлятор то не работает.

hb860 07-10-2008 19:08 918141

Resylenr, хочу видеть код

Resylenr 07-10-2008 19:14 918148

Возми код от AlexNeo у меня такойже.

hb860 07-10-2008 19:58 918181

Надо прописать в скрипте что-то подобное. В моем случае это добавляет оперу :)
Код:

[Registry]
Key:HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bmp\OpenWithList; ValueType: string;ValueName a;ValueData: Opera.exe;  Flags: uninsdeletevalue


Serega 08-10-2008 01:31 918421

Resylenr, разобрался в чём дело и нашёл ошибку. Правда, прежде пришлось самому пересобрать программу
Код:

Root: HKLM; SubKey: SOFTWARE\Classes\jpegfile\shell\edit\command; ValueType: string; ValueData: "\""{app}\PaintDotNet.exe\"" \""%1\"""; Flags: uninsdeletevalue
должно быть, так:
Код:

Root: HKLM; SubKey: SOFTWARE\Classes\jpegfile\shell\edit\command; ValueType: string; ValueData: """{app}\PaintDotNet.exe"" ""%1"""; Flags: uninsdeletevalue
исправьте все строки в соответствии с этим и будет у вас счастье...
P.S.
Если интересно, я вношу в реестр немного другие изменения, вот мой пример скрипта
читать дальше »
[Setup]
AppName=Paint.NET
AppVerName=Paint.NET 3.36
VersionInfoVersion=3.36
AppPublisher=dotPDN LLC
AppPublisherURL=http://www.getpaint.net
AppSupportURL=http://www.getpaint.net
AppUpdatesURL=http://www.getpaint.net
DefaultDirName={pf}\Paint.NET
UninstallFilesDir={app}\Uninstall
DefaultGroupName=Paint.NET
AllowNoIcons=yes
ChangesAssociations=yes
InfoBeforeFile=Paint.NET\License.txt
OutputDir=D:\Мои сборки
OutputBaseFilename=Paint.NET
SetupIconFile=C:\Program Files\Иконки\41.ico
UninstallDisplayIcon={app}\PaintDotNet.exe
Compression=lzma
SolidCompression=yes

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: Paint.NET\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Sys32\wiaaut.dll; DestDir: {sys}; Flags: onlyifdoesntexist regserver sharedfile

[Icons]
Name: {commonprograms}\Стандартные\Paint.NET; Filename: {app}\PaintDotNet.exe; WorkingDir: {app}; Comment: Бесплатный графический редактор Paint.NET 3.36
Name: {commondesktop}\Paint.NET; Filename: {app}\PaintDotNet.exe; WorkingDir: {app}; Comment: Бесплатный графический редактор Paint.NET 3.36; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\Paint.NET; Filename: {app}\PaintDotNet.exe; WorkingDir: {app}; Comment: Бесплатный графический редактор Paint.NET 3.36; Tasks: quicklaunchicon

[UninstallDelete]
Type: filesandordirs; Name: {app}\*

[Registry]
Root: HKLM; SubKey: SOFTWARE\Classes\.bmp\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; ValueData: ; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.jpe\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; ValueData: ; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.jpeg\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; ValueData: ; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.jpg\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; ValueData: ; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.pdn; ValueType: string; ValueName: ; ValueData: Paint.NET.1; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.pdn; ValueType: string; ValueName: PerceivedType; ValueData: Image; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.pdn\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; ValueData: ; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.png\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; ValueData: ; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.tga; ValueType: string; ValueName: Content Type; ValueData: image/targa; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.tga; ValueType: string; ValueName: PerceivedType; ValueData: Image; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.tga; ValueType: string; ValueName: ; ValueData: Paint.NET.1; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\.tga\OpenWithProgids; ValueType: string; ValueName: Paint.NET.1; ValueData: ; Flags: uninsdeletevalue
Root: HKLM; SubKey: SOFTWARE\Classes\Applications\PaintDotNet.exe\shell\edit\command; ValueType: string; ValueData: """{app}\PaintDotNet.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Applications\PaintDotNet.exe\shell\open\command; ValueType: string; ValueData: """{app}\PaintDotNet.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Applications\PaintDotNet.exe\shell\print\command; ValueType: string; ValueData: """{app}\PaintDotNet.exe"" ""print:%1"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\jpegfile\shell\edit\command; ValueType: string; ValueData: """{app}\PaintDotNet.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.1; ValueType: string; ValueName: ; ValueData: Paint.NET Image; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.1\shell\edit\command; ValueType: string; ValueData: """{app}\PaintDotNet.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.1\shell\open\command; ValueType: string; ValueData: """{app}\PaintDotNet.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.NET.1\shell\print\command; ValueType: string; ValueData: """{app}\PaintDotNet.exe"" ""print:%1"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\Paint.Picture\shell\edit\command; ValueType: string; ValueData: """{app}\PaintDotNet.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Classes\pngfile\shell\edit\command; ValueType: string; ValueData: """{app}\PaintDotNet.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Paint.NET; ValueType: string; ValueName: CHECKFORUPDATES; ValueData: 1; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Paint.NET; ValueType: string; ValueName: TGAEDITOR; ValueData: 1; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Paint.NET; ValueType: string; ValueName: JPGPNGBMPEDITOR; ValueData: 1; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Paint.NET; ValueType: string; ValueName: TARGETDIR; ValueData: {app}\; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Paint.NET; ValueType: string; ValueName: USINGWIZARD; ValueData: 1; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Paint.NET; ValueType: string; ValueName: LASTACCEPTEDEULAVERSION; ValueData: 20080601; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Paint.NET; ValueType: string; ValueName: PDNUPDATING; ValueData: 0; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Paint.NET; ValueType: string; ValueName: SKIPCLEANUP; ValueData: 0; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Paint.NET; ValueType: string; ValueName: QUEUENGEN; ValueData: 1; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Paint.NET; ValueType: string; ValueName: LanguageName; ValueData: ru-RU; Flags: uninsdeletekey

Саш_ОК 08-10-2008 23:16 919249

Ребята а скажите как можно убрать строку в инсталяторе --ту которая показывает куда устанавливается программа??

Пусть прогрес бар быдет а вот там де пишет Ц/ПрограмзФайл/бла-бла-бла -КАК убрать можно???
Спасибо зарание за ответы.

Resylenr 09-10-2008 12:20 919550

Serega_ ,
Спасибо все заработало.

Serega 12-10-2008 11:43 921674

Цитата:

Цитата Саш_ОК
Ребята а скажите как можно убрать строку в инсталяторе... »

в скрипте надо написать:
..........................................................................
[code]
procedure InitializeWizard();
begin
WizardForm.FileNameLabel.Visible:= False;
end;
..........................................................................
Это отключит отображение файлов вообще.

Алексей Н. 12-10-2008 15:31 921804

Подскажите, можно ли из командной строки запретить создание ярлыка на рабочем столе?
Пробую с ключом /noicons, но не работает. Это вроде ключ для ярлыков меню "пуск", но он и там не работает. Пробовал создавать файл ответов, но он получается какой-то слишком урезанный.

Код:

[Setup]  Lang=ru  Dir=C:\Program Files\LanTricks\LanScope  Group=LanTricks  NoIcons=0  Components=
Если конкретно, то пытаюсь тихо установить LanScope 2.9.1. Но и с другими приложениями такие же проблемы.

snark 12-10-2008 17:21 921863

Так вы использовали файл ответов?
Код:

setup.exe /LOADINF="config.txt" /VERYSILENT
что-то вроде такого. Для начала создаете файл ответов командой
Код:

/SAVEINF="config.txt"
где config.txt - имя файла ответов. Кавычки не обязательны, но нужны, если в имени файла есть пробелы.

Serega 12-10-2008 20:53 922013

Цитата:

Цитата Алексей Н.
Подскажите, можно ли из командной строки запретить создание ярлыка на рабочем столе?
Пробую с ключом /noicons, но не работает. Это вроде ключ для ярлыков меню "пуск", но он и там не работает. Пробовал создавать файл ответов, но он получается какой-то слишком урезанный. »

Всё правильно /noicons, это команда не создавать ярлыков, но в данном инсталляторе это не предусмотрено, т.е. такого права пользователю не предоставляется.
По поводу файла ответов, сказать честно, у меня так и ни разу не получилось, правда пробовал всего пару раз, но мне это показалась таким гемором.
На мой взгляд, самый простой вариант - распаковать инсталлятор, изменить скрипт по вашему усмотрению и желанию, затем снова его скомпилировать.
P.S.
А вообще, прикольная программка...

Алексей Н. 13-10-2008 12:14 922510

Понятно. Спасибо.

alex_84 13-10-2008 17:32 922799

есть небольшая проблема с установкой PC Tools Firewall Plus и PC Tools Antivirus. Начиная с 3-й версии, в фаерволл включили дполнительную установку (путем загрузки из инета) Google Toolbar, которая некоторым людям (например мне =) ) совершенно не нужен. Можно как-нибудь обойти установку этого компонента? Установка с ключем /Verysilent /Norestart конечно проходит успешно, но перед самой установкой появляется окошко загрузки того самого гугла тулбара, что требует помимо нажатия кнопочек еще и выхода в инет (а откуда он у меня, когда установка всего софта начинается за 12 минут до окончания установки винды?). После отмены загрузки компонента, установка фаервола проходит в тихом режиме. Вопрос в том - как пропустить загрузку ненужного мне компонента? Распаковщика под Inno Setup 5.2.2 я еще не встречал, а то можно было бы и самому поковыряться. Заранее благодарен.

Serega 13-10-2008 18:10 922829

Цитата:

Цитата alex_84
Распаковщика под Inno Setup 5.2.2 я еще не встречал... »

посмотрите в шапку темы Unpaker 2.0, Зеркало, зеркало - распаковывает инсталляторы версии 5.2.2 или вот по этой ссылке - распаковывает инсталляторы версии 5.2.3, а здесь - расширенная версия Version 0.23 build 2008-08-08 (китайская модификация), как про неё написано:
Цитата:

Данная сборка обладает расширенной функциональностью по сравнению с оригинальным innounp, корректно распознает различные версии и модификации инсталляторов Inno Setup, поддерживает дополнительные ключи, которые повышают вероятность корректной распаковки в сложных случаях
и в работе с запароленными инсталляторами..
P.S.
Да, вот ещё Inno Setup Unpacker Explorer - русская версия. Это графическая оболочка для innounp.

alex_84 13-10-2008 18:59 922874

Цитата:

Цитата Serega_
посмотрите в шапку темы Unpaker 2.0, Зеркало, зеркало - распаковывает инсталляторы версии 5.2.2 или вот по этой ссылке - распаковывает инсталляторы версии 5.2.3, а здесь - расширенная версия Version 0.23 build 2008-08-08 (китайская модификация), как про неё написано: »

отлично, огромное спасибо. Помогло =)

SamLab 13-10-2008 20:26 922964

Каким ключом можно убрать галочку и тем самым не запускать программу по окончании установки?

Serega 13-10-2008 20:42 922985

Цитата:

Цитата SamLab
Каким ключом можно убрать галочку и тем самым не запускать программу по окончании установки? »

может я конечно и заблуждаюсь, но мне кажется, что никого ключа для этого нет. Способы решения:
1. Пересобрать инсталлятор;
2. Убить процесс запуска. Как написано в
Цитата:

Цитата Учебник по автоматической установке Windows
Осталась еще одна проблема. Некоторые инсталляторы Inno Setup попытаются запустить программу по окончании установки. ISOBuster как раз такой случай. Тогда приходится убивать процесс, используя встроенную в Windows утилиту Taskkill. Ниже пример кода для установки ISOBuster:

ECHO.
ECHO Installing ISOBuster 1.4
ECHO Please wait...
start /wait %systemdrive%\install\Applications\ISOBuster\IsoBuster14.exe /VERYSILENT /SP-
ECHO.
ECHO Killing ISOBuster.exe process

taskkill.exe /F /IM isobuster.exe
ECHO .

но первый вариант, мне всегда больше нравится...

SamLab 13-10-2008 21:51 923065

Serega_, Через бат файл решается просто я знаю, но мне желательно чтобы не используя батников только через параметры командной строки

Serega 13-10-2008 21:58 923074

Цитата:

Цитата SamLab
...но мне желательно чтобы не используя батников только через параметры командной строки »

у меня один раз было такое, перепробовал все возможные команды, ничего не вышло... Распаковать инсталлятор не смог, зашифрован, пришлось на виртуальной машине устанавливать и потом пересоберать инсталлятор.
P.S.
А, что за программа?

Алексей Н. 13-10-2008 22:25 923101

SamLab,
Обычно решается через создание файла ответов. Установка с ключом /saveinf="xxxxxxx.inf", а потом тихая установка с ключом /loadinf="xxxxxxx.inf". Устанавливаю так K-lite кодеки. Но прокатывает как оказалось не всегда.

boss911 14-10-2008 00:41 923191

Цитата:

Цитата SamLab
Каким ключом можно убрать галочку и тем самым не запускать программу по окончании установки? »

Цитата:

Цитата Алексей Н.
Обычно решается через создание файла ответов. »


Если автор инсталлятора не указал в скрипте флаг 'skipifsilent', то и файл ответов может не помочь, и ключи командной строки тоже, их нет.

Код:

[Run]
Filename: {app}\MyProg.exe; Description: Запустить MyProg; Flags: postinstall skipifsilent


Dimika 14-10-2008 19:17 923854

Привет!

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

katok888 14-10-2008 21:32 923990

Dimika,
Код:

[Run]
Filename: "{app}\MyProg.exe"; Description: "{cm:LaunchProgram,My Program}"; Flags: nowait postinstall skipifsilent


FlatX007 24-10-2008 19:16 932714

Подскажите как зделать, что бы при запуске установки в пути установки были показанны только Flash устройства!!
Если Флешек нет то желательно, что-бы вылезло окошко с предупреждением.


*****

И помогите переделать этот скрипт суть его заключается в этом - (Проверка на присутствие и целостность определенного файла, находящего рядом с инсталлятором)


Можно зделать так, что бы инсталятор проверял MD5 не одного файла, а группы файлов!
...пробовал дописывать ещё несколько строк - при компиляции ошибки не выдаёт но работает проверка MD5 только на один файл.

читать дальше »
[code]
function InitializeSetup(): Boolean;
var
ResultCode: Integer;
MD5,ResultStr:string;
hWnd: Integer;
begin
Result:=True;
if not FileExists(ExpandConstant('{src}')+'\Kindly.nfo') then
begin
MsgBox('"Kindly.nfo" is not found in one dir with installer.'#13#13'Please place "Kindly.nfo" and run installer again.', mbError, mb_OK);
Result:= False;
end
else
begin
MD5 := GetMD5OfFile(ExpandConstant('{src}\Kindly.nfo'));
If not (MD5 = 'cee34d7975e3e97c6a8f50fe7276a8de') then
begin
MsgBox('MD5 hash of "Kindly.nfo" is not valid.'#13#13'You are probably using web shit!'#13#13'I''m closed now, bye-bye:).', mbCriticalError, mb_OK);
Result:=False;
end;
end;
end;



*****

Gennadich 29-10-2008 16:54 937172

Товарищи! Подскажите, как сделать чтобы предотвратить одновременный запуск нескольких экземпляров сетапа?

Merlin_jr 10-11-2008 00:36 948163

Приветствую Знающих.

Подскажите как убрать из заголовка инсталлятора следующий фрагмент "Установка - ".

boss911 10-11-2008 01:52 948212

Цитата:

Цитата Merlin_jr
Подскажите как убрать из заголовка инсталлятора следующий фрагмент "Установка - ". »

Отредактируйте языковой файл Languages\*.isl , исходя из вашего языка, секцию [Messages], там разберетесь.

Также, можно пойти более красивым методом. Создайте в скрипте (.iss) следующие:
Код:

[Messages]
SetupWindowTitle=%1

%1 - подставится значение из секции [Setup] парметра AppName.

Если вы используете языковой файл для интерфейса инсталлятора, к примеру, русский, тогда сделайте так:
Код:

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

[Messages]
rus.SetupWindowTitle=%1


Merlin_jr 10-11-2008 15:06 948636

А какой переменной можно заменить текст на значке приложения в Панели задач

Спасибо уже не не надо. Сам нашел.

FlatX007 10-11-2008 17:06 948743

Цитата:

Цитата FlatX007
Подскажите как зделать, что бы при запуске установки в пути установки были показанны только Flash устройства!!
Если Флешек нет то желательно, что-бы вылезло окошко с предупреждением.
*****
И помогите переделать этот скрипт суть его заключается в этом - (Проверка на присутствие и целостность определенного файла, находящего рядом с инсталлятором)
Можно зделать так, что бы инсталятор проверял MD5 не одного файла, а группы файлов....
читать дальше » »

Ну чего никто незнает ???

Мда - как из готовых скриптов ответы брать , это все горазды ... а понастоящему помочь некому :(

МИШАНЧИК 14-11-2008 12:41 952474

Подскажите пожалуйста!
Пытаюсь установить руссификатор для JetAudio 7.1.8. Он собран при помощи Inno Setup. Но при запуске с ключом /VERYSILENT выскакивает окно "Определено местоположение JetAudio. Продолжить установку. Да. Нет."
При запуске с ключом /VERYSILENT /SP- картина та же.
Как правильно его тихо установить?

ZaV 14-11-2008 16:02 952657

Цитата:

Цитата МИШАНЧИК
Пытаюсь установить руссификатор для JetAudio 7.1.8. »

не знаю о какой версии говорите вы но на офф сайте я нашел только Install_RUS_V71_LPack_v101_(1).exe
он сделан в NSIS.

МИШАНЧИК 15-11-2008 02:26 953137

ZaV, у меня Install_RUS_V71_LPACK_V120.

А по Вашей ссылке, так там вообще есть Install_RUS_V71_LPACK_V121_(2) вот он такой же как у меня Install_RUS_V71_LPACK_V120 собран в Inno.

Serega 15-11-2008 19:52 953586

Цитата:

Цитата FlatX007
а понастоящему помочь некому »

FlatX007, будьте немного уважительнее, к тем кто здесь присутствует. Если Вам не ответили на Вашу проблему - это не значит, что Вас никто не заметил, в полне возможно просто нет готового решения по Вашей проблеме...
Если Вас устроит ответ, по решению Вашей проблемы: Я НЕ ЗНАЮ...
Ну как, полегчало???
Цитата:

Цитата FlatX007
Мда - как из готовых скриптов ответы брать , это все горазды ... »

но все так или иначе ответы строятся на том, что когда-то, кем-то написано, просто нужно уметь найти решение своей проблемы в нужном месте и в нужной книге...
Мне просто интересно... И как Вы думаете после такого, Вам кто-то поможет??? Не пльюйте в колодец из которого пьёте...
Цитата:

Цитата МИШАНЧИК
Как правильно его тихо установить? »

Моё мнение, спасёт только переупаковка...

FlatX007 16-11-2008 23:15 954453

Отвечаю сам на свой вопрос !

Скрипт для проверки контрольной суммы и наличия 2х файлов (я не успел попробовать но думаю проверка 2х файлов это не предел)

Код:

function NextButtonClick(CurPage: Integer): Boolean;
var
  sz:Integer;
  s:string;
    begin
  Result:=True;
 If CurPage=6 then
 //Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения
  begin
 If (FileSearch('Main.exe', ExpandConstant('{app}'))='')
 or (FileSearch('Comp.dll', ExpandConstant('{app}')+'\data')='')
then
  begin
  s:='Извините, в директории '+ExpandConstant('{app}')+'' #13 'не обнаружены файлы, подтверждающие подлинность программы.' #13#13 'Пожалуйста, выберите правильный путь для установки обновления.';
  MsgBox(s, mbError, mb_Ok);
  Result:= False
end
else
 //И проверка размера оригинальных файлов
  begin
 If FileSize(ExpandConstant('{app}')+'\Main.exe', sz)
then
  begin
 If sz<>270336 //Проверяемый размер в байтах
then
  begin
  s:='Размер установленого компонента Main.exe не соответствует.' #13#13 'Для установки обновления требуются оригинальные файлы.';  MsgBox(s, mbCriticalError, mb_Ok);
  Result:= False
  end else
  begin
 If FileSize(ExpandConstant('{app}')+'\data\Comp.dll', sz)
then
  begin
 If sz<>3688328
then
  begin
  s:='Размер установленого компонента Comp.dll не соответствует.' #13#13 ' Для установки обновления требуются оригинальные файлы.';  MsgBox(s, mbCriticalError, mb_Ok);
  Result:= False
end;
end;
end;
end;
end;
end;
end;


ZaV 17-11-2008 13:14 954815

МИШАНЧИК,
самое простое, что приходит в голову по поводу установки русификатора .. это распаковать скрипт
и откомпилировать заново. Так заодно мы потеряем секцию code из которой по всей видимости и растут ноги у этого окна.

МИШАНЧИК 18-11-2008 10:09 955686

ZaV, а не могли бы Вы
Цитата:

Цитата ZaV
распаковать скрипт и откомпилировать заново »

если позволяет время это сделать и выложить руссификатор, или скрипт?

ZaV 18-11-2008 11:50 955789

Вложений: 1
МИШАНЧИК, примерно такой скрипт получается

andreichsb 19-11-2008 20:23 957366

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

Serega 19-11-2008 22:27 957480

Цитата:

Цитата andreichsb
... сам искал есть ли на компьютере директория для установки ( по умолчанию она должна быть, так как добавляю новые карты к игре) и ставилось все в найденную диру?... »

Нужно в секции [Setup] записать путь установки так:
читать дальше »
Код:

DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1,InstallPath}
также можно добавить проверку в секцию [code]:
Код:

function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  s, ResultStr:string;
begin
Result:=True;
If not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1')
 then
begin
 MsgBox('Программа My Program 1.5 не установлена или установлена неверно.' #13#13 'Дальнейшая работа мастера невозможна.', mbError, mb_Ok);
 Result:=False;
end;
end;


andreichsb 20-11-2008 09:46 957849

сделал как в первом коде, инсталятор пытается пытается создать папку с таким названием как та куда нужно установить т.е. должно быть так d/program files/activision/call of duty 4/main
а делает так d/program files/activision/call of duty 4/call of duty 4/main

Serega 20-11-2008 17:14 958241

Цитата:

Цитата andreichsb
а делает так d/program files/activision/call of duty 4/call of duty 4/main »

А можно взглянуть на сам скрипт?

andreichsb 20-11-2008 17:30 958254

Код:

; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!  [Setup] AppName=MapPackSB v1.1 AppVerName=Version 1.1 AppPublisher=Clan SB [X7] AppPublisherURL=http://www.callofduty5.sbor.net/ AppSupportURL=http://www.callofduty5.sbor.net/ AppUpdatesURL=http://www.callofduty5.sbor.net/ DefaultDirName={reg:HKLM\SOFTWARE\Activision\Call of Duty 4 - Modern Warfare_is1,InstallPath} DefaultGroupName=MapPackSB DisableProgramGroupPage=yes LicenseFile=F:\карты\Лицензия.txt OutputDir=E:\карты OutputBaseFilename=MapPackSB SetupIconFile=D:\Program Files\Activision\Call of Duty 4 - Modern Warfare\cod4.ico Compression=lzma SolidCompression=yes  [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"  [Files] Source: "D:\Program Files\Activision\Call of Duty 4 - Modern Warfare\Server SB.bat"; DestDir: "{app}"; Flags: ignoreversion Source: "F:\карты\Call of Duty 4 - Modern Warfare\main\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "F:\карты\Call of Duty 4 - Modern Warfare\zone\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "F:\карты\Call of Duty 4 - Modern Warfare\pb\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files  [Icons] Name: "{group}\{cm:ProgramOnTheWeb,MapPackSB}"; Filename: "http://www.callofduty5.sbor.net/"

Саш_ОК 20-11-2008 18:12 958306

Ребята а подскажите скриптик для того что б не появлялось во время установки окно с предложением вибора директории!!!
Спасибо зарание!

boss911 20-11-2008 18:24 958314

Цитата:

Цитата Саш_ОК
что б не появлялось во время установки окно с предложением вибора директории »

Код:

[Setup]
DisableDirPage=true


Aurochs 20-11-2008 18:25 958316

Товарищи что лучше сжимает точно lzma/iltra64 или может lzma/max ?
просветите нуба пожалуйста

Serega 20-11-2008 18:28 958319

andreichsb, Вообще я вам писал совсем другой ключ, ну да ладно...
Я понял о чём речь, запишите так:
читать дальше »
Код:

[Setup]
.....................................................
DefaultDirName={reg:HKLM\SOFTWARE\Activision\Call of Duty 4 - Modern Warfare,InstallDir}
.....................................................


Serega 20-11-2008 18:43 958328

Цитата:

Цитата Aurochs
Товарищи что лучше сжимает точно lzma/iltra64 или может lzma/max ? [post=ID]»[/post]

lzma/ultra сжимает лучше...

Aurochs 20-11-2008 18:52 958337

спасибо.

Akella2007 25-11-2008 13:45 963074

Кусок скрипта для перевода дистрибудива на русский язык:
Тынц

workermaks 27-11-2008 11:50 965036

Господа, подскажите - можно ли в Inno setup вызывать модальное окно для сбора параметров а потом с этими параметрами сделать RUN exe файла? :shout:

Resylenr 28-11-2008 15:52 966372

Пытаюсь пережать Adobe Photoshop CS3 в Inno Setup, но не как не могу добавить ярлык в контекстное меню проводника.

Откликнитесь кто нибудь

Serega 28-11-2008 16:31 966401

Цитата:

Цитата Resylenr
Пытаюсь пережать Adobe Photoshop CS3 в Inno Setup, но не как не могу добавить ярлык в контекстное меню проводника. »

У меня нет Adobe Photoshop, но я заглянул к себе в реестр и в [HKEY_CLASSES_ROOT\ACDSee 10.0.032], увидел следующее:
читать дальше »

[HKEY_CLASSES_ROOT\ACDSee 10.0.032]
@="ACDSee 10.0 RAW изображение"

[HKEY_CLASSES_ROOT\ACDSee 10.0.032\DefaultIcon]
@="c:\\program files\\acd systems\\acdsee\\10.0\\plugins\\ID_DCRaw.apl,0"

[HKEY_CLASSES_ROOT\ACDSee 10.0.032\shell]
@="Open"

[HKEY_CLASSES_ROOT\ACDSee 10.0.032\shell\ACDEdit]
@="Редактировать в ACDSee 10 Photo Manager"

[HKEY_CLASSES_ROOT\ACDSee 10.0.032\shell\ACDEdit\command]
@="\"C:\\Program Files\\ACD Systems\\ACDSee\\10.0\\ACDSeeQV10.exe\" /ee \"%1\""

[HKEY_CLASSES_ROOT\ACDSee 10.0.032\shell\Open]
@="Открыть с помощью ACDSee 10 Photo Manager"

[HKEY_CLASSES_ROOT\ACDSee 10.0.032\shell\Open\command]
@="\"C:\\Program Files\\ACD Systems\\ACDSee\\10.0\\ACDSeeQV10.exe\" \"%1\""

Можете сделать по аналогии...

ChVL 03-12-2008 21:51 971597

Имеются два файла: file32.dll и file64.dll, один из них соответственно надо отправить в директорию при x32, другой – при x64. Использую флаги:
Flags: regserver noregerror onlyifdoesntexist 32bit и
Flags: regserver noregerror onlyifdoesntexist 64bit
При инсталляции выскакивает окно:
«Внутренняя ошибка: Cannot install files to 64-bit locations on this version of Windows»
и установка прерывается. Флаги 32bit и 64bit в какой только комбинации не пристёгивал - ноль реакции.
Добавляю Check-функцию:
Код:

[_Files]
Source: "file32.dll" ; DestDir: "{pf}";  Flags: regserver noregerror onlyifdoesntexist; Check: (not IsWin64);
Source: "file64.dll" ; DestDir: "{pf}";  Flags: regserver noregerror onlyifdoesntexist; Check: IsWin64;
 
[_Code]
function IsWin64: boolean;
begin
 if IsWin64 then 
 begin
  MsgBox('64-bit program files reside in: ' +  ExpandConstant('{pf}'), mbInformation,  MB_OK); 
 Result:=True;
 end
 else
  begin
  MsgBox('32-bit program files reside in: ' +  ExpandConstant('{pf}'), mbInformation,  MB_OK); 
  Result:=False;
  end;
end;

Инсталляция намертво зависает.
Что я делаю не так?

ChVL 04-12-2008 16:46 972300

C помощью добрых людей решение найдено. Нельзя называть свою функцию тем же именем IsWin64. Правильный вариант должен быть таким (может кому-то пригодится):
Код:

[_Files]
Source: "file32.dll" ; DestDir: "{pf}";  Flags: regserver noregerror onlyifdoesntexist; Check: (not IsX64);
Source: "file64.dll" ; DestDir: "{pf}";  Flags: regserver noregerror onlyifdoesntexist; Check: IsX64;
 
[_Code]
function IsX64: boolean;
begin
 if IsWin64 then 
 begin
  MsgBox('64-bit program files reside in: ' +  ExpandConstant('{pf}'), mbInformation,  MB_OK); 
 Result:=True;
 end
 else
  begin
  MsgBox('32-bit program files reside in: ' +  ExpandConstant('{pf}'), mbInformation,  MB_OK); 
  Result:=False;
  end;

Если окна не нужны, то строчки MsgBox просто убрать.

Саш_ОК 07-12-2008 22:51 974988

Ребята скажите -вот есть двет проблеми -помогите решить!

1 как зделать так что б параметр Flags: exclusive біл в обеих позициях!

Код:

Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: exclusive
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

2 создаю инстайлер - в нём есть фали которие кидаются в папку систем32 а есть файли и папки которие кидаются в Ц/Програм Файлз ... но есть проблема -когда изменяю дирректорию установки -файли кидаются в нужную деррикторию а вот папки нет!
Что делать????
Код:

[Files]
Source: "J:\Instal\MyProg.apm"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\MyProg.ico"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\autorun.inf"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\bottom.html"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\data_index.js"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\index.html"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\main.hta"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\navigation.html"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\navigation.js"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\partners.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\MyProg.ico"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\Price.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\right.html"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\search.js"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\settings.js"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\style.css"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\userguide.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\MyProg.apm"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "J:\Instal\printButton.png"; DestDir: "C:/WINDOWS/system32/"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "J:\Instal\Adobe_Reader\*"; DestDir: "C:\Program Files\MyProg\Adobe_Reader"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "J:\Instal\MyProg_files\*"; DestDir: "C:\Program Files\MyProg\MyProg_files"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "J:\Instal\Map\*"; DestDir: "C:\Program Files\MyProg\Map"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "J:\Instal\clients\*"; DestDir: "C:/WINDOWS/system32"; Flags: ignoreversion recursesubdirs createallsubdirs


boss911 08-12-2008 01:30 975070

Саш_ОК
  1. А какая собственно проблема, ведь работает, в двух позициях? Если вы хотите, чтобы определенная задача была выбрана по умолчанию, добавьте туда флаг unchecked.

  2. Для начала, применяйте для директорий константы:
    • WINDOWS/system32 - {sys}
    • Program Files - {pf}

    Покажите, что у вас тут:
    Код:

    [Setup]
    DefaultDirName=


Саш_ОК 08-12-2008 08:43 975157

DefaultDirName={pf}\MyProg

Resylenr 08-12-2008 12:56 975411

Как создать скрипт чтобы на страницу "Выбор папки установка" перенести чебоксы создания ярлыков и установки доп. компонентов.



Как можно извлекать 7-Zip, RAR архивы чтоб процесс их распаковки отображался в прогрессбаре.



Помогите очень надо.

boss911 08-12-2008 17:15 975652

Цитата:

Цитата Саш_ОК
DefaultDirName={pf}\MyProg »

Должно работать так, из вашего примера:
Код:

Source: "J:\Instal\Map\*"; DestDir: "{app}\Map"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "J:\Instal\Adobe_Reader\*"; DestDir: "{app}\Adobe_Reader"; Flags: ignoreversion recursesubdirs createallsubdirs

Так же обратите внимание на то, что я писал вам выше.

Саш_ОК 08-12-2008 17:47 975679

boss911
Спасибо помогла!
Ещё такой вопрос можно так зделать что б параметр exclusive біл для обеих галочок -а то я его ставлю а он только на ондном какомто параметре -или на роб стол ярлик или в панель бистр запуска!
Спс
Или что ти посоветуеш?

Resylenr 08-12-2008 18:11 975695

Пожалуйста помагите

boss911 08-12-2008 19:13 975737

Цитата:

Цитата Саш_ОК
или на роб стол ярлик или в панель бистр запуска! »

А так устроена функция (флаг) exclusive, одно из двух должно быть выбрано по умолчанию. Выбор по Умолчанию можно выставлять флагом unchecked в тех чекбоксах и радиобатонах, которые вы не хотите, чтобы они были выбраны. Возможною, ситуацию можно решить с помощью кода в Паскале, но тут я далек.

Resylenr 09-12-2008 19:03 976604

boss911, Помоги мне решить проблему, которую я описал выше.

boss911 09-12-2008 19:20 976614

Resylenr
Цитата:

Цитата boss911
Возможною, ситуацию можно решить с помощью кода в Паскале, но тут я далек. »

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

Diman19 13-12-2008 21:27 980352

Всем привет!Скажите пожалуйста как создать дерево раскрывающихся компонентов(выбирается какие компоненты устанавливать)

Resylenr 16-12-2008 19:15 982207

У каво есть скрипт или библиотека для распаковки архивов FreeArc (.arc) с отображением в прогрессбаре.

Gennadich 17-12-2008 18:10 983184

Никто не знает как предотвратить возможность одновременного запуска нескольких экземпляров сетапа?

Resylenr 18-12-2008 04:57 983640

Diman19,
Чтобы получить раскрывающий список компонентов (и многие другие возможности), установи ISPack v5.2.3 (обязательно с препроцессором), а затем обнови Inno Setup до расширенной версии от ResTools.

И потом в скрипте, в секцию [Setup], достаточно поставить ComponentsListTVStyle=true и всё, будет такой список компонентов...

Resylenr 20-12-2008 06:42 985468

Подскажите как заблокировать чекбокс на станице выбора дополнительных задач.
И как если после установки приложения при запуске установщика выводилось сообщениие:

Запустить Программу XXXX
Да Нет
при нажатии Да запускалась программа, а при Нет выход из программы установки.

Скрин:

МИШАНЧИК 31-12-2008 14:07 994491

Подскажите пожалуйста! Как в скрипте правильно укзать, чтоб было не:
[Files]
Source: {app}\хххх.exe; DestDir: {app};
Source: {app}\хххх.exe.manifest; DestDir: {app};
,
а чтоб просто указать в какой папке находится исходное содержимое?

Serega 31-12-2008 14:42 994516

Цитата:

Цитата МИШАНЧИК
чтоб просто указать в какой папке находится исходное содержимое? »

Если вы имеете в виду, как это записать одной строкой, то:
[Files]
Source: {app}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs

NeleGALL 09-01-2009 12:45 1001432

Здравствуйте, может эта информация где-то поднималась, но мне найти не удалось. Меня интересует, как можно bin файлы переименовать в установщике? Чтобы файл setup-1.bin стал, к пример part1.bin, и при этом установщик его корректно принял.

Саш_ОК 09-01-2009 16:48 1001678

Дайте пож силку на пост где обьясняют как делать инсталятор с bin файлами -а то немогу найти!
Буду благодарен!

boss911 09-01-2009 20:03 1001924

Цитата:

Цитата Саш_ОК
как делать инсталятор с bin файлами -а то немогу найти! »

Попробуйте -
Код:

[Setup]
DiskSpanning=true


Саш_ОК 11-01-2009 16:31 1003802

Помогите -не хочет рабоать -работает только что то одно.
читать дальше »

[code]
Procedure InitializeWizard();
begin
with WizardForm do begin
Position:=poScreenCenter
ClientWidth:=690
ClientHeight:=496
Font.Color:=65280
Font.Name:='MS Sans Serif'
Font.Style:=[]
with Bevel do begin
Left:=0
Top:=313
Width:=497
Height:=2
Visible:=False
end
with CancelButton do begin
Left:=576
Top:=465
Width:=78
Height:=20
BringToFront
end
with NextButton do begin
Left:=429
Top:=465
Width:=78
Height:=20
BringToFront
end
with BackButton do begin
Left:=303
Top:=465
Width:=78
Height:=20
BringToFront
end
with OuterNotebook do begin
Left:=0
Top:=0
Width:=690
Height:=496
with WelcomePage do begin
Color:=0
with WizardBitmapImage do begin
Left:=0
Top:=0
Width:=690
Height:=496
end
with WelcomeLabel2 do begin
Left:=205
Top:=230
Width:=465
Height:=200
end
with WelcomeLabel1 do begin
Left:=205
Top:=190
Width:=465
Height:=28
Font.Color:=65280
Font.Size:=8
end
end
with InnerPage do begin
with Bevel1 do begin
Left:=0
Top:=58
Width:=499
Height:=3
Visible:=False
end
with InnerNotebook do begin
Left:=205
Top:=79
Width:=465
Height:=354
BringToFront
Color:=0
with LicensePage do begin
with LicenseNotAcceptedRadio do begin
Left:=0
Top:=338
Width:=465
Height:=17
Checked:=True
Color:=clWindow
end
with LicenseAcceptedRadio do begin
Left:=0
Top:=321
Width:=465
Height:=17
Color:=clWindow
end
with LicenseMemo do begin
Left:=0
Top:=38
Width:=465
Height:=282
ReadOnly:=True
ScrollBars:=ssVertical
end
with LicenseLabel1 do begin
Left:=0
Top:=0
Width:=465
Height:=28
end
end
with PasswordPage do begin
with PasswordEdit do begin
Left:=0
Top:=50
Width:=465
Height:=21
Font.Color:=clWindowText
end
with PasswordEditLabel do begin
Left:=0
Top:=34
Width:=465
Height:=14
end
with PasswordLabel do begin
Left:=0
Top:=0
Width:=465
Height:=28
end
end
with InfoBeforePage do begin
with InfoBeforeMemo do begin
Left:=0
Top:=24
Width:=465
Height:=327
ScrollBars:=ssVertical
end
with InfoBeforeClickLabel do begin
Left:=0
Top:=0
Width:=465
Height:=14
end
end
with UserInfoPage do begin
with UserInfoSerialEdit do begin
Left:=0
Top:=120
Width:=465
Height:=21
Font.Color:=clWindowText
end
with UserInfoSerialLabel do begin
Left:=0
Top:=104
Width:=465
Height:=14
end
with UserInfoOrgEdit do begin
Left:=0
Top:=68
Width:=465
Height:=21
Font.Color:=clWindowText
end
with UserInfoOrgLabel do begin
Left:=0
Top:=52
Width:=465
Height:=14
end
with UserInfoNameEdit do begin
Left:=0
Top:=16
Width:=465
Height:=21
Font.Color:=clWindowText
end
with UserInfoNameLabel do begin
Left:=0
Top:=0
Width:=465
Height:=14
end
end
with SelectDirPage do begin
with SelectDirBitmapImage do begin
Left:=0
Top:=0
Width:=32
Height:=32
Visible:=False
end
with DiskSpaceLabel do begin
Left:=0
Top:=340
Width:=465
Height:=14
end
with DirBrowseButton do begin
Left:=387
Top:=289
Width:=78
Height:=23
end
with DirEdit do begin
Left:=0
Top:=290
Width:=377
Height:=21
Font.Color:=clWindowText
end
with SelectDirBrowseLabel do begin
Left:=0
Top:=24
Width:=465
Height:=28
end
with SelectDirLabel do begin
Left:=0
Top:=0
Width:=465
Height:=14
end
end
with SelectComponentsPage do begin
with ComponentsDiskSpaceLabel do begin
Left:=0
Top:=340
Width:=417
Height:=14
end
with ComponentsList do begin
Left:=0
Top:=48
Width:=465
Height:=275
Font.Color:=65280
Color:=0
end
with TypesCombo do begin
Left:=0
Top:=24
Width:=465
Height:=21
Font.Color:=65280
Color:=0
end
with SelectComponentsLabel do begin
Left:=0
Top:=0
Width:=465
Height:=14
end
end
with SelectProgramGroupPage do begin
with SelectGroupBitmapImage do begin
Left:=0
Top:=0
Width:=32
Height:=32
Visible:=False
end
with NoIconsCheck do begin
Left:=0
Top:=312
Width:=377
Height:=20
Color:=clWindow
end
with GroupBrowseButton do begin
Left:=387
Top:=289
Width:=78
Height:=23
end
with GroupEdit do begin
Left:=0
Top:=290
Width:=377
Height:=21
Font.Color:=clWindowText
end
with SelectStartMenuFolderBrowseLabel do begin
Left:=0
Top:=24
Width:=465
Height:=28
end
with SelectStartMenuFolderLabel do begin
Left:=0
Top:=0
Width:=465
Height:=14
end
end
with SelectTasksPage do begin
with TasksList do begin
Left:=0
Top:=34
Width:=465
Height:=317
Color:=0
end
with SelectTasksLabel do begin
Left:=0
Top:=0
Width:=465
Height:=28
end
end
with ReadyPage do begin
with ReadyMemo do begin
Left:=0
Top:=34
Width:=465
Height:=317
Color:=0
end
with ReadyLabel do begin
Left:=0
Top:=0
Width:=465
Height:=28
end
end
with PreparingPage do begin
with PreparingErrorBitmapImage do begin
Left:=0
Top:=0
Width:=16
Height:=16
Visible:=False
end
with PreparingLabel do begin
Left:=24
Top:=0
Width:=393
Height:=14
Visible:=False
end
end
with InstallingPage do begin
with FilenameLabel do begin
Left:=0
Top:=16
Width:=465
Height:=16
end
with StatusLabel do begin
Left:=0
Top:=0
Width:=465
Height:=16
end
with ProgressGauge do begin
Left:=0
Top:=42
Width:=465
Height:=21
Min:=0
Max:=100
end
end
with InfoAfterPage do begin
with InfoAfterMemo do begin
Left:=0
Top:=24
Width:=465
Height:=327
ScrollBars:=ssVertical
end
with InfoAfterClickLabel do begin
Left:=0
Top:=0
Width:=465
Height:=14
end
end
end
with MainPanel do begin
Left:=0
Top:=0
Width:=690
Height:=496
with WizardSmallBitmapImage do begin
Left:=0
Top:=0
Width:=690
Height:=496
end
with PageDescriptionLabel do begin
Left:=25
Top:=25
Width:=500
Height:=14
Color:=0
Font.Color:=65280
end
with PageNameLabel do begin
Left:=15
Top:=7
Width:=500
Height:=14
Color:=0
Font.Color:=65280
end
end
end
with FinishedPage do begin
Color:=0
with WizardBitmapImage2 do begin
Left:=0
Top:=0
Width:=690
Height:=496
end
with NoRadio do begin
Left:=205
Top:=227
Width:=465
Height:=17
end
with YesRadio do begin
Left:=205
Top:=199
Width:=465
Height:=17
end
with RunList do begin
Left:=205
Top:=199
Width:=465
Height:=149
BorderStyle:=bsNone
end
with FinishedLabel do begin
Left:=205
Top:=119
Width:=465
Height:=53
end
with FinishedHeadingLabel do begin
Left:=205
Top:=79
Width:=465
Height:=24
Font.Color:=65280
Font.Size:=8
end
end
end
with BeveledLabel do begin
Left:=10
Top:=478
Width:=150
Height:=14
Enabled:=False
Color:=0
end
end
end;

Procedure InitializeWizard();
begin
WizardForm.FileNameLabel.Visible:= False;
end.

Serega 11-01-2009 17:18 1003859

Саш_ОК, вы используйте тег [more], а то ваше сообщение практически на всю страницу...
Цитата:

Цитата Саш_ОК
не хочет рабоать -работает только что то одно »

встречный вопрос, что должна делать команда WizardForm.FileNameLabel.Visible:= False;?
Скомпилировал скрипт и от использования данной команды ничего не изменилось...

Саш_ОК 11-01-2009 17:38 1003884

Спасибо учту!
а команда WizardForm.FileNameLabel.Visible:= False; даёт такой ефект что не видно куда и какие файли устанавливаются!
и получается взял с двух кодов параметри а работает только один постоянно ошибку пишет мол знак не такой в конце строки...
но я вроде в конуе строки поставил два раза end;end; и запело.
спс сам всё разрулил иззза своейже невнимательности.

Temik2009 13-01-2009 19:42 1006585

Подскажите плиз, как в Inno, в эти места вставить свои картинки

Serega 13-01-2009 19:59 1006597

Цитата:

Цитата Temik2009
вставить свои картинки »

[Setup]
...........
WizardImageFile=путь\картинка.bmp - размер 164х314
WizardSmallImageFile=путь\картинка.bmp - размер 55х55

Temik2009 13-01-2009 20:55 1006649

Serega_, Спасибо

boss911 13-01-2009 23:04 1006811

Temik2009

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

[Setup]
WizardImageFile=compiler:BigImage.bmp
WizardSmallImageFile=compiler:SmallImage.bmp


Temik2009 14-01-2009 15:24 1007432

Скажите, а что надо прописать, чтобы после установки на рабочем столе ярлык появился ?
И ещё вопросик, но не по Inno. Как сделать autorun с собственным дизайном (Чтобы картинка была и т.д.) и кнопки: Установить, Запустить, Прочитать, файл read me и установку дополнительных приложений?
Спасибо!

Serega 14-01-2009 16:08 1007475

Temik2009, для добавления ярлыка на рабочий стол, добавьте в скрипт:

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}

[Icons]
Name: {userdesktop}\My Program; Filename: {app}\My Program.exe; WorkingDir: {app}; Tasks: desktopicon


{userdesktop} - для данного пользователя;
{commondesktop} - для всех пользователей.

gvshil 14-01-2009 16:21 1007489

Цитата:

Цитата Temik2009
Как сделать autorun с собственным дизайном »

AutoPlay Media Studio, Multimedia Builder - очень не плохие.

Merlin_jr 16-01-2009 14:48 1009569

Уважаемые,
подскажите как удалить в папке назначения целый каталог средствами инсталлятора.

Удаление каталога должно происходить до начала распаковки файлов.

jameszero 16-01-2009 16:05 1009631

Merlin_jr
На примере удаления файла разберётесь?

[InstallDelete] имеет такой же синтаксис, как [UninstallDelete]
Последний рассмотрен в справке.

Merlin_jr 16-01-2009 16:43 1009669

Такая конструкция будет работать?

Код:

[InstallDelete]
Name: "{app}\CheckXML"; Type: filesandordirs
Name: "{app}\2-NDFL_test"; Type: filesandordirs

или надо так
Код:

[InstallDelete]
Type: filesandordirs; Name: "{app}\CheckXML"
Type: filesandordirs; Name: "{app}\2-NDFL_test"


boss911 16-01-2009 17:22 1009696

Цитата:

Цитата Merlin_jr
Такая конструкция будет работать? »

Да. Я бы воспользовался первым вариантом, хотя, должен сработать и второй, но первый привычнее (стандартней) выглядит.

Serega 16-01-2009 18:04 1009734

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

Merlin_jr 16-01-2009 18:08 1009738

Спасибо всем кто помогал.

Dimika 16-01-2009 18:21 1009751

Привет, столкнулся с проблемой. Помогите ПЛЗ.
Из секции Run запускаются три exe файла, которые хоже кое-что устанавливаю. Как сделать, чтобы прогресс-бар установки останавливался процентах на 70 и потом по 10 процентов на каждый из трех exe? И как обновлять позицию у прогресс-бара после того как запускаемый exe отработал?

Dimika 19-01-2009 13:35 1012551

Или как сделать отдельный прогресс-бар для инструкций с секции Run

i.Sky 20-01-2009 22:36 1014247

Подскажите пожалуйста как в одну секцию INI файла записать несколько разных значений ключа с одим именем? Нужен результат вида:
[Section]
NAME=1
NAME=2
NAME=3

Скрипт вида:
Filename: {app}\settings.ini; Section: Section; Key: NAME; String: 1; Components: 1
Filename: {app}\settings.ini; Section: Section; Key: NAME; String: 2; Components: 2
Filename: {app}\settings.ini; Section: Section; Key: NAME; String: 3; Components: 3

Просто переписывает значение NAME

Serega 20-01-2009 23:03 1014266

i.Sky, никак. Имя ключа одно и тоже, инсталлятор естественно и будет перезаписывать одно значение другим, в итоге останется последнее. Выход либо писать в разные секции, либо менять имя ключа...

i.Sky 21-01-2009 05:57 1014455

Serega_, спасибо за ответ быстрого реагирования :)
А может просто строки можно как-нибудь внести? Или сделать NAME(1), NAME(2), NAME(3), а потом убрать с них нумерацию? Только я не знаю как...

Serega 21-01-2009 08:39 1014490

Цитата:

Цитата i.Sky
строки можно как-нибудь внести »

только вручную...
Цитата:

Цитата i.Sky
Или сделать NAME(1), NAME(2), NAME(3), а потом убрать с них нумерацию? »

а как потом читать данные или записывать в .ini Восприниматься будет только первый NAME.

HQ-Team nuke 21-01-2009 11:22 1014580

Есть portable программа, а именно winamp, все отлично, за исключением одного, все расширения к нему привязываются лишь после запуска и захода в настройки, пробовал это делать средством AutoIt3, но как то это долго очень и не есть правельно, хотелось бы как то это запаковать в Inno Setup с дальнейшей тихой установкой и привязкой расширения к файлам, я скачал мануал по Inno Setup и наткнулся на привязку расширений, возможно ли мною задуманное, кто этим уже занимался, может подскажите что к чему, просто новичек в Inno Setup. Спасибо.

i.Sky 21-01-2009 11:25 1014583

А на Pascal можно реализовать написание такого INI файла? Может ли кто пример написать?

Serega 21-01-2009 12:18 1014631

Цитата:

Цитата i.Sky
А на Pascal можно реализовать написание такого INI файла? »

Вот накидал пример
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DisableProgramGroupPage=yes
DefaultGroupName=My Program
OutputDir=userdocs:Inno Setup Examples Output

[_Code]
procedure BuildINI();
begin
    SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini',
    '[Section]' + #13 + 'NAME=1' + #13 + 'NAME=2' + #13 + 'NAME=3' + #13, true);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssDone then
    BuildINI();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  begin
    DeleteFile(ExpandConstant('{app}\desktop.ini'));
  end;
end;


Serega 21-01-2009 12:43 1014655

Цитата:

Цитата HQ-Team nuke
в Inno Setup с дальнейшей тихой установкой и привязкой расширения к файлам »

Скажу честно, winamp ни разу не пересобирал... Я в своё время делал сборку IsoBuster и делал там ассоциации, выкинул лишнее, но принцип я думаю вам будет понятен
читать дальше »

;............................................................
[Tasks]
Name: a; Description: (*.ISO) Файлы-образы; GroupDescription: Выбор файловых ассоциаций:; Flags: unchecked
Name: b; Description: (*.BIN) Файлы-образы; GroupDescription: Выбор файловых ассоциаций:; Flags: unchecked
;............................................................

[Registry]
Root: HKCR; Subkey: IsoBuster.iso; ValueType: String; ValueData: ISO Image; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: IsoBuster.iso\DefaultIcon; ValueType: String; ValueData: {app}\IsoBuster.exe,1; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: IsoBuster.iso\shell\extract; ValueType: string; ValueData: Извлечь в IsoBuster; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: IsoBuster.iso\shell\extract\command; ValueType: String; ValueData: """{app}\IsoBuster.exe"" ""/ef:"" ""/c"" ""%1"""; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: IsoBuster.iso\shell\open; ValueType: string; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: IsoBuster.iso\shell\open\command; ValueType: String; ValueData: """{app}\IsoBuster.exe"" ""%1"""; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: .iso; ValueType: String; ValueData: IsoBuster.iso; Flags: uninsdeletevalue; Tasks: a
Root: HKCR; Subkey: IsoBuster.bin; ValueType: String; ValueData: BIN Image; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: IsoBuster.bin\DefaultIcon; ValueType: String; ValueData: {app}\IsoBuster.exe,1; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: IsoBuster.bin\shell\extract; ValueType: string; ValueData: Извлечь в IsoBuster; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: IsoBuster.bin\shell\extract\command; ValueType: String; ValueData: """{app}\IsoBuster.exe"" ""/ef:"" ""/c"" ""%1"""; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: IsoBuster.bin\shell\open; ValueType: string; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: IsoBuster.bin\shell\open\command; ValueType: String; ValueData: """{app}\IsoBuster.exe"" ""%1"""; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: .bin; ValueType: String; ValueData: IsoBuster.bin; Flags: uninsdeletevalue; Tasks: b
; ................................................................

HQ-Team nuke 21-01-2009 13:40 1014723

Цитата:

Цитата Serega_
Скажу честно, winamp ни разу не пересобирал... Я в своё время делал сборку IsoBuster и делал там ассоциации, выкинул лишнее, но принцип я думаю вам будет понятен »

Да мне его как раз и не нужно пересоберать, он имеет один исполняемый файл, при его запуске он создает возле исполняемого файла папку, в которой и хранит все свои настройки, т.е. другим языком как получился этот один файл: Установил Winamp, настроил, упаковал.
Да, мне понятен принцип привязки, немного разберусь в программе, попробую привязать, спасибо.

i.Sky 22-01-2009 05:22 1015474

Цитата:

Цитата Serega_
Вот накидал пример »

Спасибо. Сразу еще вопрос - как прикрутить зависимость от устанавливаемых компонентов к этому коду? Просто в секции [_Сode] ещё ни разу ничего не писал и не знаю что и как.

Serega 22-01-2009 17:36 1016029

Цитата:

Цитата i.Sky
как прикрутить зависимость от устанавливаемых компонентов »

В первом примере, как должно быть, т.е. значения будут перезаписываться.
Второй пример как вы хотели, т.е. просто в зависимости от выбора компонента будет добавлятся ещё одна строка.
1. Вариант
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Components]
Name: main; Description: Моя программа™; Types: full custom
Name: help; Description: Помощь; Types: full custom
Name: help\documentation; Description: Документация; Types: full custom
Name: help\manual; Description: Руководство пользователя; Types: full custom

[ Code ]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  If CurStep=ssDone then
  begin
    if IsComponentSelected('main') then
    SetIniString('Section', 'NAME', '1', ExpandConstant('{app}')+'\main.ini');

    if IsComponentSelected('help') then
    SetIniString('Section', 'NAME', '2', ExpandConstant('{app}')+'\main.ini');

    if IsComponentSelected('help\documentation') then
    SetIniString('Section', 'NAME', '3', ExpandConstant('{app}')+'\main.ini');

    if IsComponentSelected('help\manual') then
    SetIniString('Section', 'NAME', '4', ExpandConstant('{app}')+'\main.ini');
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  begin
    DeleteFile(ExpandConstant('{app}\main.ini'));
  end;
end;


2. Вариант
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Components]
Name: main; Description: Моя программа™; Types: full custom
Name: help; Description: Помощь; Types: full custom
Name: help\documentation; Description: Документация; Types: full custom
Name: help\manual; Description: Руководство пользователя; Types: full custom

[ Code ]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  If CurStep=ssDone then
  begin
    SaveStringToFile(ExpandConstant('{app}')+'\main.ini', '[Section]' + #13, true);

    if IsComponentSelected('main') then
    SaveStringToFile(ExpandConstant('{app}')+'\main.ini', 'NAME=1' + #13, true);

    if IsComponentSelected('help') then
    SaveStringToFile(ExpandConstant('{app}')+'\main.ini', 'NAME=2' + #13, true);

    if IsComponentSelected('help\documentation') then
    SaveStringToFile(ExpandConstant('{app}')+'\main.ini', 'NAME=3' + #13, true);

    if IsComponentSelected('help\manual') then
    SaveStringToFile(ExpandConstant('{app}')+'\main.ini', 'NAME=4' + #13, true);
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  begin
    DeleteFile(ExpandConstant('{app}\main.ini'));
  end;
end;


i.Sky 23-01-2009 05:55 1016493

Спасибо, Serega_. Процесс пошёл.

vserd 30-01-2009 18:34 1024738

Как можно отменить установку если произошла ошибка в CurStepChanged?

т.е.
Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then begin
    If AlarmFunc then begin
        {здесь должен быть некоторый код, который отменит установку.}
(*
        WizardForm.close;
        abort;
        этот код не отменяет устновку :(
*)
    end;
  end
end;


Serega 30-01-2009 18:59 1024757

Цитата:

Цитата vserd
Как можно отменить установку если произошла ошибка в CurStepChanged? »

Вы пытаетесь отменить установку уже после того как она произошла (ssPostInstall), т.е. надо посмотреть, если уже создан деинсталлятор, а он должен быть уже создан, то вызывать его с командой /verysilent...
А вообще до установки условие AlarmFunc проверить нельзя?

P.S.
WizardForm.close - закрывает инсталлятор, но никак не отменяет установку...

vserd 30-01-2009 19:12 1024768

Цитата:

Цитата Serega_
А вообще до установки условие AlarmFunc проверить нельзя? »

К сожалению низя :((

Serega 30-01-2009 20:38 1024838

vserd, придумал решение
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[ Code]
function NextButtonClick(CurPage: Integer): Boolean;
var
  ResultCode: Integer;
begin
  Result:=True;
  if CurPage=14 then
    If (FileSearch('Program.exe', ExpandConstant('{pf}'))='') then
  Exec(ExpandConstant('{uninstallexe}'), '/verysilent', ExpandConstant('{app}'), SW_HIDE, ewNoWait, ResultCode);
end;


Вместо проверки на присутствие файла, поставьте проверку вашего условия. Специально выложил целиком, чтоб вы проверили, как работает.
Успехов...

Drongo 02-02-2009 14:08 1027183

Доброго здоровья всем. Скажите, что и как нужно сделать, чтобы при установки была проверка, как на моём скрине:



Это с игры S.T.A.L.K.E.R сделал, у меня есть методички для этого компилятора, но там у себя не нашёл скриптов как сделать такую проверку. Если параметры железа подходят, вывести зелёным цветом индикацию и кнопку Далее > активизировать, а если что-то из этого не подходит, то красная полоса и деактивировать кнопку Далее >, ну как в игровом инсталяторе сделано.

Serega 02-02-2009 16:11 1027289

Drongo, вот нашёл у себя в примерах скриптов, кнопку ‘Далее’ сделал не активной, если требования не соответствуют.
В скрипте есть описания, разобраться, по крайней мере можно...
читать дальше »
Код:

[Setup]
AppName=Ultimate Test
AppVerName=Ultimate Test 1.0 Beta 1
DefaultDirName={pf}\Ultimate Test

[_Code]
type
 PDisplay_Device = record
  cb: DWord;
  DeviceName: array [0..31] of char;
  DeviceString: array [0..127] of char;
  StateFlags: DWord;
  DeviceID, DeviceKey: array [0..127] of char;
 end;

 TMixerCaps = record
  vPid, vDriverVersion: DWord;
  sName: array [0..31] of char;
  Support, cDestinations: DWord;
 end;

// Проверка версии Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
        {Win9x}       
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
    LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
    HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
        {WinNT}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
    LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
    LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
  oneMB = 1024*1024;
  NeedMHz = 1800;
  NeedVideoRAM = 128;
  NeedSoundCard = 'Creative X-Fi';
  NeedMB = 512;
  NeedPageFile = 1024;
 
var
  InfoPage: TWizardPage;
  TopText, BottomText: TNewStaticText;
  ChangeText: Boolean;
  SystemPanel, ProcessorPanel, VideoPanel,
  AudioPanel, RAMPanel, PageFilePanel: TMemo;
  SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
  AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  lpCaps: TMixerCaps;
  Version: TWindowsVersion;
  MemoryEx: TMemoryStatusEx;
  n, errCode: Integer;
  Keys: TArrayOfString;
  DeviceValue: Cardinal;
  lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
 external 'GetSystemMetrics@user32.dll stdcall';
 
function GetDeviceCaps(hDC, nIndex: Integer): Integer;
 external 'GetDeviceCaps@GDI32 stdcall';
 
function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
 external 'CreateDCA@GDI32 stdcall';
 
function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
 external 'EnumDisplayDevicesA@user32.dll stdcall';
 
function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
 external 'mixerGetDevCapsA@winmm.dll stdcall';
 
function mixerGetNumDevs: Integer;
 external 'mixerGetNumDevs@winmm.dll stdcall';

// Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
  if Abs(Bytes/Multiple) > Bytes/Multiple then
    Result := (Bytes/Multiple + 1)*Multiple
  else
    Result := Bytes
end;

// Перевод числа в значение Бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
 if not noMB then
    Result := FloatToStr(Int(Bytes)) + ' Мб'
 else
                if Bytes < 1024 then
      Result := FloatToStr(Int(Bytes)) + ' Бт'
    else
                        if Bytes/1024 < 1024 then
          Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Кб'
      else
                                        if Bytes/oneMB < 1024 then
            Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Мб'
          else
            if Bytes/oneMB/1000 < 1024 then
                Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Гб'
            else
                                                          Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Тб'
 StringChange(Result, ',', '.')
end;

// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin       
 while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1)
 Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
 Result := Lo
 if Lo < 0 then
    Result := Result + $7FFFFFFF + $7FFFFFFF + 2
 for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;
       
function CheckCPU(NeedMHz: Integer): Boolean;
var
  String: String;
begin
        String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys)        // Количество ядер
        for n := 0 to GetArrayLength(Keys)-1 do
      RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
        if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
        Exit
  else
    Result := True
end;
       
function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
        MemoryEx.dwLength := SizeOf(MemoryEx)
        if not GlobalMemoryStatusEx(MemoryEx) then
        MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
  else
          if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
        Exit
    else
        Result := True
end;
       
procedure CreateCheckForm();
begin

  TopText := TNewStaticText.Create(InfoPage)
  with TopText do
  begin
    Parent := InfoPage.Surface
    Left := 0
    AutoSize := True
  end

  BottomText := TNewStaticText.Create(InfoPage)
  with BottomText do
  begin
    Parent := InfoPage.Surface
    Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».'
    Font.Color := clBlack
    Left := 0
    Top := 200
    AutoSize := True
  end

  SystemPanel := TMemo.Create(InfoPage)
  with SystemPanel do
  begin
    Text := 'Система'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ScaleY(33)
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  SystemVersionPanel := TMemo.Create(InfoPage)
  with SystemVersionPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := SystemPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  ProcessorPanel := TMemo.Create(InfoPage)
  with ProcessorPanel do
  begin
    Text := 'Процессор'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := SystemPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  ProcessorMHzPanel := TMemo.Create(InfoPage)
  with ProcessorMHzPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := ProcessorPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  VideoPanel := TMemo.Create(InfoPage)
  with VideoPanel do
  begin
    Text := 'Видеоадаптер'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ProcessorPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  VideoRAMPanel := TMemo.Create(InfoPage)
  with VideoRAMPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := VideoPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  AudioPanel := TMemo.Create(InfoPage)
  with AudioPanel do
  begin
    Text := 'Звуковая карта'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := VideoPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  AudioNamePanel := TMemo.Create(InfoPage)
  with AudioNamePanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := AudioPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  RAMPanel := TMemo.Create(InfoPage)
  with RAMPanel do
  begin
    Text := 'Объём памяти'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := AudioPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  RAMTotalPanel := TMemo.Create(InfoPage)
  with RAMTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := RAMPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  PageFilePanel := TMemo.Create(InfoPage)
  with PageFilePanel do
  begin
    Text := 'Файл подкачки'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := RAMPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end;

  PageFileTotalPanel := TMemo.Create(InfoPage)
  with PageFileTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := PageFilePanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

end;

procedure UpdateInfo();
var
  DeviceName, DeviceKey: String;
begin
  ChangeText := False

  GetWindowsVersionEx(Version)
 
  // Операционная система:
  SystemVersionPanel.Color := $CCFFCC
 
  DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
  if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
        RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
  if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
    DeviceName := DeviceName + ' ' + DeviceKey
        StringChange(DeviceName, 'Microsoft ', '')
  SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
                            '.' + IntToStr(Version.Build)
                           
  if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and  // Windows 2000 SP4
    (Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and  // Windows XP SP2
    (Pos('Vista', SystemVersionPanel.Text) = 0) then  // Windows Vista (c любым SP или без него)
    begin
      SystemVersionPanel.Color := $CCCCFF
      ChangeText := True
    end
 
  // Процессор:
  ProcessorMHzPanel.Color := $CCFFCC
 
  if not CheckCPU(NeedMHz) then
    begin
      ProcessorMHzPanel.Color := $CCCCFF
      ChangeText := True
    end
   
  ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
  if GetArrayLength(Keys) > 1 then
    ProcessorPanel.Text := 'Процессоры' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

  // Видеокарта:
  VideoRAMPanel.Color := $CCFFCC
 
  lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
  DeviceKey := ''
        n := 0
  while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
            (lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
        for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
  Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127)  // Ключ драйвера получаем из API
        StringChange(DeviceKey, '\Registry\Machine\', '')
  errCode := 1
  DeviceValue := 0       
  if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
                for n := 1 to Length(DeviceName) do
      begin
        DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
        errCode := errCode*$100
      end
  else
    if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
    else
        RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
        DeviceName := ''
  for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
  Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

  if DeviceName <> '' then
    if DeviceValue > 0 then
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
    else
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
  else
    begin
      VideoRAMPanel.Text := ' Драйвер устройства не обнаружен'
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  if (DeviceValue/oneMB < NeedVideoRAM) then
    begin
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
                        IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
                        GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

  // Звуковая карта:
  AudioNamePanel.Color := $CCFFCC
 
  // for errCode := 0 to 1 do  // Вывод основного звукового устройства
  for errCode := 0 to mixerGetNumDevs do
    begin
                  mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
      DeviceName := ' '
                  for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
      Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
      Delete(DeviceName, Pos(' [', DeviceName), 31)
      StringChange(DeviceName, 'SB ', 'Creative ')
      Delete(DeviceName, Pos(' Audio', DeviceName), 31)
                  SetArrayLength(Keys, errCode)
      if errCode > 0 then Keys[errCode-1] := DeviceName
    end

        if GetArrayLength(Keys) > 1 then
    begin
    AudioPanel.Text := 'Звуковые карты'
    // AudioPanel.Text := 'Звуковые карты (' + IntToStr(GetArrayLength(Keys)) +')'
    AudioNamePanel.Text := ''
    for n := 1 to GetArrayLength(Keys) do
        AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1]  // + '(' + IntToStr(n) + ')'
    end
  else
    if GetArrayLength(Keys) = 0 then
    begin
      AudioNamePanel.Text := ' Драйвер устройства не обнаружен'
      AudioNamePanel.Color := $CCCCFF
      ChangeText := True
    end
      else
      AudioNamePanel.Text := Keys[0]
  if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
    AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')'

  // Объём памяти:
    RAMTotalPanel.Color := $CCFFCC
  if not CheckMemorySize(NeedMB) then
    begin
      RAMTotalPanel.Color := $CCCCFF
      ChangeText := True
    end
  RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' всего, ' +
                              ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
                                                        Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' используется, ' +
                              ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' свободно'
 
  // Виртуальная память:
  PageFileTotalPanel.Color := $CCFFCC
  PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' всего, ' +
                                  ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
                                            Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' занято системным кэшем'
  if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
    begin
      PageFileTotalPanel.Color := $CCCCFF
      ChangeText := True
    end
 
  if ChangeText = True then
    begin
      TopText.Top := 0
      TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям игры.' #13
                        'Пожалуйста, проверьте позиции, выделенные красным цветом.'
      TopText.Font.Color := clRed
      WizardForm.NextButton.Enabled := False
    end
  else
    begin
      TopText.Caption := 'Все компоненты соответствуют минимальным требованиям игры.'
      TopText.Font.Color := clGreen
      TopText.Top := 8
      WizardForm.NextButton.Enabled := True
    end
end;

procedure InitializeWizard();
begin
  InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
                                          'Программа установки обнаружила следующие наобходимые компоненты.')
  CreateCheckForm()  // Создание объектов TMemo, в которых будет выводится информация о системе
  UpdateInfo()  // Обновление информации о системе
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = InfoPage.ID then UpdateInfo()  // Обновление информации о системе
end;


Drongo 02-02-2009 17:44 1027395

Честно говоря, я не разбираюсь в этом синтаксисе, но у меня ругается при попытке скомпилировать, на этих строках, которые начинаются символом '#'.
Код:

// Проверка версии Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1        {Win9x}       
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
    LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
    HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
        {WinNT}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
    LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
    LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

Раньше необходимости подключать скрипты не было, теперь вот незнаю правильно ли делаю или нет?
Код:

...
[Files]
Source: "D:\Контроль\MyNameProgram\MyProgram.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Контроль\MyNameProgram\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; Внимание: Не используйте "Флажок : Игнор. версии" на систем. файл

[code]
 // Вставить код написанный Serega_
...


Serega 02-02-2009 18:49 1027472

Цитата:

Цитата Drongo
у меня ругается при попытке скомпилировать, на этих строках »

Потому, что у вас не установлен preprocessor, извиняюсь, что сразу не сказал... :wink:
Цитата:

Цитата Drongo
вот незнаю правильно ли делаю или нет? »

Всё правильно... Вообще можно кавычки не ставить, они не обязательны и первая строка в секции [Files] тоже не обязательна, т.к. вы всё равно копируете всю папку, т.е. у вас записано всё правильно, но я бы написал:
читать дальше »
Код:

...
[Files]
Source: D:\Контроль\MyNameProgram\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs

[ Code]
 // Вставить код, но он написан не Serega_... :)
...


P.S.
Я бы ещё рекомендовал скачать и установить расширенную версию для Inno Setup от ResTools, очень полезная вещь, расширяет возможности Inno Setup...

Саш_ОК 02-02-2009 22:44 1027718

Ребята а не скажите как зделать так чтоб инсталятор нёс какойто файлик в котором указана версия программи и последнюю дату установки -и что б при установки нового подобного инсталятора (обновления) -видавалось сообщение о версии проги и о версии проги чято устанавливется!!
БУДУ НУ ОЧЕНЬ БЛАГОДАРЕН!

Serega 03-02-2009 00:29 1027804

Саш_ОК, непонятен вопрос... какой файл должен нести инсталлятор? Вы хотите создать файл в момент инсталляции в папке с приложением, а при установке обновления считать из него данные? Какая преследуется цель, запретить установку, если версия не соответствует или просто вывести сообщение о версии установленного файла?

Drongo 03-02-2009 15:22 1028315

Serega_, Тут такой небольшой вопрос по коду, всё скачал, всё сделал - скомпилировал, получилось даже лучше чем ожидалось, :up
результат:




Как, где и на что сменить строку кода, чтобы параметры Системы подошли? :dont-know

Извиняюсь за поспешность, решил методом "тыка". :yes: В коде отсутстует строка для XP Service Pack 3, будем считать это домашним заданием. :)
Код:

...
  if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and  // Windows 2000 SP4
    (Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and  // Windows XP SP2
    (Pos('XP Service Pack 3', SystemVersionPanel.Text) = 0) and  // Windows XP SP3
...


Получилось!!! ))))

Serega 03-02-2009 15:28 1028320

Drongo, :up

Саш_ОК 03-02-2009 20:05 1028616

Цитата:

Serega
Я незнаю как зделать так чтоб когда человек установил мою прогу (назвём её №1) и попользоввшись ней период времени -он скачивает обновление в виде exe файла которий по ходу установки -находит (КАКОЙТО ФАЙЛ- а какой и как его зделать я незнаю - но думаю может с помощью рееста и ещё думаю ВЫ подскажите) - программа викидывает окошко с надписью мол у Вас страрая версия такая-такаято -мол установить новую ???? ДА НЕТ.
Я понятно написали или как всегда)

Drongo 03-02-2009 21:17 1028705

Цитата:

Цитата Саш_ОК
Я понятно написали или как всегда) »

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

Serega 03-02-2009 22:37 1028804

Саш_ОК,
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={code:GetInstallPath}
OutputDir=.

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {code:GetInstallPath}

[_Code]
// Берём путь установки программы из реестра
function GetInstallPath( AppID: String ): String;
var
  Path: String;
begin
  Path:= '';
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','InstallLocation', Path);
  Result:= Path;
end;

function InitializeSetup(): Boolean;
var
  Version,s:string;

begin
  Result:=True;
  //  Проверка установлена ли программа, через реестр
  if not RegValueExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','InstallLocation') then
  begin
    s:='Программа MY_PROGRAM не установлена или установлена неверно.' #13#13 'Дальнейшая работа мастера невозможна.';
    MsgBox(s, mbError, mb_Ok);
    Result:=False;
  end else
  //  Проверка присутствия файла в папке с установленной программой
  begin
  If (FileSearch('MyProg.exe', ExpandConstant('{code:GetInstallPath}'))='') then
    begin
      s:='Извините, в директории '+ExpandConstant('{code:GetInstallPath}')+'' #13 'не обнаружены файлы, подтверждающие подлинность программы.' #13#13 'Пожалуйста, выберите правильный путь для установки обновления.';
      MsgBox(s, mbError, mb_Ok);
      Result:= False;
    end else
      // И проверка версии оригинальных файлов
    begin
      GetVersionNumbersString(ExpandConstant('{code:GetInstallPath}\MyProg.exe'), Version);
      if Version < '1.5' then
      begin
        s:='У Вас страрая версия такая-такаято -мол установить новую ????';
        if MsgBox(s, msgButtonInstall, mb_yesno) = idNo then
      begin
        Result:= False;
        exit;
      end else
        Result:=True;
      end;
    begin
      if Version >= '1.5' then
      begin
        s:='Обновление не требуется!';
        MsgBox(s, msgButtonOK, mb_ok);
        Result:= False;
        exit;
      end;
    end;
    end;
  end;
end;


Саш_ОК 03-02-2009 22:55 1028818

Цитата:

Цитата Serega_
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','InstallLocation', Path); »

а как такой файлик создать?
СПАСИБО ВАМ!!!!!!

Serega 03-02-2009 23:25 1028854

Саш_ОК, этот ключ в реестре, создаст ваш первый инсталлятор, а я вам написал код уже для обновления данной программы...
Чтоб попробовать, как работает данный скрипт, закомментируйте всю секцию [code], скомпилируйте и произведите установку. Затем раскомментируйте секцию и снова скомпилируйте, я думаю вам всё станет ясно как он работает...

x-net 06-02-2009 15:52 1031371

Как сделать что бы было как на рисунке?
Готовый скрипт можно будет, только не в стиле InstallShield

Serega 06-02-2009 20:53 1031628

Вложений: 1
x-net, вот накидал вам пример...
По поводу формы, скорей всего используется Skin Builder.

x-net 06-02-2009 21:47 1031672

Сделал, но как убрать белый фон, оставив только текст с графикой

Serega 07-02-2009 01:59 1031805

x-net, а конкретно, что вы сделали, т.е. что применили из того, что я вам дал? Этот скриншот вы показывали ещё 5 февраля на другом форуме и в нём ничего не поменялось...
Сразу второй скриншот и надо было паказать... добавьте в procedure InitializeWizard(); после begin
читать дальше »
Код:

// скрываем надписи
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
// загружаем на форму рисунок
  WizardForm.WizardBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\ваш.bmp'));
// растягиваем рисунок по всей форме, если он у вас уже такой какой вы хотите, то удалите эту строку
  WizardForm.WizardBitmapImage.Align:=true;

// создаём надписи поверх рисунка
    WelcomeLabel1 := TLabel.Create(WizardForm);
    WelcomeLabel1.Left := 150;
    WelcomeLabel1.Top := 30;
    WelcomeLabel1.Width := 310;
    WelcomeLabel1.Height := 28;
    WelcomeLabel1.AutoSize := False;
    WelcomeLabel1.WordWrap := True;
    WelcomeLabel1.Font.Style := [fsBold];
    WelcomeLabel1.Font.Color := clBlack;
    WelcomeLabel1.Transparent := True;
    WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
    WelcomeLabel1.Parent := WizardForm.WelcomePage;

  WelcomeLabel2:=TLabel.Create(WizardForm);
  WelcomeLabel2.Left := 150;
  WelcomeLabel2.Top := 70;
  WelcomeLabel2.Width := 310;
  WelcomeLabel2.Height := 200;
  WelcomeLabel2.AutoSize := False;
  WelcomeLabel2.WordWrap := True;
  WelcomeLabel2.Font.Color := clBlack;
  WelcomeLabel2.Transparent := True;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  WelcomeLabel2.Parent := WizardForm.WelcomePage;


tem000 19-02-2009 14:15 1043165

Всем привет!!! Подскажите кто знает, можно ли вставить свою картинку не 50х50 а на всю длинну в этот
и можно ли сделать чтобы отображался одинаковый шрифт и одна и та же картинка в диалоге при начале установки и в диалоге завершения установки

boss911 19-02-2009 17:37 1043335

tem000

Если я правильно понял справку IS, то шрифты можно менять так:
Код:

[LangOptions]
LanguageName=English
LanguageID=$0409
LanguageCodePage=0
DialogFontName= MS Shell Dlg
DialogFontSize=8
WelcomeFontName=Verdana
WelcomeFontSize=12
TitleFontName=Arial
TitleFontSize=29
CopyrightFontName=Arial
CopyrightFontSize=8


Serega 19-02-2009 21:15 1043501

Цитата:

Цитата tem000
Подскажите кто знает »

Накидал пример
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

Code]
var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;

procedure InitializeWizard();
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.PageNameLabel.Hide;
  WizardForm.PageDescriptionLabel.Hide;
  WizardForm.FinishedHeadingLabel.Hide;
  WizardForm.FinishedLabel.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(150);
  WelcomeLabel1.Top := ScaleY(15);
  WelcomeLabel1.Width := ScaleX(320);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clBlack;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 14;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

      WelcomeLabel2:=TLabel.Create(WizardForm);
      WelcomeLabel2.Left := ScaleX(150);
      WelcomeLabel2.Top := ScaleY(90);
      WelcomeLabel2.Width := ScaleX(320);
      WelcomeLabel2.Height := ScaleY(200);
      WelcomeLabel2.AutoSize := False;
      WelcomeLabel2.WordWrap := True;
      WelcomeLabel2.Font.Color := clBlack;
      WelcomeLabel2.Font.Size := 8;
      WelcomeLabel2.Transparent := True;
      WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clBlack;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clBlack;
      PageDescriptionLabel.Transparent := True;
      PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(150);
  FinishedHeadingLabel.Top := ScaleY(15);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clBlack;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
//  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(150);
      FinishedLabel.Top := ScaleY(90);
      FinishedLabel.Width := ScaleX(320);
      FinishedLabel.Height := ScaleY(200);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clBlack;
      FinishedLabel.Font.Size := 8;
      FinishedLabel.Transparent := True;
      FinishedLabel.Parent := WizardForm.FinishedPage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
end;


tem000 19-02-2009 23:15 1043587

Serega_, УРА!!! усе работает :yahoo: , большое человеческое спасибо, будем творить красоту :laugh:

Merlin_jr 20-02-2009 12:09 1043881

Приветствую

Подскажите как правильно/корректно реализовать проверку принадлежности Пользователя системы к группе Локальных администраторов на компьютере?

планируется использовать на системах от Win9x и до WinVista. У клиентов разные ОСи стоят.

tem000 20-02-2009 19:28 1044278

Serega_, небольшая трабла в завершении установки, там можно как нибудь прозрачность замутить, помоги если не трудно, а то я в секции CODE ваще ниче не понимаю.

Serega 20-02-2009 22:42 1044443

Цитата:

Цитата tem000
небольшая трабла в »

пример:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}

Code]
var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
// процедура для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin
    if RunMyProg.Checked then
    Exec(ExpandConstant('{app}\MyProg.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.PageNameLabel.Hide;
  WizardForm.PageDescriptionLabel.Hide;
  WizardForm.FinishedHeadingLabel.Hide;
  WizardForm.FinishedLabel.Hide;
// низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
  WizardForm.RunList.Height := 0;
  WizardForm.RunList.Width := 0;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(150);
  WelcomeLabel1.Top := ScaleY(15);
  WelcomeLabel1.Width := ScaleX(320);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clBlack;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 14;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

      WelcomeLabel2:=TLabel.Create(WizardForm);
      WelcomeLabel2.Left := ScaleX(150);
      WelcomeLabel2.Top := ScaleY(90);
      WelcomeLabel2.Width := ScaleX(320);
      WelcomeLabel2.Height := ScaleY(200);
      WelcomeLabel2.AutoSize := False;
      WelcomeLabel2.WordWrap := True;
      WelcomeLabel2.Font.Color := clBlack;
      WelcomeLabel2.Font.Size := 8;
      WelcomeLabel2.Transparent := True;
      WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clBlack;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clBlack;
      PageDescriptionLabel.Transparent := True;
      PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(150);
  FinishedHeadingLabel.Top := ScaleY(15);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clBlack;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
//  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(150);
      FinishedLabel.Top := ScaleY(90);
      FinishedLabel.Width := ScaleX(320);
      FinishedLabel.Height := ScaleY(200);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clBlack;
      FinishedLabel.Font.Size := 8;
      FinishedLabel.Transparent := True;
      FinishedLabel.Parent := WizardForm.FinishedPage;

  RunMyProg := TCheckBox.Create(WizardForm);
  RunMyProg.Parent := WizardForm.FinishedPage;
  RunMyProg.Left := ScaleX(150);
  RunMyProg.Top := ScaleY(152);
  RunMyProg.Width := ScaleX(14);
  RunMyProg.Height := ScaleX(14);
//  RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

      RunLabel:=TLabel.Create(WizardForm);
      RunLabel.Left := ScaleX(170);
      RunLabel.Top := ScaleY(150);
      RunLabel.Width := ScaleX(200);
      RunLabel.Height := ScaleY(20);
      RunLabel.AutoSize := False;
      RunLabel.WordWrap := True;
      RunLabel.Font.Color := clBlack;
      RunLabel.Font.Size := 10;
      RunLabel.Transparent := True;
      RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить программу';
end;


tem000 20-02-2009 23:31 1044485

Serega_, все работает единственное чекбокс активируется только при наведении на сам квадратик. В других диалогах, можно нажать на текст чтобы поставить галочку, это понятно если чекбокс растягивать на текст, то опять получится белое пятно. В принципе это не критично, главное все получилось СПАСИБО!!! :tongue:

Serega 21-02-2009 00:02 1044515

tem000, я как то об этом не подумал, добавил
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}

Code]
var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin
    if RunMyProg.Checked then
    Exec(ExpandConstant('{app}\MyProg.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.PageNameLabel.Hide;
  WizardForm.PageDescriptionLabel.Hide;
  WizardForm.FinishedHeadingLabel.Hide;
  WizardForm.FinishedLabel.Hide;
// низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
  WizardForm.RunList.Height := 0;
  WizardForm.RunList.Width := 0;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(150);
  WelcomeLabel1.Top := ScaleY(15);
  WelcomeLabel1.Width := ScaleX(320);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clBlack;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 14;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

      WelcomeLabel2:=TLabel.Create(WizardForm);
      WelcomeLabel2.Left := ScaleX(150);
      WelcomeLabel2.Top := ScaleY(90);
      WelcomeLabel2.Width := ScaleX(320);
      WelcomeLabel2.Height := ScaleY(200);
      WelcomeLabel2.AutoSize := False;
      WelcomeLabel2.WordWrap := True;
      WelcomeLabel2.Font.Color := clBlack;
      WelcomeLabel2.Font.Size := 8;
      WelcomeLabel2.Transparent := True;
      WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clBlack;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clBlack;
      PageDescriptionLabel.Transparent := True;
      PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(150);
  FinishedHeadingLabel.Top := ScaleY(15);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clBlack;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
//  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(150);
      FinishedLabel.Top := ScaleY(90);
      FinishedLabel.Width := ScaleX(320);
      FinishedLabel.Height := ScaleY(200);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clBlack;
      FinishedLabel.Font.Size := 8;
      FinishedLabel.Transparent := True;
      FinishedLabel.Parent := WizardForm.FinishedPage;

  RunMyProg := TCheckBox.Create(WizardForm);
  RunMyProg.Parent := WizardForm.FinishedPage;
  RunMyProg.Left := ScaleX(150);
  RunMyProg.Top := ScaleY(152);
  RunMyProg.Width := ScaleX(14);
  RunMyProg.Height := ScaleX(14);
//  RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

      RunLabel:=TLabel.Create(WizardForm);
      RunLabel.Left := ScaleX(170);
      RunLabel.Top := ScaleY(150);
      RunLabel.Width := ScaleX(200);
      RunLabel.Height := ScaleY(20);
      RunLabel.AutoSize := False;
      RunLabel.WordWrap := True;
      RunLabel.Font.Color := clBlack;
      RunLabel.Font.Size := 10;
      RunLabel.OnClick := @RLabelOnClick;
      RunLabel.Transparent := True;
      RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить программу';
end;


tem000 21-02-2009 13:42 1044801

Serega_, ну ты крут!!! РЕСПЕКТ :teeth: :teeth: :teeth:

de_MAX 23-02-2009 14:50 1046433

Serega_, а есть возможность добавить в скрипт, чтоб и во время установки тоже была картинка (возможно смещение прогрессбара вниз и показ слайд-шоу в окне инсталлятора)?

Serega 23-02-2009 16:05 1046500

Цитата:

Цитата de_MAX
чтоб и во время установки тоже была картинка (возможно смещение прогрессбара вниз и показ слайд-шоу в окне инсталлятора)? »

Вы имеете ввиду

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

de_MAX 23-02-2009 16:23 1046510

Цитата:

Цитата Serega_
Вы имеете ввиду
так? »

Именно так. Но насколько я знаю это именно прогрессбар установки. Где-то встречал подобный скрипт, но не могу найти.

Serega 23-02-2009 16:45 1046528

de_MAX, не знаю, надо подумать...

de_MAX 26-02-2009 12:09 1049265

Serega_, нашел нечто подобное. Там конечно много всего лишнего.
читать дальше »
Код:

Code]
////////////////////////////////////////////////////
{Установка слайдшоу на окне инсталятора}
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  URLLabel: TNewStaticText;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;
///////////////////////////////////////////////////
const
  BASS_SAMPLE_LOOP        = 4;  //повторение

type
  HSTREAM = DWORD;      //тип звукового потока

function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';

function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function  BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

function  BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';
///////////////////////////////
var
  state, soft: boolean;
  Image1, Image2: TBitmapImage;
const
  NeedSize = 6;
  DRIVE_UNKNOWN = 0;
  DRIVE_NO_ROOT_DIR = 1;
  DRIVE_REMOVEABLE = 2;
  DRIVE_FIXED = 3;
  DRIVE_REMOTE = 4;
  DRIVE_CDROM = 5;
  DRIVE_RAMDISK = 6;

var
  ListBox: TListBox;

function GetLogicalDrives: DWORD;
  external 'GetLogicalDrives@kernel32.dll stdcall';

function GetDriveType(nDrive: string): Longint;
  external 'GetDriveTypeA@kernel32.dll stdcall';

function GetVideoCardName(): PChar;
  external 'hwc_GetVideoCardName@files:get_hw_caps.dll stdcall';

function GetSoundCardName(): PChar;
  external 'hwc_GetSoundCardName@files:get_hw_caps.dll stdcall';

function DetectHardware(): Integer;
  external 'hwc_DetectHardware@files:get_hw_caps.dll stdcall';

function GetHardDriveFreeSpace(hdd: integer): Integer;
  external 'hwc_GetHardDriveFreeSpace@files:get_hw_caps.dll stdcall';

function GetHardDriveName(hdd: integer): PChar;
  external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall';

function GetHardDriveTotalSpace(hdd: integer): Integer;
  external 'hwc_GetHardDriveTotalSpace@files:get_hw_caps.dll stdcall';

function GetHardDrivesCount(): Integer;
  external 'hwc_GetHardDrivesCount@files:get_hw_caps.dll stdcall';

function GetSoundCards(): Integer;
  external 'hwc_GetSoundCards@files:get_hw_caps.dll stdcall';

function GetSystemPage(): Integer;
  external 'hwc_GetSystemPage@files:get_hw_caps.dll stdcall';

function GetSystemPhys(): Integer;
  external 'hwc_GetSystemPhys@files:get_hw_caps.dll stdcall';

function GetVidMemLocal(): Integer;
  external 'hwc_GetVidMemLocal@files:get_hw_caps.dll stdcall';

function GetVidMemNonLocal(): Integer;
  external 'hwc_GetVidMemNonLocal@files:get_hw_caps.dll stdcall';

function GetVideoCardDev(): Integer;
  external 'hwc_GetVideoCardDev@files:get_hw_caps.dll stdcall';

function GetVideoCardVen(): Integer;
  external 'hwc_GetVideoCardVen@files:get_hw_caps.dll stdcall';

function DelSp(const s: string): string; // функция удаления пробелов в начале строки
var
  c, i: integer;
  stt, st, st1: string;
begin
  c := 0;
  st := s;

  for i := 1 to Length(st) do
  begin

    stt := copy(st, i, 1);
    if (stt = ' ') and (c >= 1) then
    begin
      st1 := st1;
      c := c + 1;
    end
    else if (stt = ' ') and (c = 0) then
    begin
      c := c + 1;
      st1 := st1 + stt;
    end
    else if (stt <> ' ') then
    begin
      c := 0;
      st1 := st1 + stt;
    end
  end;

  Result := st1;
end;

procedure URLLabelOnClick(Sender: TObject);
var
  ErrorCode: Integer;
begin
  ShellExec('open', 'http://game-torrent.info', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;

procedure ListBoxOnClick(Sender: TObject);
var
  NewLetter, OldString: string;
  i: Integer;
begin
  for i := 0 to ListBox.Items.Count - 1 do
  begin
    if ListBox.Selected[i] then
    begin
      NewLetter := Copy(ListBox.Items[i], 0, 1);
      OldString := Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text));
      WizardForm.DirEdit.Text := NewLetter + OldString;
    end;
  end;
end;


procedure InitializeWizard();
var
  Name1: string;
  i: Integer;
  Text: TNewStaticText;
  Path: string;
  FreeMB, TotalMB: Cardinal;
  drives: DWORD;

begin
  ExtractTemporaryFile('BASS.dll');
    ExtractTemporaryFile('my.mp3');
  if BASS_Init(-1, 44100, 0, 0, 0) then
begin
  BASS_Start();
  Name1:=ExpandConstant('{tmp}\my.mp3');
    i:=BASS_StreamCreateFile(FALSE, PChar(Name1), 0, 0, 4);
  if i <> 0 then
        begin
  BASS_ChannelPlay(i, True);
end
end

///////////////////////////////////////////////////////////
{Изменение окна инсталятора с пермещение прогрессбара}
  ExtractTemporaryFile('Image_1.bmp');
  ExtractTemporaryFile('Image_2.bmp');
  ExtractTemporaryFile('Image_3.bmp');
  ExtractTemporaryFile('Image_4.bmp');
  ExtractTemporaryFile('Image_5.bmp');
  ExtractTemporaryFile('Image_6.bmp');
  ExtractTemporaryFile('Image_7.bmp');
  ExtractTemporaryFile('Image_8.bmp');
  ExtractTemporaryFile('Image_9.bmp');
  ExtractTemporaryFile('Image_10.bmp');

  currTime := 0;

  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + 10;
  WizardForm.ProgressGauge.Left := ScaleX(10);
  WizardForm.ProgressGauge.Width := WizardForm.Width - WizardForm.CancelButton.Width - ScaleX(40);
  WizardForm.ProgressGauge.Height := 12;
  WizardForm.ProgressGauge.Hide;
  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := WizardForm.ProgressGauge.Width;
  WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
  WizardForm.StatusLabel.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
  SplashImage.Hide;
///////////////////////////////////////////////////////////

  URLLabel := TNewStaticText.Create(WizardForm);
  URLLabel.Caption := 'Special for Game-Torrent.info';
  URLLabel.Cursor := crHand;
  URLLabel.OnClick := @URLLabelOnClick;
  URLLabel.Parent := WizardForm;
  { Alter Font *after* setting Parent so the correct defaults are inherited first }
  URLLabel.Font.Style := URLLabel.Font.Style + [fsUnderline];
  URLLabel.Font.Color := clBlue;
  URLLabel.Top :=  330;
  URLLabel.Left := 30;

  ExtractTemporaryFile('Welcome.bmp')
  ExtractTemporaryFile('Finish.bmp')
  WizardForm.WizardSmallBitmapImage.Top:=0
  WizardForm.WizardSmallBitmapImage.Left:=0
  WizardForm.WizardSmallBitmapImage.Width:=498
  WizardForm.WizardSmallBitmapImage.Height:=58
  WizardForm.PageNameLabel.Visible:=false
  WizardForm.PageDescriptionLabel.Visible:=false
  WizardForm.FinishedLabel.Visible:=False
  WizardForm.FinishedHeadingLabel.Visible:=False
  WizardForm.WelcomeLabel1.Visible:=False
  WizardForm.WelcomeLabel2.Visible:=False
  Text := TNewStaticText.Create(WizardForm);
  Text.Top := 102;
  Text.Width := 332;
  Text.Height := 14;
  Text.Caption := 'Список жестких дисков и свободного места';
  Text.Parent := WizardForm.SelectDirPage;

  ListBox := TListBox.Create(WizardForm);
  ListBox.Top := 120;
  ListBox.Width := 332;
  ListBox.Height := ScaleY(90);
  ListBox.Parent := WizardForm.SelectDirPage;
  ListBox.OnClick := @ListBoxOnClick;
  ListBox.Font.Name := 'Courier New';
  ListBox.Font.Size := 10;
  ListBox.Font.Style := [fsBold];
  ListBox.Color := clBtnFace;

  drives := GetLogicalDrives();
  for i := 0 to 31 do
  begin
    if (drives and (1 shl i)) > 0 then
    begin
      Path := chr(ord('A') + i) + ':\';
      if GetDriveType(Path) = DRIVE_FIXED then
      begin
        GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
        if FreeMB>1024 then ListBox.Items.Add(Path + '  ' + IntToStr(round(FreeMB / TotalMB * 100)) + '%  ' + floatToStr(round(FreeMB/1024*100)/100) + ' GB')
        else ListBox.Items.Add(Path + '  ' + IntToStr(round(FreeMB / TotalMB * 100)) + '%  ' + IntToStr(FreeMB) + ' MB');
      end;
    end;
  end;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
var
  Path,s,z: String;
  FreeMB, TotalMB: Cardinal;
begin
  Result:= True;
  if CurPageID = wpSelectDir then
    begin
      Path:= ExtractFileDrive(WizardForm.DirEdit.Text);
      GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
      if FreeMB < (NeedSize*1024) then
    begin
      if FreeMB>1024 then
      begin
      s:='Для установки приложения необходимо '+ IntTostr(NeedSize)+ ' GB,'#13+'а на выбранном Вами диске доступно только '+ floatToStr(round(FreeMB/1024*100)/100) + ' GB!'
      end
        else s:='Для установки приложения необходимо '+ IntTostr(NeedSize)+ ' GB,'#13+'а на выбранном Вами диске доступно только '+ + IntToStr(FreeMB)+' MB';
      MsgBox(s, mbCriticalError, MB_OK)
        Result := False;
    end;
    end;
////////////////////////////////
begin
if CurPageID = wpUserInfo then
begin
Result:=true;
if not state
or not soft
then
begin
z:='Не все компоненты удовлетворяют требованиям игры.' #13+#13 'Вы действительно хотите продолжить установку?'
if MsgBox(z, mbInformation, MB_YESNO)=idNo
then Result:=false;
end
end
end
end;

procedure CurPageChanged(CurPageID: Integer);
var
  Text: TNewStaticText;
  Windows,WindowsName: TMemo;
  Os,OS1,OS2,OS3,OS4,OS5,OS6,OS7,OS8,OS9,OS10,HARD: string; // строка с названием необходимой ОС
  ProcessorName: string;
  Processor, VideoCardPanel, AudioCardPanel, RAMPanel, PageFilePanel: TMemo;
  ProcessorNamePanel, VideoCardNamePanel, AudioCardNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  ProcessorMHZ: Cardinal;
  StaticText: TNewStaticText;
  VidRam: integer;
  pfunc: LongWord;
begin
/////////////////////////////////////////
{Здесь код показа на странице Инсталл измененного прогрессбара}
if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 5);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      URLLabel.Hide;

      WizardForm.ProgressGauge.Show;
      SplashImage.Show;
      WizardForm.StatusLabel.Show;

      WizardForm.CancelButton.Enabled :=True;
    end
  else
    begin
    URLLabel.Show;
    WizardForm.ProgressGauge.Hide;
    SplashImage.Hide;
    WizardForm.StatusLabel.Hide;
    //WizardForm.FilenameLabel.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;

    end;
//////////////////////////////////////////////////////////////
If CurPageID=wpFinished then
  begin
  Image2:=TBitmapImage.Create(WizardForm)
 with Image2 do begin
  Left:=0
  Top:=0
  Width:=497
  Height:=313
  Parent:=WizardForm.FinishedPage
  Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\Finish.bmp')
  end
  WizardForm.NextButton.Left:=380;
  WizardForm.NextButton.Top:=325;
 end
 //////////////////////////////
 If CurPageID=wpWelcome then
 begin
  If WizardForm.FindComponent('NextButton') is TButton
then
  TButton(WizardForm.FindComponent('NextButton')).Caption:='Начать>';
  end
  begin
  Image1:=TBitmapImage.Create(WizardForm)
 with Image1 do begin
  Left:=0
  Top:=0
  Width:=497
  Height:=313
  Parent:=WizardForm.WelcomePage
  Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\Welcome.bmp')
  end
  end
  if CurPageID=wpSelectTasks then
 begin
  If WizardForm.FindComponent('NextButton') is TButton
then
  TButton(WizardForm.FindComponent('NextButton')).Caption:='Установка';
  If WizardForm.FindComponent('CancelButton') is TButton
then
  TButton(WizardForm.FindComponent('CancelButton')).Caption:='Выход';
  end
 if CurPageID = wpUserInfo then
  begin
  //подменяем сраницу информации о пользователе на информацию об ОС
    wizardForm.UserInfoNameEdit.visible:=false;
    wizardForm.UserInfoNameEdit.text:='Игрок'; //на случай, когда имя пользователя не указано в системе
    wizardForm.UserInfoNameLabel.visible:=false;
    wizardForm.UserInfoOrgLabel.visible:=false;
    wizardForm.UserInfoOrgEdit.visible:=false;
    wizardForm.UserInfoOrgEdit.text:='Группа игроков ';//на случай, когда организация не указано в системе
    wizardForm.PageNameLabel.Caption := 'Аппаратное обеспечение и Операционная система';
    wizardForm.PageDescriptionLabel.Caption := 'Программа установки обнаружила следующие необходимые компоненты и Операционную систему ';
    RegQueryStringValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', 'ProcessorNameString', ProcessorName);
    RegQueryDWordValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', '~MHz', ProcessorMHZ);

  OS:=' Microsoft Windows XP Service Pack 2';
  OS10:=' Microsoft Windows XP Service Pack 3'; //строка является записью из реестра
  OS1:=' Microsoft Windows 2000 Service Pack 4'; //строка является записью из реестра
  OS2:=' Windows Vista (TM) Ultimate ';
  OS3:=' Windows Vista (TM) Home Basic ';
  OS4:=' Windows Vista (TM) Home Premium ';
  OS5:=' Windows Vista (TM) Business ';
  OS6:=' Windows Vista (TM) Ultimate Service Pack 1'
  OS7:=' Windows Vista (TM) Home Basic Service Pack 1';
  OS8:=' Windows Vista (TM) Home Premium Service Pack 1';
  OS9:=' Windows Vista (TM) Business Service Pack 1';
  HARD:='Все компоненты удовлетворяют требованиям игры.';
  Windows := TMemo.Create(WizardForm);

  StaticText := TNewStaticText.Create(TNewStaticText.Create(WizardForm));
  with StaticText do begin
    Left := 0;
    Top := 52;
    Width := 417;
    Height := 14;
    Caption := 'Все компоненты удовлетворяют требованиям игры.';
    Parent := WizardForm.UserInfoPage;
    StaticText.font.color:=clGreen;
  end


  with Windows do
  begin
    Text := ' Операц. система';
    Parent := WizardForm.UserInfoPage;

    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(20);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := clBtnFace;
  end
    Processor := TMemo.Create(WizardForm);
  with Processor do begin
    Text := ' Процессор';
    Parent := WizardForm.UserInfoPage;

    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(77);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := clBtnFace;
  end
    VideoCardPanel := TMemo.Create(WizardForm);
  with VideoCardPanel do begin
    Text := ' Видеоадаптер';
    Parent := WizardForm.UserInfoPage;

    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(104);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := clBtnFace;
  end
    AudioCardPanel := TMemo.Create(WizardForm);
  with AudioCardPanel do begin
    Text := ' Звуковая карта';
    Parent := WizardForm.UserInfoPage;
    Color := clBtnFace;
    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(131);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;

  end
    RAMPanel := TMemo.Create(WizardForm);
  with RAMPanel do begin
    Text := ' ОЗУ';
    Parent := WizardForm.UserInfoPage;
    Color := clBtnFace;
    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(158);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.


    ReadOnly := True;

  end

  PageFilePanel := TMemo.Create(WizardForm);
  with PageFilePanel do begin
    Text := ' Файл подкачки';
    Parent := WizardForm.UserInfoPage;
    Color := clBtnFace;
    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(185);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.


    ReadOnly := True;

    ProcessorNamePanel := TMemo.Create(WizardForm);
  with ProcessorNamePanel do begin

    Text :=  DelSP(ProcessorName) + '  ' + IntToStr(ProcessorMHZ) + 'MHz'; //новое обработанное значение строки
    Parent := WizardForm.UserInfoPage;

    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(77);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := $CCFFCC;

    if ProcessorMHZ < 2800 then
  begin
    ProcessorNamePanel.Color := $ccccff;
    StaticText.Caption := 'Не все компоненты удовлетворяют требованиям игры.';
    StaticText.font.color:=clRed;
  end;

  VideoCardNamePanel := TMemo.Create(WizardForm);
  with VideoCardNamePanel do begin
    Text :=  ' ' + GetVideoCardName + 'MB'; //+'    ОЗУ-'+inttostr(round(GetVidMemLocal/1000000))+' МБ'
    Parent := WizardForm.UserInfoPage;
    VidrAM := GetVidMemLocal / 1000000;

    if VidRam > 127 then
    begin
      if VidRam < 200 then text := text + ' ОЗУ - 128 МB'
      else if VidRam < 300 then text := text + ' ОЗУ - 256 МB'
      else if VidRam < 400 then text := text + ' ОЗУ - 384 МB'
      else if VidRam > 500 then text := text + ' ОЗУ - 512 МB';
    end;

    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(104);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := $CCFFCC;

    if GetVidMemLocal < 255000000 then //128 MB
  begin
    StaticText.Caption := 'Не все компоненты удовлетворяют требованиям игры.';
    StaticText.font.color:=clRed;
    VideoCardNamePanel.Color := $ccccff;
  end;


  end
    AudioCardNamePanel := TMemo.Create(WizardForm);
  with AudioCardNamePanel do begin
    Text := ' ' + GetSoundCardName;
    Parent := WizardForm.UserInfoPage;
    Color := $CCFFCC;
    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(131);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R

    ReadOnly := True;

  end
    RAMTotalPanel := TMemo.Create(WizardForm);
  with RAMTotalPanel do begin
    Text :=  ' ' + IntToStr(GetSystemPhys + 1) + ' MB';
    Parent := WizardForm.UserInfoPage;
    Color := $CCFFCC;

    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(158);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    if GetSystemPhys + 1 < 1024 then
  begin
    RAMTotalPanel.Color := $ccccff;
    StaticText.Caption := 'Не все компоненты удовлетворяют требованиям игры.';
    StaticText.font.color:=clRed;
  end;
  end;

  PageFileTotalPanel := TMemo.Create(WizardForm);
  with PageFileTotalPanel do begin
    Text :=  ' ' + IntToStr(GetSystemPage) + ' MB';
    Parent := WizardForm.UserInfoPage;
    Color := $CCFFCC;

    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(185);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    if GetSystemPage < 1247 then
  begin
    PageFileTotalPanel.Color := $ccccff;
    StaticText.Caption := 'Не все компоненты удовлетворяют требованиям игры.';
    StaticText.font.color:=clRed;
  end;
  end;


  end

  if ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion,ProductName|}')='' then
  begin

    WindowsName := TMemo.Create(WizardForm);
    with WindowsName do begin
    Text := ExpandConstant(' {reg:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion,ProductName|}')+ExpandConstant(' {reg:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion,CSDVersion|}');
    Parent := WizardForm.UserInfoPage;

    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(20);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := $CCFFCC;
  end

  end

 end;

 // Проверка Windows 9x
  if ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion,ProductName|}')<>'' then
  begin
  WindowsName := TMemo.Create(WizardForm);
  with WindowsName do begin
    Text := ExpandConstant(' {reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion,ProductName|}')+ExpandConstant(' {reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion,CSDVersion|}');
    Parent := WizardForm.UserInfoPage;
    Color := $CCFFCC;
    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(20);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;

  end

  end;


  if OS=(WindowsName.Text) then state:=true else
  if OS2=(WindowsName.Text) then state:=true else
  if OS3=(WindowsName.Text) then state:=true else
  if OS4=(WindowsName.Text) then state:=true else
  if OS5=(WindowsName.Text) then state:=true else
  if OS6=(WindowsName.Text) then state:=true else
  if OS7=(WindowsName.Text) then state:=true else
  if OS8=(WindowsName.Text) then state:=true else
  if OS9=(WindowsName.Text) then state:=true else
  if OS10=(WindowsName.Text) then state:=true else
  if OS1=(WindowsName.Text) then state:=true else state:=false;

////////////////////////////////////////////////////////////////////////
{условие проверки оборудования}
  if HARD=(StaticText.Caption) then soft:=true else soft:=false;
////////////////////////////////////////////////////////////////////////
  Text := TNewStaticText.Create(WizardForm);
    with Text do begin
    Left := 0;
    Top := 0;
    Width := 417;
    Height := 14;
    if state then
    begin
      Font.Color:=clGreen;
      WindowsName.color:=$CCFFCC;
    // SP_Num.color:=$CCFFCC;
      Caption := 'Операционная система соответствует требованиям игры.';
    end
    else
    begin
      Font.Color:=clREd;
      WindowsName.color:=clRed;

      WindowsName.Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
      WindowsName.Top := ScaleY(20);
      WindowsName.Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
      WindowsName.Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.
      WindowsName.ReadOnly := True;



      Caption := 'Операционная система не соответствует требованиям игры.';
    end
    Parent := WizardForm.UserInfoPage;
  end
    Text := TNewStaticText.Create(TNewStaticText.Create(WizardForm));
  with Text do begin
    Left := 0;
    Top := 220;
    Width := 417;
    Height := 14;
    Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».';
    Parent := WizardForm.UserInfoPage;
  end

 end;
end;

procedure DeInitializeSetup();
begin
 KillTimer(0, TimerID);
 BASS_Stop(); //нужно для остановки проигрывания
 BASS_Free(); //нужно для быстрой выгрузки библиотеки вместе с муз. файлом
end;


tem000 26-02-2009 15:36 1049495

Serega_, еще пару вопросов. При создании инсталятора с несколькими прогами как исправить создание ярлыков на рабочем столе, при указании создать ярлык для какой то одной
почему то на столе появляются ярлыки всех программ. И по поводу секции CODE, как добавить чекбоксы для запуска по выбору всех 3 программ. HELP PLIZZZZ!!! Скрипт приложил
читать дальше »

[Setup]
AppName=Any FLV Player Pack
AppVerName=Any FLV Player Pack
AppPublisher=www.any-flv-player.com
DefaultDirName={pf}\Any FLV Player Pack
DefaultGroupName=Any FLV Player Pack
OutputBaseFilename=Any FLV Player Pack ©
AllowNoIcons=true
Compression=lzma
SolidCompression=true
VersionInfoVersion=1.1.3.1
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp
SetupIconFile=C:\Documents and Settings\Пользователь\Рабочий стол\Any FLV Player Pack\embedded\Install.ico
UninstallDisplayIcon={app}\Uninstall\unins000.exe
UninstallFilesDir={app}\Uninstall

[Files]
;Any FLV Player
Source: "C:\Documents and Settings\Пользователь\Рабочий стол\Any FLV Player Pack\{app}\Any FLV Player 1.1.3.1\*"; DestDir: "{app}\Any FLV Player 1.1.3.1"; Components: Any_FLV_Player; MinVersion: 4.1,4.0; Flags: ignoreversion recursesubdirs createallsubdirs
;Any Video Converter Professional
Source: "C:\Documents and Settings\Пользователь\Рабочий стол\Any FLV Player Pack\{app}\Any Video Converter Pro 2.7.1\*"; DestDir: "{app}\Any Video Converter Pro 2.7.1"; Components: Any_Video_Converter; MinVersion: 4.1,4.0; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{userappdata}\Any Video Converter Professional\profiles_v2.xml"; DestDir: "{userappdata}\Any Video Converter Professional"; Flags: ignoreversion
;Any DVD Converter Professional
Source: "C:\Documents and Settings\Пользователь\Рабочий стол\Any FLV Player Pack\{app}\Any DVD Converter Pro 3.7.1.0\*"; DestDir: "{app}\Any DVD Converter Pro 3.7.1.0"; Components: Any_DVD_Converter; MinVersion: 4.1,4.0; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{userappdata}\Any DVD Converter Professional\profiles_v2.xml"; DestDir: "{userappdata}\Any DVD Converter Professional"; Flags: ignoreversion

[Registry]
;Any FLV Player
Root: HKCR; SubKey: Applications\FlvPlayer.exe\shell\open\command; ValueType: string; ValueName: ; ValueData: """C:\Program Files\Any FLV Player Pack\Any FLV Player 1.1.3.1\FlvPlayer.exe"" ""%1"""
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv; ValueType: string; ValueName: Application; ValueData: FlvPlayer.exe; Tasks: fileassoc
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\OpenWithList; ValueType: string; ValueName: a; ValueData: FlvPlayer.exe; Tasks: fileassoc
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\OpenWithProgids; ValueType: string; ValueName: flv_auto_file; ValueData: hex(0):; Tasks: fileassoc
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\OpenWithProgids; ValueType: string; ValueName: Winamp.File.FLV; ValueData: hex(0):; Tasks: fileassoc
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\OpenWithProgids; ValueType: string; ValueName: SWF.max.flv; ValueData: hex(0):; Tasks: fileassoc
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\OpenWithProgids; ValueType: string; ValueName: Flash.VideoFile; ValueData: hex(0):; Tasks: fileassoc
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: AutoPlay; ValueData: $00000001
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: AutoRepeat; ValueData: $00000001
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: ShowTitle; ValueData: $00000001
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: ShowTime; ValueData: $00000001
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: nControlPanelPosition; ValueData: $00000000
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: nControlPanelDisplay; ValueData: $00000001
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorControlPanel; ValueData: $00141414
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorButton; ValueData: $002525da
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorTime1; ValueData: $00ffffff
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorSlide; ValueData: $00f0f0f0
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorBufferSlide; ValueData: $00000000
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorBKSlide; ValueData: $00333333
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: CopyVideoFile; ValueData: $00000001
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: nBufferTime; ValueData: $00000005
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: nControlBarStyle; ValueData: $00000000
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: string; ValueName: language; ValueData: auto
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: string; ValueName: languageIni; ValueData: lang_rus.ini
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: languageAuto; ValueData: $00000000
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: nSizeRatio; ValueData: $00000001
;Any Video Converter Professional
Root: HKCU; Subkey: "Software\Any Video Converter Professional"; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Any Video Converter Professional\Setting\Output"; ValueName: "UseTitleAsFileName"; ValueType: Dword; ValueData: "$1";
Root: HKCU; Subkey: "Software\Any Video Converter Professional\Setting\Output"; ValueName: "Video Aspect"; ValueType: String; ValueData: "4/3";
Root: HKCU; Subkey: "Software\Any Video Converter Professional\Setting\Output"; ValueName: "RetryTimes"; ValueType: Dword; ValueData: "$5";
;Any DVD Converter Professional
Root: HKCU; Subkey: "Software\Any DVD Converter Professional"; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Any DVD Converter Professional\Setting\Output"; ValueName: "UseTitleAsFileName"; ValueType: Dword; ValueData: "$1";
Root: HKCU; Subkey: "Software\Any DVD Converter Professional\Setting\Output"; ValueName: "RetryTimes"; ValueType: Dword; ValueData: "$5";

[Run]
;Any FLV Player
;Filename: {app}\Any FLV Player 1.1.3.1\FlvPlayer.exe; Description: Запустить Any Flv Player; Flags: nowait postinstall skipifsilent unchecked
;Any Video Converter Professional
;Filename: {app}\Any Video Converter Pro 2.7.1\VideoConvPro.exe; Description: Запустить Any Video Converter Pro; Flags: nowait postinstall skipifsilent unchecked

[Icons]
;Any FLV Player
Name: {group}\Any Flv Player; Filename: {app}\Any FLV Player 1.1.3.1\FlvPlayer.exe
Name: {commondesktop}\Any Flv Player; Filename: {app}\Any FLV Player 1.1.3.1\FlvPlayer.exe; Tasks: desktopicon
;Any Video Converter Professional
Name: {group}\Any Video Converter Pro; Filename: {app}\Any Video Converter Pro 2.7.1\VideoConvPro.exe
Name: {commondesktop}\Any Video Converter Pro; Filename: {app}\Any Video Converter Pro 2.7.1\VideoConvPro.exe; Tasks: desktopicon
;Any DVD Converter Professional
Name: {group}\Any DVD Converter Pro; Filename: {app}\Any DVD Converter Pro 3.7.1.0\DVDConvPro.exe
Name: {commondesktop}\Any DVD Converter Pro; Filename: {app}\Any DVD Converter Pro 3.7.1.0\DVDConvPro.exe; Tasks: desktopicon

[Tasks]
Name: desktopicon; Description: Создать ярлык Any Flv Player на рабочем столе; GroupDescription: Дополнительные ярлыки:; Flags: unchecked
Name: desktopicon; Description: Создать ярлык Any Video Converter Pro на рабочем столе; GroupDescription: Дополнительные ярлыки:; Flags: unchecked
Name: desktopicon; Description: Создать ярлык Any DVD Converter Pro на рабочем столе; GroupDescription: Дополнительные ярлыки:; Flags: unchecked

Name: fileassoc; Description: Связать Any FLV Player, с файлами имеющими расширение .flv; MinVersion: 4.1,4.0; Flags: unchecked

[Components]
Name: Any_FLV_Player; Description: Any FLV Player 1.1.3.1; Types: full compact custom; MinVersion: 4.1,4.0
Name: Any_Video_Converter; Description: Any Video Converter Pro 2.7.1; Types: full; MinVersion: 4.1,4.0
Name: Any_DVD_Converter; Description: Any DVD Converter Pro 3.7.1.0; Types: full; MinVersion: 4.1,4.0

[Types]
Name: full; Description: Полная установка
Name: compact; Description: Компактная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Messages]
BeveledLabel=Copyright © 2009

[Languages]
Name: Russian; MessagesFile: embedded\Russian.isl

[code]
var
WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
RunMyProg: TCheckBox;

procedure RLabelOnClick(Sender: TObject);
begin
if RunMyProg.Checked=false then
begin
RunMyProg.Checked := true;
end else
RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
ErrorCode: Integer;
begin
if CurStep = ssDone then
begin
if RunMyProg.Checked then
Exec(ExpandConstant('{app}\Any FLV Player 1.1.3.1\FlvPlayer.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
end;

procedure InitializeWizard();
begin
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
WizardForm.FinishedLabel.Hide;
// не знаю почему, но Hide не действует. Поэтому просто уменьшил размер.
WizardForm.RunList.Height := 0;
WizardForm.RunList.Width := 0;

WizardForm.WizardBitmapImage.Align:=true;
WizardForm.WizardBitmapImage2.Align:=true;
WizardForm.WizardSmallBitmapImage.Align:=true;

WelcomeLabel1:=TLabel.Create(WizardForm);
WelcomeLabel1.Left:=ScaleX(150);
WelcomeLabel1.Top := ScaleY(22);
WelcomeLabel1.Width := ScaleX(320);
WelcomeLabel1.Height := ScaleY(75);
WelcomeLabel1.AutoSize := False;
WelcomeLabel1.WordWrap := True;
WelcomeLabel1.Font.Color := clBlack;
// здесь можно поиграть шрифтом.
WelcomeLabel1.Font.Style := [fsBold];
WelcomeLabel1.Font.Name:='Cambria';
WelcomeLabel1.Font.Size := 14;
WelcomeLabel1.Transparent := True;
WelcomeLabel1.Parent := WizardForm.WelcomePage;

WelcomeLabel2:=TLabel.Create(WizardForm);
WelcomeLabel2.Left := ScaleX(150);
WelcomeLabel2.Top := ScaleY(85);
WelcomeLabel2.Width := ScaleX(320);
WelcomeLabel2.Height := ScaleY(200);
WelcomeLabel2.AutoSize := False;
WelcomeLabel2.WordWrap := True;
WelcomeLabel2.Font.Color := clBlack;
WelcomeLabel2.Font.Size := 8;
WelcomeLabel2.Transparent := True;
WelcomeLabel2.Parent := WizardForm.WelcomePage;

PageNameLabel := TLabel.Create(WizardForm);
PageNameLabel.Left := ScaleX(35);
PageNameLabel.Top := ScaleY(13);
PageNameLabel.Width := ScaleX(300);
PageNameLabel.Height := ScaleY(14);
PageNameLabel.AutoSize := False;
PageNameLabel.WordWrap := True;
PageNameLabel.Font.Color := clBlack;
PageNameLabel.Font.Style := [fsBold];
PageNameLabel.Transparent := True;
PageNameLabel.Parent := WizardForm.MainPanel;

PageDescriptionLabel := TLabel.Create(WizardForm);
PageDescriptionLabel.Left := ScaleX(35);
PageDescriptionLabel.Top := ScaleY(30);
PageDescriptionLabel.Width := ScaleX(400);
PageDescriptionLabel.Height := ScaleY(30);
PageDescriptionLabel.AutoSize := False;
PageDescriptionLabel.WordWrap := True;
PageDescriptionLabel.Font.Color := clBlack;
PageDescriptionLabel.Transparent := True;
PageDescriptionLabel.Parent := WizardForm.MainPanel;

FinishedHeadingLabel:=TLabel.Create(WizardForm);
FinishedHeadingLabel.Left := ScaleX(150);
FinishedHeadingLabel.Top := ScaleY(22);
FinishedHeadingLabel.Width := ScaleX(320);
FinishedHeadingLabel.Height := ScaleY(75);
FinishedHeadingLabel.AutoSize := False;
FinishedHeadingLabel.WordWrap := True;
FinishedHeadingLabel.Font.Color := clBlack;
// здесь можно поиграть шрифтом.
FinishedHeadingLabel.Font.Style := [fsBold];
FinishedHeadingLabel.Font.Name:='Cambria';
FinishedHeadingLabel.Font.Size := 14;
FinishedHeadingLabel.Transparent := True;
FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

FinishedLabel:=TLabel.Create(WizardForm);
FinishedLabel.Left := ScaleX(150);
FinishedLabel.Top := ScaleY(85);
FinishedLabel.Width := ScaleX(320);
FinishedLabel.Height := ScaleY(200);
FinishedLabel.AutoSize := False;
FinishedLabel.WordWrap := True;
FinishedLabel.Font.Color := clBlack;
FinishedLabel.Font.Size := 8;
FinishedLabel.Transparent := True;
FinishedLabel.Parent := WizardForm.FinishedPage;

RunMyProg := TCheckBox.Create(WizardForm);
RunMyProg.Parent := WizardForm.FinishedPage;
RunMyProg.Left := ScaleX(150);
RunMyProg.Top := ScaleY(185);
RunMyProg.Width := ScaleX(14);
RunMyProg.Height := ScaleX(14);
// RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

RunLabel:=TLabel.Create(WizardForm);
RunLabel.Left := ScaleX(170);
RunLabel.Top := ScaleY(185);
RunLabel.Width := ScaleX(200);
RunLabel.Height := ScaleY(20);
RunLabel.AutoSize := False;
RunLabel.WordWrap := True;
RunLabel.Font.Color := clBlack;
RunLabel.Font.Size := 8;
RunLabel.OnClick := @RLabelOnClick;
RunLabel.Transparent := True;
RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
RunLabel.Caption := 'Запустить Any Flv Player';
end;

Serega 26-02-2009 18:29 1049661

tem000,
читать дальше »
Код:

[Setup]
AppName=Any FLV Player Pack
AppVerName=Any FLV Player Pack
AppPublisher=www.any-flv-player.com
DefaultDirName={pf}\Any FLV Player Pack
DefaultGroupName=Any FLV Player Pack
OutputBaseFilename=Any FLV Player Pack ©
AllowNoIcons=true
Compression=lzma
SolidCompression=true
VersionInfoVersion=1.1.3.1
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp
SetupIconFile=C:\Documents and Settings\Пользователь\Рабочий стол\Any FLV Player Pack\embedded\Install.ico
UninstallDisplayIcon={app}\Uninstall\unins000.exe
UninstallFilesDir={app}\Uninstall

[Languages]
Name: Russian; MessagesFile: embedded\Russian.isl

[Messages]
BeveledLabel=Copyright © 2009

[Types]
Name: full; Description: Полная установка
; compact - не определена отдельно, следовательно не нужна... имхо
Name: compact; Description: Компактная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: Any_FLV_Player; Description: Any FLV Player 1.1.3.1; Types: full compact custom; MinVersion: 4.1,4.0
Name: Any_Video_Converter; Description: Any Video Converter Pro 2.7.1; Types: full; MinVersion: 4.1,4.0
Name: Any_DVD_Converter; Description: Any DVD Converter Pro 3.7.1.0; Types: full; MinVersion: 4.1,4.0

[Tasks]
Name: AnyFlvPlayer; Description: Создать ярлык Any Flv Player на рабочем столе; GroupDescription: Дополнительные ярлыки:; Components: Any_FLV_Player; Flags: unchecked
Name: AnyVideoConverter; Description: Создать ярлык Any Video Converter Pro на рабочем столе; GroupDescription: Дополнительные ярлыки:; Components: Any_Video_Converter; Flags: unchecked
Name: AnyDVDConverter; Description: Создать ярлык Any DVD Converter Pro на рабочем столе; GroupDescription: Дополнительные ярлыки:; Components: Any_DVD_Converter; Flags: unchecked

Name: fileassoc; Description: Связать Any FLV Player, с файлами имеющими расширение .flv; MinVersion: 4.1,4.0; Components: Any_FLV_Player; Flags: unchecked

[Files]
Any FLV Player
Source: "C:\Documents and Settings\Пользователь\Рабочий стол\Any FLV Player Pack\{app}\Any FLV Player 1.1.3.1\*"; DestDir: "{app}\Any FLV Player 1.1.3.1"; Components: Any_FLV_Player; MinVersion: 4.1,4.0; Flags: ignoreversion recursesubdirs createallsubdirs
Any Video Converter Professional
Source: "C:\Documents and Settings\Пользователь\Рабочий стол\Any FLV Player Pack\{app}\Any Video Converter Pro 2.7.1\*"; DestDir: "{app}\Any Video Converter Pro 2.7.1"; MinVersion: 4.1,4.0; Components: Any_Video_Converter; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{userappdata}\Any Video Converter Professional\profiles_v2.xml"; DestDir: "{userappdata}\Any Video Converter Professional"; Components: Any_Video_Converter; Flags: ignoreversion
Any DVD Converter Professional
Source: "C:\Documents and Settings\Пользователь\Рабочий стол\Any FLV Player Pack\{app}\Any DVD Converter Pro 3.7.1.0\*"; DestDir: "{app}\Any DVD Converter Pro 3.7.1.0"; MinVersion: 4.1,4.0; Components: Any_DVD_Converter; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{userappdata}\Any DVD Converter Professional\profiles_v2.xml"; DestDir: "{userappdata}\Any DVD Converter Professional"; Components: Any_DVD_Converter; Flags: ignoreversion

[Registry]
Any FLV Player
Root: HKCR; SubKey: Applications\FlvPlayer.exe\shell\open\command; ValueType: string; ValueName: ; ValueData: """C:\Program Files\Any FLV Player Pack\Any FLV Player 1.1.3.1\FlvPlayer.exe"" ""%1"""; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv; ValueType: string; ValueName: Application; ValueData: FlvPlayer.exe; Components: Any_FLV_Player; Tasks: fileassoc
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\OpenWithList; ValueType: string; ValueName: a; ValueData: FlvPlayer.exe; Components: Any_FLV_Player; Tasks: fileassoc
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\OpenWithProgids; ValueType: string; ValueName: flv_auto_file; ValueData: hex(0):; Components: Any_FLV_Player; Tasks: fileassoc
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\OpenWithProgids; ValueType: string; ValueName: Winamp.File.FLV; ValueData: hex(0):; Components: Any_FLV_Player; Tasks: fileassoc
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\OpenWithProgids; ValueType: string; ValueName: SWF.max.flv; ValueData: hex(0):; Components: Any_FLV_Player; Tasks: fileassoc
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\OpenWithProgids; ValueType: string; ValueName: Flash.VideoFile; ValueData: hex(0):; Components: Any_FLV_Player; Tasks: fileassoc
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: AutoPlay; ValueData: $00000001; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: AutoRepeat; ValueData: $00000001; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: ShowTitle; ValueData: $00000001; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: ShowTime; ValueData: $00000001; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: nControlPanelPosition; ValueData: $00000000; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: nControlPanelDisplay; ValueData: $00000001; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorControlPanel; ValueData: $00141414; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorButton; ValueData: $002525da; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorTime1; ValueData: $00ffffff; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorSlide; ValueData: $00f0f0f0; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorBufferSlide; ValueData: $00000000; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: colorBKSlide; ValueData: $00333333; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: CopyVideoFile; ValueData: $00000001; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: nBufferTime; ValueData: $00000005; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: nControlBarStyle; ValueData: $00000000; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: string; ValueName: language; ValueData: auto; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: string; ValueName: languageIni; ValueData: lang_rus.ini; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: languageAuto; ValueData: $00000000; Components: Any_FLV_Player
Root: HKCU; SubKey: Software\Any Flv Player; ValueType: dword; ValueName: nSizeRatio; ValueData: $00000001; Components: Any_FLV_Player
Any Video Converter Professional
Root: HKCU; Subkey: "Software\Any Video Converter Professional"; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Any Video Converter Professional\Setting\Output"; ValueName: "UseTitleAsFileName"; ValueType: Dword; ValueData: "$1"; Components: Any_Video_Converter
Root: HKCU; Subkey: "Software\Any Video Converter Professional\Setting\Output"; ValueName: "Video Aspect"; ValueType: String; ValueData: "4/3"; Components: Any_Video_Converter
Root: HKCU; Subkey: "Software\Any Video Converter Professional\Setting\Output"; ValueName: "RetryTimes"; ValueType: Dword; ValueData: "$5"; Components: Any_Video_Converter
Any DVD Converter Professional
Root: HKCU; Subkey: "Software\Any DVD Converter Professional"; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Any DVD Converter Professional\Setting\Output"; ValueName: "UseTitleAsFileName"; ValueType: Dword; ValueData: "$1"; Components: Any_DVD_Converter
Root: HKCU; Subkey: "Software\Any DVD Converter Professional\Setting\Output"; ValueName: "RetryTimes"; ValueType: Dword; ValueData: "$5"; Components: Any_DVD_Converter

[Run]
;Any FLV Player
;Filename: {app}\Any FLV Player 1.1.3.1\FlvPlayer.exe; Description: Запустить Any Flv Player; Flags: nowait postinstall skipifsilent unchecked
;Any Video Converter Professional
;Filename: {app}\Any Video Converter Pro 2.7.1\VideoConvPro.exe; Description: Запустить Any Video Converter Pro; Flags: nowait postinstall skipifsilent unchecked

[Icons]
;Any FLV Player
Name: {group}\Any Flv Player; Filename: {app}\Any FLV Player 1.1.3.1\FlvPlayer.exe; Components: Any_FLV_Player
Name: {commondesktop}\Any Flv Player; Filename: {app}\Any FLV Player 1.1.3.1\FlvPlayer.exe; Components: Any_FLV_Player; Tasks: AnyFlvPlayer
;Any Video Converter Professional
Name: {group}\Any Video Converter Pro; Filename: {app}\Any Video Converter Pro 2.7.1\VideoConvPro.exe; Components: Any_Video_Converter
Name: {commondesktop}\Any Video Converter Pro; Filename: {app}\Any Video Converter Pro 2.7.1\VideoConvPro.exe; Components: Any_Video_Converter; Tasks: AnyVideoConverter
;Any DVD Converter Professional
Name: {group}\Any DVD Converter Pro; Filename: {app}\Any DVD Converter Pro 3.7.1.0\DVDConvPro.exe; Components: Any_DVD_Converter
Name: {commondesktop}\Any DVD Converter Pro; Filename: {app}\Any DVD Converter Pro 3.7.1.0\DVDConvPro.exe; Components: Any_DVD_Converter; Tasks: AnyDVDConverter

[_Code]
var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,Any_FLV_Player_Label,Any_Video_Converter_Label,
  Any_DVD_Converter_Label,FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  Any_FLV_Player,Any_Video_Converter,Any_DVD_Converter: TCheckBox;

procedure Any_FLV_Player_Label_OnClick(Sender: TObject);
begin
  if Any_FLV_Player.Checked = false then
  begin
    Any_FLV_Player.Checked := true;
  end else
    Any_FLV_Player.Checked := false;
end;

procedure Any_Video_Converter_Label_OnClick(Sender: TObject);
begin
  if Any_Video_Converter.Checked = false then
  begin
    Any_Video_Converter.Checked := true;
  end else
    Any_Video_Converter.Checked := false;
end;

procedure Any_DVD_Converter_Label_OnClick(Sender: TObject);
begin
  if Any_DVD_Converter.Checked = false then
  begin
    Any_DVD_Converter.Checked := true;
  end else
    Any_DVD_Converter.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
  if CurStep = ssDone then
  begin
    if Any_FLV_Player.Checked then
      Exec(ExpandConstant('{app}\Any FLV Player 1.1.3.1\FlvPlayer.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);

    if Any_Video_Converter.Checked then
      Exec(ExpandConstant('{app}\Any_Video_Converter\Any_Video_Converter.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);

    if Any_DVD_Converter.Checked then
      Exec(ExpandConstant('{app}\Any_DVD_Converter\Any_DVD_Converter.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.PageNameLabel.Hide;
  WizardForm.PageDescriptionLabel.Hide;
  WizardForm.FinishedHeadingLabel.Hide;
  WizardForm.FinishedLabel.Hide;
  // не знаю почему, но Hide не действует. Поэтому просто уменьшил размер.
  WizardForm.RunList.Height := 0;
  WizardForm.RunList.Width := 0;

    WizardForm.WizardBitmapImage.Align:=true;
    WizardForm.WizardBitmapImage2.Align:=true;
    WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(150);
  WelcomeLabel1.Top := ScaleY(22);
  WelcomeLabel1.Width := ScaleX(320);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clBlack;
  // здесь можно поиграть шрифтом.
  WelcomeLabel1.Font.Style := [fsBold];
  WelcomeLabel1.Font.Name:='Cambria';
  WelcomeLabel1.Font.Size := 14;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

    WelcomeLabel2:=TLabel.Create(WizardForm);
    WelcomeLabel2.Left := ScaleX(150);
    WelcomeLabel2.Top := ScaleY(85);
    WelcomeLabel2.Width := ScaleX(320);
    WelcomeLabel2.Height := ScaleY(200);
    WelcomeLabel2.AutoSize := False;
    WelcomeLabel2.WordWrap := True;
    WelcomeLabel2.Font.Color := clBlack;
    WelcomeLabel2.Font.Size := 8;
    WelcomeLabel2.Transparent := True;
    WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(35);
  PageNameLabel.Top := ScaleY(13);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clBlack;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

    PageDescriptionLabel := TLabel.Create(WizardForm);
    PageDescriptionLabel.Left := ScaleX(35);
    PageDescriptionLabel.Top := ScaleY(30);
    PageDescriptionLabel.Width := ScaleX(400);
    PageDescriptionLabel.Height := ScaleY(30);
    PageDescriptionLabel.AutoSize := False;
    PageDescriptionLabel.WordWrap := True;
    PageDescriptionLabel.Font.Color := clBlack;
    PageDescriptionLabel.Transparent := True;
    PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(150);
  FinishedHeadingLabel.Top := ScaleY(22);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clBlack;
  // здесь можно поиграть шрифтом.
  FinishedHeadingLabel.Font.Style := [fsBold];
  FinishedHeadingLabel.Font.Name:='Cambria';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

    FinishedLabel:=TLabel.Create(WizardForm);
    FinishedLabel.Left := ScaleX(150);
    FinishedLabel.Top := ScaleY(85);
    FinishedLabel.Width := ScaleX(320);
    FinishedLabel.Height := ScaleY(200);
    FinishedLabel.AutoSize := False;
    FinishedLabel.WordWrap := True;
    FinishedLabel.Font.Color := clBlack;
    FinishedLabel.Font.Size := 8;
    FinishedLabel.Transparent := True;
    FinishedLabel.Parent := WizardForm.FinishedPage;

  Any_FLV_Player := TCheckBox.Create(WizardForm);
  Any_FLV_Player.Parent := WizardForm.FinishedPage;
  Any_FLV_Player.Left := ScaleX(150);
  Any_FLV_Player.Top := ScaleY(185);
  Any_FLV_Player.Width := ScaleX(14);
  Any_FLV_Player.Height := ScaleX(14);
  // Any_FLV_Player.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

    Any_FLV_Player_Label :=TLabel.Create(WizardForm);
    Any_FLV_Player_Label.Left := ScaleX(170);
    Any_FLV_Player_Label.Top := ScaleY(185);
    Any_FLV_Player_Label.Width := ScaleX(300);
    Any_FLV_Player_Label.Height := ScaleY(20);
    Any_FLV_Player_Label.AutoSize := False;
    Any_FLV_Player_Label.WordWrap := True;
    Any_FLV_Player_Label.Font.Color := clBlack;
    Any_FLV_Player_Label.Font.Size := 8;
    Any_FLV_Player_Label.OnClick := @Any_FLV_Player_Label_OnClick;
    Any_FLV_Player_Label.Transparent := True;
    Any_FLV_Player_Label.Parent := WizardForm.FinishedPage;

  Any_Video_Converter := TCheckBox.Create(WizardForm);
  Any_Video_Converter.Parent := WizardForm.FinishedPage;
  Any_Video_Converter.Left := ScaleX(150);
  Any_Video_Converter.Top := ScaleY(205);
  Any_Video_Converter.Width := ScaleX(14);
  Any_Video_Converter.Height := ScaleX(14);
  // Any_Video_Converter.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

    Any_Video_Converter_Label :=TLabel.Create(WizardForm);
    Any_Video_Converter_Label.Left := ScaleX(170);
    Any_Video_Converter_Label.Top := ScaleY(205);
    Any_Video_Converter_Label.Width := ScaleX(300);
    Any_Video_Converter_Label.Height := ScaleY(20);
    Any_Video_Converter_Label.AutoSize := False;
    Any_Video_Converter_Label.WordWrap := True;
    Any_Video_Converter_Label.Font.Color := clBlack;
    Any_Video_Converter_Label.Font.Size := 8;
    Any_Video_Converter_Label.OnClick := @Any_Video_Converter_Label_OnClick;
    Any_Video_Converter_Label.Transparent := True;
    Any_Video_Converter_Label.Parent := WizardForm.FinishedPage;

  Any_DVD_Converter := TCheckBox.Create(WizardForm);
  Any_DVD_Converter.Parent := WizardForm.FinishedPage;
  Any_DVD_Converter.Left := ScaleX(150);
  Any_DVD_Converter.Top := ScaleY(225);
  Any_DVD_Converter.Width := ScaleX(14);
  Any_DVD_Converter.Height := ScaleX(14);
  // Any_DVD_Converter.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

    Any_DVD_Converter_Label :=TLabel.Create(WizardForm);
    Any_DVD_Converter_Label.Left := ScaleX(170);
    Any_DVD_Converter_Label.Top := ScaleY(225);
    Any_DVD_Converter_Label.Width := ScaleX(300);
    Any_DVD_Converter_Label.Height := ScaleY(20);
    Any_DVD_Converter_Label.AutoSize := False;
    Any_DVD_Converter_Label.WordWrap := True;
    Any_DVD_Converter_Label.Font.Color := clBlack;
    Any_DVD_Converter_Label.Font.Size := 8;
    Any_DVD_Converter_Label.OnClick := @Any_DVD_Converter_Label_OnClick;
    Any_DVD_Converter_Label.Transparent := True;
    Any_DVD_Converter_Label.Parent := WizardForm.FinishedPage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
  // здесь придётся вручную вводить требуемый текст
  Any_FLV_Player_Label.Caption := 'Запустить Any Flv Player';
  Any_Video_Converter_Label.Caption := 'Запустить Any Video Converter Professional';
  Any_DVD_Converter_Label.Caption := 'Запустить Any DVD Converter Professional';
end;


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

tem000 26-02-2009 19:50 1049738

Serega_, Спасибо, работает!!!

Serega 01-03-2009 13:52 1051942

de_MAX, смещение прогрессбара вниз и показ слайд-шоу в окне мастера
читать дальше »
Код:

#define TIME_FOR_VIEW 1

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: 1.bmp; Flags: dontcopy
Source: 2.bmp; Flags: dontcopy
Source: 3.bmp; Flags: dontcopy
Source: InnoCallback.dll; Flags: dontcopy
Source: compiler:Examples\MyProg.exe; DestDir: {app}

Code]
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  1*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp')) end;
  end;
  if CurrTime = 2*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin
    if RunMyProg.Checked then
    Exec(ExpandConstant('{app}\MyProg.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('1.bmp')
  ExtractTemporaryFile('2.bmp')
  ExtractTemporaryFile('3.bmp')

  currTime := 0;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(150);
  WelcomeLabel1.Top := ScaleY(15);
  WelcomeLabel1.Width := ScaleX(320);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clBlack;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 14;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

      WelcomeLabel2:=TLabel.Create(WizardForm);
      WelcomeLabel2.Left := ScaleX(150);
      WelcomeLabel2.Top := ScaleY(90);
      WelcomeLabel2.Width := ScaleX(320);
      WelcomeLabel2.Height := ScaleY(200);
      WelcomeLabel2.AutoSize := False;
      WelcomeLabel2.WordWrap := True;
      WelcomeLabel2.Font.Color := clBlack;
      WelcomeLabel2.Font.Size := 8;
      WelcomeLabel2.Transparent := True;
      WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clBlack;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clBlack;
      PageDescriptionLabel.Transparent := True;
      PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(150);
  FinishedHeadingLabel.Top := ScaleY(15);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clBlack;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
//  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(150);
      FinishedLabel.Top := ScaleY(90);
      FinishedLabel.Width := ScaleX(320);
      FinishedLabel.Height := ScaleY(200);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clBlack;
      FinishedLabel.Font.Size := 8;
      FinishedLabel.Transparent := True;
      FinishedLabel.Parent := WizardForm.FinishedPage;

  RunMyProg := TCheckBox.Create(WizardForm);
  RunMyProg.Parent := WizardForm.FinishedPage;
  RunMyProg.Left := ScaleX(150);
  RunMyProg.Top := ScaleY(152);
  RunMyProg.Width := ScaleX(14);
  RunMyProg.Height := ScaleX(14);
//  RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

      RunLabel:=TLabel.Create(WizardForm);
      RunLabel.Left := ScaleX(170);
      RunLabel.Top := ScaleY(150);
      RunLabel.Width := ScaleX(200);
      RunLabel.Height := ScaleY(20);
      RunLabel.AutoSize := False;
      RunLabel.WordWrap := True;
      RunLabel.Font.Color := clBlack;
      RunLabel.Font.Size := 10;
      RunLabel.OnClick := @RLabelOnClick;
      RunLabel.Transparent := True;
      RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить программу';

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;


mariolast 02-03-2009 23:11 1053273

Какой флаг поставить чтобы компилятор не выводил сообщение "No files matching ..." если задано
Source: F:\INSTALL\FILES\WORK\*; DestDir: {app}; Flags: ignoreversion overwritereadonly recursesubdirs createallsubdirs
и папка WORK\ пустая, мне надо чтобы и пустые папки создавались при установке.

Serega 02-03-2009 23:21 1053280

mariolast, а более подробней. Не понятно, что вы хотите сделать? Какие пустые папки необходимо создать?
Цитата:

Цитата mariolast
и папка WORK\ пустая »

Это и есть ответ на ваш вопрос... т.е. вы пытаетесь скомпилировать пустую папку без файлов и папок, соответственно компилятор ругается: No files found matching "путь..."
Файлов то нет...

mariolast 02-03-2009 23:38 1053296

Да, именно так и надо, чтобы создавалась пустая папка без файлов
Я вот делаю так

[Dirs]

Name: {app}\FAVORITES; Flags: uninsneveruninstall
Name: {app}\LOG; Flags: uninsneveruninstall
Name: {app}\NEWS; Flags: uninsneveruninstall
Name: {app}\OUTPUT; Flags: uninsneveruninstall
Name: {app}\SAVEARC; Flags: uninsneveruninstall
Name: {app}\SESSION; Flags: uninsneveruninstall
Name: {app}\TEXT_NEW; Flags: uninsneveruninstall
Name: {app}\USER; Flags: uninsneveruninstall

Но если в папках есть подпапки и они пустые и их много....может есть быстрое решение?

Serega 02-03-2009 23:46 1053302

mariolast, тогда в своём проекте перед компиляцией, создайте все эти папки в WORK\* и после этого можно компилировать с вашим первым вариантом...

mariolast 03-03-2009 00:16 1053320

А это отдельные папки, я для примера привел, Work в том числе, и вот пустую то папку как раз компилятор не создает, если в ней пусто...
Вот скрипт

[Files]
Source: F:\INSTALL\Liga\LOC_FILES\LOC_FILES\KEYFILES\*; DestDir: {app}; Flags: ignoreversion overwritereadonly recursesubdirs createallsubdirs
Source: F:\INSTALL\Liga\LOC_FILES\LOC_FILES\UNINST\*; DestDir: {app}; Flags: ignoreversion overwritereadonly recursesubdirs createallsubdirs
Source: F:\INSTALL\Liga\LOC_FILES\LOC_FILES\WORK\*; DestDir: {app}; Flags: ignoreversion overwritereadonly recursesubdirs createallsubdirs

[Dirs]

Name: {app}\FAVORITES; Flags: uninsneveruninstall
Name: {app}\LOG; Flags: uninsneveruninstall
Name: {app}\NEWS; Flags: uninsneveruninstall
Name: {app}\OUTPUT; Flags: uninsneveruninstall
Name: {app}\SAVEARC; Flags: uninsneveruninstall
Name: {app}\SESSION; Flags: uninsneveruninstall
Name: {app}\TEXT_NEW; Flags: uninsneveruninstall
Name: {app}\USER; Flags: uninsneveruninstall

Непустые папки компилятор берет, А вот пустые приходится в другую секцию переносить :(

boss911 03-03-2009 01:20 1053365

Цитата:

Цитата mariolast
Непустые папки компилятор берет, А вот пустые приходится в другую секцию переносить »

И не возьмет пустые. Создание пустых каталогов только через секцию [Dirs]. Не вижу проблемы в этом. Правда если пустых подкаталогов много, то придется помучиться, возможно, это как-то можно автоматизировать (облегчить) с помощью препроцессора, но тут я ничего сказать не могу.

Serega 03-03-2009 07:30 1053442

Цитата:

Цитата boss911
возможно, это как-то можно автоматизировать (облегчить) с помощью препроцессора »

а смысл, ведь всё равно вводить имена всех папок...

boss911 03-03-2009 17:43 1053932

Цитата:

Цитата Serega_
всё равно вводить имена всех папок... »

Имелось в виду, что код препроцессора в момент компиляции просканирует пустые каталоги и сгенерирует список в скрипт в тот же момент компиляции. Я видел немного похожий случай, даже проверял его, но только с файлами, так бы пришлось прописывать куча файлов, а так это делает за тебя препроцессор (составляет список в скрипт). Я не сильно в этом понимаю, но думаю, что для пустых каталогов можно было бы что-то придумать в этом духе.

mariolast 04-03-2009 14:15 1054728

Хм...мало что понял про препроцессор, что-то новенькое..
Еще вопрос.
Надо сделать возможность выбора при установке:

- Сетевая версия
- Локальная версия

И у каждого типа установки свои файлы и директории, в т.ч. и пустые. Но есть и общие.
Как это примерно реализовать?

Serega 04-03-2009 20:22 1055046

Цитата:

Цитата mariolast
Надо сделать возможность выбора при установке: »

Накидал вам два примера
читать дальше »
Код:

; 1 вариант, через [Components]

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

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

[Types]
Name: network; Description: Сетевая версия
Name: local; Description: Локальная версия; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: network; Flags: exclusive
Name: b; Description: Моя программа™64; Types: local; Flags: exclusive
Name: c; Description: Справка; Types: network local

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\MyProg-x64.exe; DestDir: {app}; Components: b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: c


; 2 вариант, через секцию [Tasks]

;[Setup]
;AppName=My Program
;AppVerName=My Program v 1.5
;DefaultDirName={pf}\My Program
;OutputDir=.

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

;[Tasks]
;Name: network; Description: Сетевая версия; GroupDescription: Варианты установки:; Flags: exclusive
;Name: local; Description: Локальная версия; GroupDescription: Варианты установки:; Flags: exclusive

;[Files]
;Source: compiler:Examples\MyProg.exe; DestDir: {app}; Tasks: network
;Source: compiler:Examples\MyProg-x64.exe; DestDir: {app}; Tasks: local
;Source: compiler:Examples\MyProg.chm; DestDir: {app}


mariolast 08-03-2009 18:23 1058198

Serega_,
Все получилось, спасибо :)

Теперь еще задача, надо поставить эмулятор, подойдет ли для этого InnoSetup?

Сначала запускаю
hinstall.exe -i
Далее в зависимости от выбора пользователя ((local or network) заношу значения в реестр
Dump_Multikey_net.reg или Dump_Multikey_loc.reg
Далее ставлю сам эмулятор коммандой
devcon install multikey.inf root\multikey

Все пожалуй, файлов для всего этого 24 штуки, наверное где то в темповой папке надо распаковать а после установки удалить.
Или лучше не заморачиваться и делать все в коммандной строке?

Serega 08-03-2009 20:05 1058244

mariolast, сказать честно, я не знаю, что такое эмулятор, но запускать программы или установку других программ можно через секцию [Run]...

P.S.
Нашёл у себя в примерах скрипт, скорей всего это то, что вам надо
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
;devcon install RAMDriv.inf RAMDriv

[Files]
Source: Files\FStarForce.sys; DestDir: {tmp}
Source: Files\dev000.inf; DestDir: {tmp}
Source: Files\devcon.exe; DestDir: {app}

[Run]
Filename: {app}\devcon.exe; Parameters: -r install {tmp}\dev000.inf 0; Flags: runhidden waituntilterminated

[UninstallRun]
Filename: {app}\devcon.exe; Parameters: " remove 0"; Flags: runhidden waituntilterminated


bish 08-03-2009 23:45 1058363

Цитата:

Цитата Mchik
Vadikan »

пора-бы обновить шапку:
на оффициале - 5.2.3 версия, и некоторые ссылки не рабочии.!

mariolast 09-03-2009 01:16 1058433

Делаю так

[Files]
Source: U:\INSTALL\Liga\HASP.drv\*; DestDir: {app}\haspdrv; Flags: ignoreversion recursesubdirs createallsubdirs
Source: U:\INSTALL\Liga\Emul\*; DestDir: {app}\MultiKey32; Flags: ignoreversion recursesubdirs createallsubdirs; components: local32 network32
Source: U:\INSTALL\Liga\Emul\MultiKey64\*; DestDir: {app}\MultiKey64; Flags: ignoreversion recursesubdirs createallsubdirs; components: local64 network64
[Run]

Filename: {app}\haspdrv\hinstall.exe; Parameters: -i; WorkingDir: {app}
Filename: {app}\MultiKey32\install.cmd; components: local32 network32; WorkingDir: {app}
Filename: {app}\MultiKey64\install.cmd; components: local64 network64; WorkingDir: {app}

[UninstallRun]
Filename: {app}\MultiKey32\remove.cmd; components: local32 network32; WorkingDir: {app}; Flags: runhidden waituntilterminated
Filename: {app}\MultiKey64\remove.cmd; components: local64 network64; WorkingDir: {app}; Flags: runhidden waituntilterminated

[UninstallDelete]
Type: files; Name: {win}\system32\drivers\multikey.sys
Type: filesandordirs; Name: {app}

install.cmd и remove.cmd это батники, запускаются с папок MultiKey32\ или MultiKey64\

Не работает скрипт при вызове комманд из батника, видимо надо его запускать прямо из папки MultiKey32\. Можно как то это реализовать?

Вроде так получилось
....
Filename: {app}\haspdrv\hinstall.exe; Parameters: -i; WorkingDir: {app}\haspdrv
Filename: {app}\MultiKey32\install.cmd; components: local32 network32; WorkingDir: {app}\MultiKey32\
Filename: {app}\MultiKey64\install.cmd; components: local64 network64; WorkingDir: {app}\MultiKey64\
...

de_MAX 12-03-2009 16:21 1061799

Может, кто знает или есть пример. В общем, задача следующая:
нужно сделать второй прогрессбар для отображения распаковки архивов freearc (возможно с использованием precomp). "RePack'ов" появляется очень много, а вот найти скрипт с использованием подобного не получается...

Serega 14-03-2009 23:11 1064060

de_MAX, для freearc или precomp не встречал, а если для распаковки архивов 7z, то есть библиотека is7z.dll, для показа хода распаковки 7z архивов во втором прогрессбаре. Инструкция и пример использования в архиве.

dissasminno 15-03-2009 20:47 1064846

Если Вы хотите получить исходный текст секции Code установочного скрипта любого инсталлятора сделанного с помощью Inno Setup, присылайте инсталлятор (либо ссылку на него).
Исходные тексты Code готовы к немедленной компиляции и дают 100% совпадение с оригиналом exe.

katok888 15-03-2009 21:06 1064860

dissasminno, интересно, а без мыла можно обойтись?

Serega 15-03-2009 21:31 1064893

dissasminno, т.е. вы хотите сказать, что (скорей всего за небольшую сумму денег) вы готовы извлечь секцию [code] в работоспособном состоянии? Есть программы с помощью которых можно узнать, что именно инсталлятор должен сделать из секции [code], но это будет понятно только тому, кто разбирается в программировании... Поэтому извлечь работоспособный код невозможно, а поэтому лохотрон разводить не надо...

Diman19 16-03-2009 02:18 1065134

Всем привет!Скажите пожалуйста как при создании выбора компонентов указать на один компонент несколько файлов?И если выбран компонент то эти файлы будут копироваться в указанную папку где они и должны быть?а если компонент не выбран при установке то они не будут копироваться.

Вот пример скрипта.

Source: "MyProg.exe"; DestDir: "{app}"; Components: program
Source: "MyProg.chm"; DestDir: "{app}"; Components: help
Source: "Readme.txt"; DestDir: "{app}"; Components: readme\en; Flags: isreadme
Source: "Readme-German.txt"; DestName: "Liesmich.txt"; DestDir: "{app}"; Components: readme\de; Flags: isreadme

Также хотелось бы узнать как на компонент установить на разные типы установки разные флаги?

Спасибо.

Serega 16-03-2009 08:09 1065200

Цитата:

Цитата Diman19
как при создании выбора компонентов указать на один компонент несколько файлов? »

читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

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

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: b; Description: Примеры скриптов; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\MyDll.dll; DestDir: {app}; Components: a
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a
Source: compiler:Examples\*.iss; DestDir: {app}; Components: b



Цитата:

Цитата Diman19
Также хотелось бы узнать как на компонент установить на разные типы установки разные флаги? »

в секции [Types], можно указать только один флаг - iscustom.
А что конкретно вы хотите сделать?

de_MAX 16-03-2009 11:10 1065301

Цитата:

Цитата Serega_
de_MAX, для freearc или precomp не встречал, а если для распаковки архивов 7z, то есть библиотека is7z.dll, для показа хода распаковки 7z архивов во втором прогрессбаре. Инструкция и пример использования в архиве.

Про 7-Zip знаю, думал, знаете про технику с freearc'ом, но все ровно спасибо.

MrLD 18-03-2009 14:57 1067285

Вопрос, существует ini файл такого вида
[***]
ConStr=Provider=***.1;Data Source=***;Initial Catalog=***

Мне необходимо изменить параметры Data Source и Initial Catalog при запуске инсталяции приложения. Создается окно с возможностью ввода этих параметров ( реализовано ). Теперь проблема: дело в том что inno setup понимает параметры записанные в каждой строке отдельно. Т.е. мне необходимо разбить строку на отдельные компоненты, изменить их и собрать снова а затем записать в ini. Как это сделать в [code] или существует другой путь?

Serega 18-03-2009 16:09 1067359

MrLD, а нельзя ли просто сразу вводить данные в том виде, в котором затем записывать, чтоб не заморачиваться с разбиением строки?

MrLD 18-03-2009 16:21 1067370

Нет, если я правильно понял о чем ты говоришь, дело в том что программа распознает только такую запись (строкой) в ini. А изменения в программу вносить нельзя. Так бы я сам изменил интерпретацию и все. а лезть в код запретили. А inno только с отдельными строками явно работает. Как это обойти.... ??

Serega 18-03-2009 17:26 1067418

MrLD, а инишник обязательно сохранять, может просто заново создать текстовый файл, только с расширением .ini?
SaveStringToFile(ExpandConstant('{app}\main.ini'), 'текст.....' + #13, true);

tem000 18-03-2009 23:44 1067789

Serega_, Подскажи как сделать. Есть программа и файлы которые должны с ней ассоциироваться, как сделать так чтобы сразу после установки проги в этих файлах отображалась иконка программы а не после перезагрузки компа?

Serega 19-03-2009 00:20 1067812

tem000, добавьте в секцию [Setup]
.......
ChangesAssociations=yes
........

MrLD 19-03-2009 09:57 1068025

Serega_, Можно конечно и создать. (уже пробовал).. только вот у меня задача при инсталяции изменить значение параметров в строке... а я не могу задать сразу несколько key для одного ini. Т.е. приходиться представлять для пользователя поле ввода куда ему надо записывать примерно следующее: Data Source=111;Initial Catalog=222
(ConStr=Provider=***;Data Source=111;Initial Catalog=222) а надо при установке (в появившемся окне) вносить изменения значения 111 и 222. Если бы data Source и initial catalog записывались каждый в своей строке вопроса не было бы. А вот как мне вытащить 111 и 222 (параметры data Source и initial catalog ) из строки а потом вставить их обратно измененными.... вот в чем вопрос.

Serega 19-03-2009 10:14 1068049

MrLD, а разве нельзя сделать, несколько полей ввода, чтоб разделить данные? Просто я как понял данные 111 и 222 у всех должны быть разные, ну и сделайте отдельное поля для данных 111 и для 222...
В противном случае вам необходимо читать строку посимвольно, а как это делать я пока не знаю... я только учусь :wink:...

MrLD 19-03-2009 10:34 1068081

Serega_, ))) Я так и сделал... поля ввода для 111 и 222 отдельные т.е. когда инсталяция завершена в ini файле отображается следующее
1. Если создаю ini:
Data Source = 111
Initial Catalog = 222

2. Если изменяю ini:
ConStr=Provider=***;Data Source=***;Initial Catalog=***

Data Source = 111
Initial Catalog = 222
Как видно inno setup при записи все время пытается записать параметры в отдельные строки. а при изменении не изменяет уже существующие параметры а добавляет те же но во все те же отдельные строки. Т.е. key для ini может быть только один (тот что первый (ConStr)). Мне набросал знакомый код по разбиению строки на отдельные параметры и дальнейшей ее сборки обратно в строку. только вот у меня не получается ее реализовать в [code].
Заранее извиняюсь за обьем сообщения может еще кто что посоветует? ))
читать дальше »

Код:

unit FrmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IniFiles, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Button3: TButton;
    Edit6: TEdit;
    Button4: TButton;
    Edit7: TEdit;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    FIntegrSecurity : String;
    FPersistSecInfo : String;
    FInitialCatalog : String;
    FDataSource    : String;
    FProvider      : String;

    procedure ParseStr(const AStr: String; var AProvider, AIntegrSecurity,
      APersistSecInfo, AInitialCatalog, ADataSource: String);
//    procedure CombineStr(var AStr: String; const AProvider, AIntegrSecurity,
//      APersistSecInfo, AInitialCatalog, ADataSource: String);
    procedure CombineStr(var AStr: String; const AProvider,
      AInitialCatalog, ADataSource: String);

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  SIntegrSecurity = 'Integrated Security';
  SPersistSecInfo = 'Persist Security Info';
  SInitialCatalog = 'Initial Catalog';
  SDataSource    = 'Data Source';
  SProvider      = 'Provider';
  SDelim          = ';';
  SEqual          = '=';


procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Ini: TIniFile;
  S: String;
begin
  Ini := TIniFile.Create('c:\a.ini');
  try
    S := Ini.ReadString('CONNECT', 'ConStr', '');
    Edit6.Text := S;
  finally
    if Assigned(Ini) then Ini.Free;
  end;
end;

{
procedure TForm1.CombineStr(var AStr: String; const AProvider,
  AIntegrSecurity, APersistSecInfo, AInitialCatalog, ADataSource: String);
begin
  AStr := Format('%s=%s;%s=%s;%s=%s;%s=%s;%s=%s', [SProvider, AProvider,
    SIntegrSecurity, AIntegrSecurity, SPersistSecInfo, APersistSecInfo,
    SInitialCatalog, AInitialCatalog, SDataSource, ADataSource]);
end;
}

procedure TForm1.CombineStr(var AStr: String; const AProvider,
      AInitialCatalog, ADataSource: String);
begin
  AStr := Format('%s=%s;%s=%s;%s=%s', [SProvider, AProvider,
    SInitialCatalog, AInitialCatalog, SDataSource, ADataSource]);
end;

procedure TForm1.ParseStr(const AStr: String; var AProvider,
  AIntegrSecurity, APersistSecInfo, AInitialCatalog, ADataSource: String);
  procedure ExtractParamAndValue(const Str: String; var Param, Value: String);
  var
    I: Integer;
  begin
    Param := ''; Value := '';
    I := Pos(SEqual, Str);
    if (I > 0) and (I < Length(Str)) then
    begin
      Param := copy(Str, 1, I - 1);
      Value := copy(Str, I + 1, MAXINT);
    end;
  end;

var
  I: Integer;
  S, S1, S2: String;
begin
  S := AStr;
  repeat
    I := Pos(SDelim, S);
    if I > 0 then
    begin
      ExtractParamAndValue(copy(S, 1, I - 1), S1, S2);
      S := copy(S, I + 1, MAXINT);
    end
    else
    begin
      ExtractParamAndValue(S, S1, S2);
      S := '';
    end;

    if S1 = SProvider      then FProvider      := S2 else
    if S1 = SIntegrSecurity then AIntegrSecurity := S2 else
    if S1 = SPersistSecInfo then APersistSecInfo := S2 else
    if S1 = SInitialCatalog then AInitialCatalog := S2 else
    if S1 = SDataSource    then ADataSource    := S2;

  until I <= 0
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ParseStr(Edit6.Text, FProvider, FIntegrSecurity, FPersistSecInfo,
    FInitialCatalog, FDataSource);
  Edit1.Text := FProvider;
  Edit2.Text := FIntegrSecurity;
  Edit3.Text := FPersistSecInfo;
  Edit4.Text := FInitialCatalog;
  Edit5.Text := FDataSource;

end;

procedure TForm1.Button4Click(Sender: TObject);
var
  S: String;
begin
  self.CombineStr(S, Edit1.Text, Edit5.Text, Edit4.Text);
  Edit7.Text := S;
end;

end.


Serega 19-03-2009 10:55 1068104

Цитата:

Цитата MrLD
Заранее извиняюсь за обьем сообщения »

используйте тег [more]
Цитата:

Цитата MrLD
inno setup при записи все время пытается записать параметры в отдельные строки »

так вобще-то это правильно ведь инишник никогда не пишется в одну строку, одним словом неправильный у вас инишник...
Цитата:

Цитата MrLD
Мне набросал знакомый код »

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

MrLD 19-03-2009 11:47 1068160

Я уже писал что инишник не правельный... а в программу лезть запретили чтоб поменять интерпретацию ((( вот так (( Если чего разберешь дай знать )) очень надеюсь... а то работа встала... сам уже 4-й день бьюсь...

Serega 19-03-2009 11:51 1068165

MrLD, а вы этот код на делфи проверяли на работоспасобность? А то я собрал, накидал на форму кнопки и едиты, а он не пашет, главно и не ругается, т.е вообще ничего не происходит... Если не сложно скиньте полный исходник посмотреть, можно в PM...

MrLD 19-03-2009 11:58 1068176

там надо создать ini и внести в него секцию [Connect] и запись в виде строки которую я приводил в пример.

[Connect]
ConStr=Provider=***;Data Source=***;Initial Catalog=***



и путь прописать к инишнику

Цитата:

Цитата MrLD
procedure TForm1.Button1Click(Sender: TObject);
var
Ini: TIniFile;
S: String;
begin
Ini := TIniFile.Create('c:\a.ini');
try
S := Ini.ReadString('CONNECT', 'ConStr', '');
Edit6.Text := S;
finally
if Assigned(Ini) then Ini.Free;
end;
end; »


Serega 19-03-2009 21:33 1068727

MrLD, ну, что обрадовать вас?
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DisableProgramGroupPage=yes
CreateUninstallRegKey=no
DisableDirPage=yes
CreateAppDir=no
Uninstallable=no
DisableFinishedPage=yes
DisableReadyPage=yes
OutputBaseFilename=My Program
OutputDir=.

Code]
const
  SIntegrSecurity = 'Integrated Security';
  SPersistSecInfo = 'Persist Security Info';
  SInitialCatalog = 'Initial Catalog';
  SDataSource = 'Data Source';
  SProvider = 'Provider';
  SDelim = ';';
  SEqual = '=';

var
  Form: TForm;
  lbl1, lbl2, lbl3, lbl4, lbl5, lbl6, lbl7: TLabel;
  btn1, btn2, btn3, btn4: TButton;
  edt1, edt2, edt3, edt4, edt5, edt6, edt7: TEdit;
  FIntegrSecurity, FPersistSecInfo, FInitialCatalog,
  FDataSource, FProvider : String;

procedure btn2Click(Sender: TObject);
begin
  Form.Close;
end;

procedure btn1Click(Sender: TObject);
var
  S: String;
begin
  S:= GetIniString('CONNECT', 'ConStr', '', 'c:\a.ini');
  edt6.Text:= S;
end;

procedure CombineStr(var AStr: String; const AProvider,
  AInitialCatalog, ADataSource: String);
begin
  AStr:= Format('%s=%s;%s=%s;%s=%s', [SProvider, AProvider,
        SInitialCatalog, AInitialCatalog, SDataSource, ADataSource]);
end;

procedure ExtractParamAndValue(const Str: String; var Param, Value: String);
var
  I: Integer;
begin
  Param:= '';
  Value:= '';
  I:= Pos(SEqual, Str);
  if (I > 0) and (I < Length(Str)) then
  begin
    Param:= copy(Str, 1, I - 1);
    Value:= copy(Str, I + 1, MAXINT);
  end;
end;

procedure ParseStr(const AStr: String; var AProvider,
    AIntegrSecurity, APersistSecInfo, AInitialCatalog, ADataSource: String);
var
  I: Integer;
  S, S1, S2: String;
begin
  S:= AStr;
  repeat
    I:= Pos(SDelim, S);
    if I > 0 then
    begin
      ExtractParamAndValue(copy(S, 1, I - 1), S1, S2);
      S:= copy(S, I + 1, MAXINT);
    end else
  begin
    ExtractParamAndValue(S, S1, S2);
    S:= '';
  end;

  if S1 = SProvider then FProvider:= S2 else
  if S1 = SIntegrSecurity then AIntegrSecurity:= S2 else
  if S1 = SPersistSecInfo then APersistSecInfo:= S2 else
  if S1 = SInitialCatalog then AInitialCatalog:= S2 else
  if S1 = SDataSource then ADataSource:= S2;

  until I <= 0
end;

procedure btn3Click(Sender: TObject);
begin
  ParseStr(edt6.Text, FProvider, FIntegrSecurity, FPersistSecInfo,
          FInitialCatalog, FDataSource);
  edt1.Text:= FProvider;
  edt2.Text:= FIntegrSecurity;
  edt3.Text:= FPersistSecInfo;
  edt4.Text:= FInitialCatalog;
  edt5.Text:= FDataSource;
end;

procedure btn4Click(Sender: TObject);
var
  S: String;
begin
  CombineStr(S, edt1.Text, edt5.Text, edt4.Text);
  edt7.Text:= S;
end;

procedure CreateComponents;
begin
  Form:= TForm.Create(Application);
  try
    Form.ClientWidth:= 345;
    Form.ClientHeight:= 300;
    Form.Caption:= 'Пример';
    Form.Position:= poScreenCenter;
    Form.Color:= clBtnFace;
    Form.Font.Color:= clWindowText;
    Form.Font.Height:= -11;
    Form.Font.Name:= 'MS Sans Serif';
    Form.Font.Style:= [];
    Form.PixelsPerInch:= 96;

      //lbl1
      lbl1:= TLabel.Create(Form);
      lbl1.Parent:= Form;
      lbl1.Left:= 24;
      lbl1.Top:= 8;
      lbl1.Width:= 86;
      lbl1.Height:= 13;
      lbl1.Caption:= 'Секция [Connect]';

    //lbl2
    lbl2:= TLabel.Create(Form);
    lbl2.Parent:= Form;
    lbl2.Left:= 24;
    lbl2.Top:= 48;
    lbl2.Width:= 39;
    lbl2.Height:= 13;
    lbl2.Caption:= 'Provider';

      //lbl3
      lbl3:= TLabel.Create(Form);
      lbl3.Parent:= Form;
      lbl3.Left:= 24;
      lbl3.Top:= 88;
      lbl3.Width:= 60;
      lbl3.Height:= 13;
      lbl3.Caption:= 'Data Source';

    //lbl4
    lbl4:= TLabel.Create(Form);
    lbl4.Parent:= Form;
    lbl4.Left:= 24;
    lbl4.Top:= 128;
    lbl4.Width:= 63;
    lbl4.Height:= 13;
    lbl4.Caption:= 'Initial Catalog';

      //lbl5
      lbl5:= TLabel.Create(Form);
      lbl5.Parent:= Form;
      lbl5.Left:= 24;
      lbl5.Top:= 168;
      lbl5.Width:= 68;
      lbl5.Height:= 13;
      lbl5.Caption:= 'Integr Security';

    //lbl6
    lbl6:= TLabel.Create(Form);
    lbl6.Parent:= Form;
    lbl6.Left:= 24;
    lbl6.Top:= 208;
    lbl6.Width:= 71;
    lbl6.Height:= 13;
    lbl6.Caption:= 'Persist SecInfo';

      //lbl7
      lbl7:= TLabel.Create(Form);
      lbl7.Parent:= Form;
      lbl7.Left:= 24;
      lbl7.Top:= 248;
      lbl7.Width:= 54;
      lbl7.Height:= 13;
      lbl7.Caption:= 'CombineStr';

    //btn1
    btn1:= TButton.Create(Form);
    btn1.Parent:= Form;
    btn1.Left:= 240;
    btn1.Top:= 64;
    btn1.Width:= 75;
    btn1.Height:= 22;
    btn1.Caption:= 'Читать';
    btn1.TabOrder:= 0;
    btn1.OnClick:= @btn1Click;
    btn1.Cursor:= crHand;
    btn1.ShowHint:=True;
    btn1.Hint:='Читать секцию [Connect] из файла';

      //btn2
      btn2:= TButton.Create(Form);
      btn2.Parent:= Form;
      btn2.Left:= 240;
      btn2.Top:= 176;
      btn2.Width:= 75;
      btn2.Height:= 22;
      btn2.Caption:= 'Закрыть';
      btn2.TabOrder:= 1;
      btn2.OnClick:= @btn2Click;
      btn2.Cursor:= crHand;
      btn2.ShowHint:=True;
      btn2.Hint:='Закрыть и продолжить установку';

    //btn3
    btn3:= TButton.Create(Form);
    btn3.Parent:= Form;
    btn3.Left:= 240;
    btn3.Top:= 96;
    btn3.Width:= 75;
    btn3.Height:= 22;
    btn3.Caption:= 'Разделить';
    btn3.TabOrder:= 2;
    btn3.OnClick:= @btn3Click;
    btn3.Cursor:= crHand;
    btn3.ShowHint:=True;
    btn3.Hint:='Разделить строку на данные';

      //btn4
      btn4:= TButton.Create(Form);
      btn4.Parent:= Form;
      btn4.Left:= 240;
      btn4.Top:= 128;
      btn4.Width:= 75;
      btn4.Height:= 22;
      btn4.Caption:= 'Объединить';
      btn4.TabOrder:= 3;
      btn4.OnClick:= @btn4Click;
      btn4.Cursor:= crHand;
      btn4.ShowHint:=True;
      btn4.Hint:='Объединить изменённые данные';

    //edt1
    edt1:= TEdit.Create(Form);
    edt1.Parent:= Form;
    edt1.Left:= 24;
    edt1.Top:= 64;
    edt1.Width:= 200;
    edt1.Height:= 21;
    edt1.TabOrder:= 4;

      //edt2
      edt2:= TEdit.Create(Form);
      edt2.Parent:= Form;
      edt2.Left:= 24;
      edt2.Top:= 184;
      edt2.Width:= 200;
      edt2.Height:= 21;
      edt2.TabOrder:= 5;

    //edt3
    edt3:= TEdit.Create(Form);
    edt3.Parent:= Form;
    edt3.Left:= 24;
    edt3.Top:= 224;
    edt3.Width:= 200;
    edt3.Height:= 21;
    edt3.TabOrder:= 6;

      //edt4
      edt4:= TEdit.Create(Form);
      edt4.Parent:= Form;
      edt4.Left:= 24;
      edt4.Top:= 144;
      edt4.Width:= 200;
      edt4.Height:= 21;
      edt4.TabOrder:= 7;

    //edt5
    edt5:= TEdit.Create(Form);
    edt5.Parent:= Form;
    edt5.Left:= 24;
    edt5.Top:= 104;
    edt5.Width:= 200;
    edt5.Height:= 21;
    edt5.TabOrder:= 8;

      //edt6
      edt6:= TEdit.Create(Form);
      edt6.Parent:= Form;
      edt6.Left:= 24;
      edt6.Top:= 24;
      edt6.Width:= 289;
      edt6.Height:= 21;
      edt6.TabOrder:= 9;

    //edt7
    edt7:= TEdit.Create(Form);
    edt7.Parent:= Form;
    edt7.Left:= 24;
    edt7.Top:= 264;
    edt7.Width:= 297;
    edt7.Height:= 21;
    edt7.TabOrder:= 10;

    Form.ShowModal;

  finally
    Form.Free;
  end;
end;

procedure InitializeWizard;
begin
  CreateComponents;
end;


MrLD 20-03-2009 15:44 1069398

Serega_, ((( не работает ((

MrLD 20-03-2009 16:12 1069424

Serega_У тебя этот код работает?

Serega 20-03-2009 16:15 1069425

MrLD, естественно... иначе бы не давал.

MrLD 20-03-2009 16:33 1069435

Serega_, У тебя tool- зы какиенить установленны?? а то у меня inno Application не понимает ((

Serega 20-03-2009 16:34 1069437

MrLD,
Установите себе ispack-5.2.3, упс уже вышло обновление, версия ispack-5.2.4-dev, сейчас скачаю, а также расширенную версию от Restools, которая добавляет много возможностей для инсталляторов...

P.S.
буду через час...


Забыл уточнить. Сначала нужно установить ispack, а затем обновить путём замены файлов от Restools.

Diman19 20-03-2009 17:02 1069460

Всем привет!Скажите пожалуйста как при выборе компонентов указать в какую папку копировать выбранные компоненты?Также интересует вопрос в том как сделать так чтобы если выбираешь один компонент,копируется файл с одним содержанием,а если выбираешь другой компонент или если компонент не выбирать,то копируется файл с таким же именет но только с другим содержанием внутри.Скажите пожалуйста как так сделать.

Serega 20-03-2009 17:27 1069492

Diman19,
пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: a\a; Description: Руководство пользователя; Types: full
Name: a\a\a; Description: Русский; Flags: exclusive
Name: a\a\b; Description: English; Flags: exclusive
Name: a\b; Description: Справка; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\Readme-ru.txt; DestDir: {app}; Components: a\a\a
Source: compiler:Examples\Readme-en.txt; DestDir: {app}; Components: a\a\b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a\b


Diman19 21-03-2009 20:32 1070569

Всем привет!Всем спасибо кто отвечает и помогает.Прошу помочь с маленькой проблемой.При создании исталлятора не работаю чекбоксы которые должны копировать файлы в папку если они помечены.Пишу код следующим образом

Name: programfiles; Description: Файлы программы; Types: full custom; Flags: fixed
Name: files; Description: Доп.файлы; Types: full
Name: plugins; Description: Плагины; Types: full custom
Name: "plugins\plugin1"; Description: "plugin1";



это путь к файлу запуска
Source: "C:\myprogram\myprogram.exe"; DestDir: "{app}"; Flags: ignoreversion
Это путь ко всем папкам и файлам.Тоестьв этой папке лежат файлы и папки программы.
Source: "C:\myprogram\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: programfiles

здесь я указываю путь к файлам плагина.

Source: "C:\myprogram\other\plugis\plugin1.exe"; DestDir: {app}; Components: plugins\plugin1

Source: "C:\myprogram\other\plugins\plugin1.txt"; DestDir: {app}; Components: plugins\plugin1

Проблема возникла в том что если во время установки не установить чекбоксы на плугины,то они всё равно устанавливаются незнаю почему.Скажите пожалуйста где я допустил ошибку?Может путь неправильно к файлам программы указал?Указывал папку со всеми файлами.Помогите пожалуйста разобраться

Serega 21-03-2009 20:43 1070580

Diman19, я ничего не понял, покажите скрипт полностью и используйте тег [ more][/more], чтоб ваше сообщение не было объёмным...

Diman19 22-03-2009 12:09 1070949

Serega_,

Ок Вот полный скрипт.

читать дальше »

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Myprogram"
#define MyAppVerName "Myprogram 1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "myprogram.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{5EEBB548-ED74-4FFF-9D6D-BE4A6C859BA4}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
LicenseFile=C:\myprogram\readme.txt
OutputDir=C:\Documents and Settings\Дима\My Documents
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
ComponentsListTVStyle=true

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

[Types]
Name: full; Description: Полная установка
Name: recomend; Description: Рекомендуемая установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: programfiles; Description: Файлы программы™; Types: full recomend custom; Flags: fixed
Name: source; Description: Исходники; Types: full
Name: plugins; Description: Плагины; Types: full recomend custom
Name: "plugins\Plugin1"; Description: "Plugin1";



[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\myprogram\myprogram.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\myprogram\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: programfiles
Source: "C:\myprogram\other\plugins\plugin1.exe"; DestDir: {app}; Components: plugins\Plugin1
Source: "C:\myprogram\other\plugins\plugin1.txt"; DestDir: {app}; Components: plugins\Plugin1

; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent

Serega 22-03-2009 15:24 1071034

Diman19, добавьте Excludes: plugin1.exe, plugin1.txt
читать дальше »
Код:

......................................
Source: C:\myprogram\*; DestDir: {app}; Excludes: plugin1.exe, plugin1.txt; Flags: ignoreversion recursesubdirs createallsubdirs; Components: programfiles
Source: C:\myprogram\other\plugins\plugin1.exe; DestDir: {app}; Components: plugins\Plugin1; Flags: ignoreversion
Source: C:\myprogram\other\plugins\plugin1.txt; DestDir: {app}; Components: plugins\Plugin1; Flags: ignoreversion
......................................


Serega 22-03-2009 21:34 1071300

Здравствуйте, решил реализовать в Inno Setup 'Бегущую строку' и вот, что получилось...
читать дальше »
Код:

; Решил реализовать в Inno Setup 'Бегущую строку' и вот, что получилось...
; Для нормальной работы у Вас должен быть установлен набор от Restools http://restools.hanzify.org/
; Подразумеваю под словом набор - InnoCompiler и ISCmplr, последние версии Вы можете найти на сайте Restools.
; Автор: Serega, http://forum.oszone.net/member.php?userid=88670

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[_Code]
var
  lbl1: TLabel;
  tmr1: TTimer;

procedure tmr1Timer(Sender: TObject);
var
  str: string;
begin
  str:= lbl1.Caption;
  lbl1.Caption:= Copy(str, 2, Length(str) - 1) + Copy(str, 1, 1);
end;

procedure InitializeWizard();
begin
  //lbl1
  lbl1:= TLabel.Create(WizardForm);
  with lbl1 do begin
    Parent:= WizardForm;
    Left:= 20;
    Top:= 325;
    Width:= 200;
    Height:= 20;
    AutoSize:= False;
    Caption:= 'Вот, что можно сделать средствами Inno Setup...  ';
    Font.Color:= clWindowText;
    Font.Height:= -16;
    Font.Name:= 'MS Sans Serif';
    Font.Style:= [];
    ParentFont:= False;
  end;
 
  //tmr1
  tmr1:= TTimer.Create(WizardForm);
  with tmr1 do begin
    Interval:= 200;
    OnTimer:= @tmr1Timer;
  end;
end;


Для правильной работы требуется: ispack, после чего необходимо обновить, путём замены файлов, до расширенной версии от Restools.
В расширенную версию входят:
InnoCompiler - в неё входят файлы: Compil32.exe и Templates.dat;
Inno_ISCmplr_Setup - в неё входят файлы, лучше из папки InnoSetup_FullVCL: setup.e32, ISCmplr.dls, ISCmplr.dll и SetupLdr.e32.

de_MAX 23-03-2009 12:18 1071865

Serega_,
Что-то не выходит:
Цитата:

Unknown type 'TTimer'

Serega 23-03-2009 13:20 1071956

de_MAX, установите себе ispack, а затем обновите, путём замены файлов, до расширенной версии от Restools. Ссылки я давл выше, ссылка на пост.

de_MAX 23-03-2009 15:24 1072120

Serega_, у меня стоит ispack-5.2.4-dev и Restools

Serega 23-03-2009 16:30 1072207

de_MAX, Restools:
InnoCompiler090319_English - в неё входят файлы: Compil32.exe и Templates.dat;
Inno_ISCmplr_Setup090302 - в неё входят файлы, лучше из папки InnoSetup_FullVCL: setup.e32, ISCmplr.dls, ISCmplr.dll и SetupLdr.e32.
У вас скорей всего не установлен Inno_ISCmplr_Setup...

de_MAX 23-03-2009 16:46 1072237

Serega_, спасибо. После установки Inno_ISCmplr_Setup все работает.

MrLD 24-03-2009 11:27 1073036

Serega_, Здравствуй... Извини на сопровождение кинули. Если не тяжело давай вернемся к разговору про запись ini. Я подумал и решил не заморачиваца над разбиением. Т.к. посмотрев форум внимательней заметил что key можно принудительно в строку записать. но проблемма в том что после создания + #13 преобразуется в символ переноса на новою строку. т.е. "квадратный ноль". Не знаю понял ли ты меня просто на форуме код преобразуется и привести тебе пример я не могу.

MrLD 24-03-2009 12:36 1073128

Serega_, Вопрос снят ошибку понял )

MrLD 24-03-2009 16:21 1073339

Serega_, Вот такая строка
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini',
'[Connect]' + #13 + 'ConStr=Provider=SQLOLEDB.1' + ';Data Source=' + 'NameSource' + ';Initial Catalog=' + 'NameCatalog', true);
Как назначить NameSource и NameCatalog переменными?

Serega 24-03-2009 17:11 1073402

MrLD, всё очень просто, а если Вас не научили родители простому этикету, сказать ‘спасибо’, когда человек в ответ на Вашу просьбу, потратил четыре часа своего личного времени, на решение Вашей задачи, то о чём можно разговаривать...
Форум, это прежде всего общение, а не потребительский инстинкт, что мне надо, а вы решите за меня...
Просто по человечески становится обидно...
Цитата:

Цитата MrLD
Как назначить NameSource и NameCatalog переменными? »

Пишите процедуры под названием NameSource и NameCatalog и пишите, что они должны делать, а затем записываете так:
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini',
'[Connect]' + #13 + 'ConStr=Provider=SQLOLEDB.1' + ';Data Source=' + {code:NameSource} + ';Initial Catalog=' + {code:NameCatalog}, true);

MrLD 24-03-2009 17:39 1073434

Serega_, ))))))) Вопрос опять снят ))

Serega_, Искренне прошу прощения. Я уже написал что перекинули на другую задачу.... И огромное Спасибо )) не держи зла.. просто забегался )) Конец месяца и все такое )) А с переменными уже разобрался но все равно спасибо ))

Serega_, Пристыдил ))) Еще раз спасибо )) и еще раз извини ))

ChVL 25-03-2009 16:40 1074472

В файл {sys}\drivers\etc\hosts надо добавить строку 127.0.0.1 www.example.cоm.
Как это прописать в скрипте?

Serega 25-03-2009 16:47 1074477

ChVL, SaveStringToFile(путь и имя файла, 'текст', true);

VLADIS LOVE 25-03-2009 19:27 1074654

Подскажите, как сделать категории выбора в инсталляции. Например, я делаю патч для игры. У меня такие параметры:
Геймплей (реальный, оригинальный - оба исключительно), затем следующая категория - язык (русский английский, тоже исключительно) и т.д. Как сделать в ISTOOL или по-другому, чтобы была такая возможность выбора?

ChVL 25-03-2009 20:57 1074735

Serega_,
Спасибо за подсказку!
Вот рабочий вариант:
Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep=ssPostInstall
then
begin
 SaveStringToFile(ExpandConstant('{sys}')+'\drivers\etc\hosts', ' 127.0.0.1 www.example.com', True);
end;
end;

Запись производится в конце установки, т.к. иначе она получалась кривой.
Есть одна тонкость: запись делается в том месте, где остановился курсор от предыдущей. Для полного счастья надо бы перед вводимой строкой (127.0.0.1) вписать команду на перевод строки. Как это сделать?

Serega 25-03-2009 21:20 1074753

ChVL, первод строки #13, т.е.
SaveStringToFile(ExpandConstant('{sys}')+'\drivers\etc\hosts', #13 + ' 127.0.0.1 www.example.com', True);

P.S.
Если будет при компилляции ругаться, тогда:
SaveStringToFile(ExpandConstant('{sys}')+'\drivers\etc\hosts', '' + #13 + ' 127.0.0.1 www.example.com', True);
хотя ругаться не должен...

Diman19 25-03-2009 21:23 1074755

Всем привет!Скажите пожалуйста для чего используется Excludes?И как пути к файлам программы указывать?Как целая папка или по каждому файлу?

ChVL 25-03-2009 21:55 1074788

Serega_,
Yes-s!! Вот теперь уже всё. Спасибо!!

Serega 25-03-2009 21:55 1074789

VLADIS LOVE,
Пример
Код:

; Первый вариант

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Геймплей; Types: full custom; Flags: fixed
Name: a\a; Description: Реальный; Types: full custom; Flags: exclusive
Name: a\b; Description: Оригинальный; Types: full custom; Flags: exclusive
Name: b; Description: Язык; Types: full custom; Flags: fixed
Name: b\a; Description: Русский; Types: full custom; Flags: exclusive
Name: b\b; Description: Английский; Types: full custom; Flags: exclusive

[Files]
Source: .......; DestDir: {app}; Components: a
Source: .......; DestDir: {app}; Components: a\a
Source: .......; DestDir: {app}; Components: a\b
Source: .......; DestDir: {app}; Components: b
Source: .......; DestDir: {app}; Components: b\a
Source: .......; DestDir: {app}; Components: b\b

; Второй вариант
;[Setup]
;AppName=My Program
;AppVerName=My Program v 1.5
;DefaultDirName={pf}\My Program
;OutputDir=.
;Compression=lzma/ultra
;InternalCompressLevel=ultra
;SolidCompression=yes

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

;[Tasks]
;Name: a; Description: Реальный; GroupDescription: Геймплей:; Flags: exclusive
;Name: b; Description: Оригинальный; GroupDescription: Геймплей:; Flags: exclusive unchecked
;Name: c; Description: Русский; GroupDescription: Язык:; Flags: exclusive
;Name: d; Description: Английский; GroupDescription: Язык:; Flags: exclusive unchecked

;[Files]
;Source: .......; DestDir: {app}; Tasks: a
;Source: .......; DestDir: {app}; Tasks: b
;Source: .......; DestDir: {app}; Tasks: c
;Source: .......; DestDir: {app}; Tasks: d



Diman19,
Цитата:

Цитата из справки
Excludes
Описание:
Указывает список образцов для исключения, разделенных запятыми. Этот параметр не комбинируется с флагом external

Цитата:

Цитата Diman19
как пути к файлам программы указывать »

Source: полный путь\CTL3DV2.DLL; DestDir: {sys}; Flags: onlyifdoesntexist uninsneveruninstall
Цитата:

Цитата Diman19
целая папка или по каждому файлу »

Да как вам будет удобней, для папки надо писать так:
Source: полный путь к папке\*; DestDir: {app}; Flags: ignoreversion createallsubdirs recursesubdirs

VLADIS LOVE 26-03-2009 11:43 1075157

Serega_, спасибо большое!

VLADIS LOVE 27-03-2009 10:50 1076015

И еще один вопросик:
Можно сделать чтобы был вид спойлера, т.е. нажимаешь на плюсик и открывался выбор компонентов? Знаю, то NSIS можно, а в INNO?

Serega 27-03-2009 11:03 1076029

VLADIS LOVE, добавьте в секцию [Setup] строку ComponentsListTVStyle=true. Вам понадобится расширенная версия от Resstools, ссылки я давал выше.

volk1234 27-03-2009 16:57 1076389

Тема прикреплена в форуме...

volk1234 28-03-2009 03:37 1076888

Serega_ и другие заинтересованные лица:

Я в Inno профан поэтому просьба к вам, посмотрите шапку- может чего лишнего убрать?
Допустим оставить только ссылку на версия 5.2.4 ?? Или 5.2.0 тоже нужна?
Жду предложений.

Serega 28-03-2009 09:56 1076984

volk1234, как говорят, выскажу лично своё мнение...

Можно убрать:
Unpaker 2.0 , Зеркало, зеркало - распаковывает инсталляторы версии 5.2.2;
Inno Setup Pack 5.2.2 RU.

Немного перефразировать ссылку:
- Как убрать окно приветствия в мастере установки приложения: на - Как убрать страницу приветствия (wpWelcome) в мастере установки приложения:, я понимаю, что в такой форме вопрос был задан, но так более понятней...

Diman19 28-03-2009 16:45 1077232

Всем привет!Скажите пожалуйста как создать отдельное окно для ввода ключа продукта?Вот пример


Спасибо!

Serega 30-03-2009 02:45 1078565

Цитата:

Цитата Diman19
как создать отдельное окно для ввода ключа продукта? »

Сделал на странице приветствия
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Messages]
ClickNext=Вы должны ввести серийный номер, чтобы продолжить, или «Отмена», чтобы выйти из программы установки.

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

; заносим данные в реестр, 1 вариант
[Registry]
Root: HKCU; SubKey: Software\My Program; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\My Program\Settings; ValueType: string; ValueName: Serial; ValueData: {code:edtText}; Flags: uninsclearvalue

Code]
var
  edt: array [1..5] of TEdit;
  txt: TNewStaticText;
  i, e, t: integer;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpWelcome then
  WizardForm.NextButton.Enabled:= False; // отключаю кнопку Далее
end;

function edtText(s: string): string; //этот вариант, при записи через секцию [Registry]
//function edtText: string; // а этот, если вносить запись через 2 вариант
//var                      //
//  s: string;              //
begin
 { получаем текст из edit'ов и присваем переменной s }
  for i:= 1 to 5 do begin
    s:= s + edt[i].Text + '-';
  end;
 { удаляем лишний знак тире в конце строки }
  s:= Copy(s, 1, Length(s) - 1);
  Result:= s;
end;

//procedure CurStepChanged(CurStep: TSetupStep);
//begin
// { занасим данные в реестр 2 вариант}
//  If CurStep = ssDone then
//  RegWriteStringValue(HKEY_CURRENT_USER, 'Software\My Program\Settings', 'Serial', edtText);
//end;

//procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
//begin
// { удаляем данные из реестра, 2 вариант
//  Здесь надо быть очень внимательным, а то по неосторожности можно удалить весь раздел... :) }
//  If CurUninstallStep = usDone then
//  RegDeleteKeyIncludingSubkeys(HKEY_CURRENT_USER, 'Software\My Program');
//end;

procedure edtKeyPress(Sender: TObject; var Key: Char);
begin
{ здесь попытался реализовать, чтоб курсор автоматом перескакивал на следующий edit при вводе,
 но есть косяк, если начать удалять через Backspace, то из-за SetFocus курсор снова перескакивает на уже очищенный edit }
  for i:= 1 to 4 do begin
    if Length(edt[i].Text) = 4 then edt[i+1].SetFocus;
  end;
{ проверяем условие если все edit'ы заполненны, то делаем доступной кнопку Далее}
  for i:= 1 to 5 do begin
    if Length(edt[i].Text) >= 4 then
    WizardForm.NextButton.Enabled:= True else
    WizardForm.NextButton.Enabled:= False;
  end;
end;

procedure CreateComponents;
begin
  WizardForm.NextButton.Enabled:= False;
  t:= 57;
  e:= t;
  // создаём 4 тире
  for i:= 1 to 4 do begin
  txt:= TNewStaticText.Create(WizardForm.WelcomePage);
    with txt do begin
      Parent:= WizardForm.WelcomePage;
      Name:= 'txt' + IntToStr(i+1);
      Left:= 173 + (t*i);
      Top:= 182;
      Caption:= '-';
      AutoSize:= True;
      Font.Height:= -13;
      Font.Style:= [fsBold];
    end;
  end;
  // создаём 5 edit'ов
  for i:= 1 to 5 do begin
  edt[i]:= TEdit.Create(WizardForm.WelcomePage);
    with edt[i] do begin
      Parent:= WizardForm.WelcomePage;
      Left:= 123 + (e*i);
      Top:= 180;
      Width:= 47;
      Height:= 21;
      MaxLength:= 5;
      OnKeyPress:= @edtKeyPress;
    end;
  end;
end;

procedure InitializeWizard();
begin
  CreateComponents;
end;


Diman19 31-03-2009 02:00 1079660

Спасибо за скрипт.А не подскажешь как сделать чтобы это всё было после окна приветствия?

Спасибо!

Serega 31-03-2009 02:30 1079673

Diman19, так чего же сразу не сказали. Только не окна, а страницы... Сделал второй страницей
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Messages]
ClickNext=Вы должны ввести серийный номер, чтобы продолжить, или «Отмена», чтобы выйти из программы установки.

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

; заносим данные в реестр, 1 вариант
[Registry]
Root: HKCU; SubKey: Software\My Program; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\My Program\Settings; ValueType: string; ValueName: Serial; ValueData: {code:edtText}; Flags: uninsclearvalue

Code]
var
  edt:array [1..5] of TEdit;
  txt: TNewStaticText;
  i, e, t: integer;
  NewPage: TWizardPage;
  lbl: TLabel;
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = NewPage.ID then
  WizardForm.NextButton.Enabled:= False; // отключаю кнопку Далее
end;

function edtText(s: string): string; //этот вариант, при записи через секцию [Registry]
//function edtText: string; // а этот, если вносить запись через 2 вариант
//var                      //
//  s: string;              //
begin
 { получаем текст из edit'ов и присваем переменной s }
  for i:= 1 to 5 do begin
    s:= s + edt[i].Text + '-';
  end;
 { удаляем лишний знак тире в конце строки }
  s:= Copy(s, 1, Length(s) - 1);
  Result:= s;
end;

//procedure CurStepChanged(CurStep: TSetupStep);
//begin
// { занасим данные в реестр 2 вариант}
//  If CurStep = ssDone then
//  RegWriteStringValue(HKEY_CURRENT_USER, 'Software\My Program\Settings', 'Serial', edtText);
//end;

//procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
//begin
// { удаляем данные из реестра, 2 вариант
//  Здесь надо быть очень внимательным, а то по неосторожности можно удалить весь раздел... :) }
//  If CurUninstallStep = usDone then
//  RegDeleteKeyIncludingSubkeys(HKEY_CURRENT_USER, 'Software\My Program');
//end;

procedure edtKeyPress(Sender: TObject; var Key: Char);
begin
{ здесь попытался реализовать, чтоб курсор автоматом перескакивал на следующий edit при вводе,
 но есть косяк, если начать удалять через Backspace, то из-за SetFocus курсор снова перескакивает на уже очищенный edit }
  for i:= 1 to 4 do begin
    if Length(edt[i].Text) = 4 then edt[i+1].SetFocus;
  end;
{ проверяем условие если все edit'ы заполненны, то делаем доступной кнопку Далее}
  for i:= 1 to 5 do begin
    if Length(edt[i].Text) >= 4 then
    WizardForm.NextButton.Enabled:= True else
    WizardForm.NextButton.Enabled:= False;
  end;
end;

procedure SerialPage;
begin
  NewPage:= CreateCustomPage(wpWelcome, 'Ввод кода', 'бла бла бла и т.д. ');

  WizardForm.NextButton.Enabled:= False;
  t:= 57;
  e:= t;
  // создаём Label
  lbl:=TLabel.Create(NewPage);
    with lbl do begin
      Left:= 0;
      Top:= 0;
      Width:= 417;
      Height:= 28;
      AutoSize:= False;
      WordWrap:= True;
      Caption:= 'Введите код, отпечатанный на последней странице обложки Руководства пользователя или на упаковке диска.';
      Parent:= NewPage.Surface;
    end;

  // создаём 4 тире
  for i:= 1 to 4 do begin
  txt:= TNewStaticText.Create(NewPage);
    with txt do begin
      Parent:= NewPage.Surface;
      Name:= 'txt' + IntToStr(i+1);
      Left:= 50 + (t*i);
      Top:= 50;
      Caption:= '-';
      AutoSize:= True;
      Font.Height:= -13;
      Font.Style:= [fsBold];
    end;
  end;
  // создаём 5 edit'ов
  for i:= 1 to 5 do begin
  edt[i]:= TEdit.Create(NewPage);
    with edt[i] do begin
      Parent:= NewPage.Surface;
      Left:= 0 + (e*i);
      Top:= 47;
      Width:= 47;
      Height:= 21;
      MaxLength:= 5;
      OnKeyPress:= @edtKeyPress;
    end;
  end;
end;

procedure InitializeWizard();
begin
  SerialPage;
end;


AnalogXP 02-04-2009 12:11 1081807

Здравствуйте!

Только вчера перешел с NSIS на Inno Setup и возникло пара вопросов:

1. Если удаляем программу Х, то появляется сообщение о подтверждении. Так вот, после этого сообщения нужно запустить другую программу Y и только после ее закрытия, продолжить удаление X. Вот что сейчас у меня:
Код:

[UninstallRun]
Filename: {app}\Feedback.exe; Flags: waituntilidle

Программа Y появляется, но удаление продолжается, и сама Y остается в папке.

2. Как закрыть программу Х, если она работает, а пользователь запустил удаление программы? Или вывести сообщение что нужно закрыть программу перед удалением.

3. Как насильно удалить папку деисталированной программы (она у меня так и остается)?

4. Как найти и удалить папку из Application Data\MyProgram (чтобы работало и в XP и Vista)?

Заранее благодарен за помощь!

Serega 02-04-2009 13:11 1081857

AnalogXP,
1-ый вопрос
Так всё правильно, вы используете флаг waituntilidle
Цитата:

Цитата из Справки
Если установлен этот флаг, инсталляция остановится и подождет, пока пользователь введет необходимые ей данные, вместо того, чтобы ожидать окончания процесса. (Как функция Win32 WaitForInputIdle). Не комбинируется с nowait.

Вам нужен флаг waituntilterminated
Цитата:

Цитата из Справки
Если указан этот флаг, инсталлятор подождет, пока процесс полностью завершится. Обратите внимание, что этот флаг всегда задается по умолчанию (т.е. для того, чтобы инсталлятор подождал, пока завершится процесс, этот флаг указывать не обязательно). Указывается он только в комбинации с флагом shellexec - в этом случае это необходимо, если инсталлятор должен дождаться завершения процесса. Не комбинируется с флагами nowait и waituntilidle.

т.е. вам надо записать так:
Код:

[UninstallRun]
Filename: {app}\Feedback.exe; Flags: waituntilterminated


3-ий и 4-ый вопрос
напишите в секции Code, следующее:
Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  If CurUninstallStep = usDone then
  // проверяем существование папки после удаления программы
  if DirExists(ExpandConstant('{userappdata}\My Program')) = True then
  // если существует, то удаляем её со всеми подпапками и файлами которые остались
  DelTree(ExpandConstant('{userappdata}\My Program'), True, True, True);
  // путь к папке (Application Data) - {userappdata} - для текущего пользователя, {commonappdata} - для всех пользователей
end;

Должно работать и на Vista, но проверить негде.

По второму вопросу, чуть позже...

Serega 02-04-2009 14:52 1081924

Вложений: 1
AnalogXP,
2-ой вопрос

Вам потребутся ISTask.dll, которую прикрепил к сообщению.
Пример использования ISTask.dll:
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Run]
Filename: {app}\MyProg.exe; Description: Запустить программу MyProg?; Flags: postinstall nowait skipifsilent

; ниже поправьте название секции
[_Code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
  external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function KillTask(ExeFileName: string): Integer;
  external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  if RunTask('MyProg.exe', false) then begin
    UninstallProgressForm.Visible := False;
    if MsgBox('Обнаружена запущенная программа MyProg. Завершить?', mbConfirmation, mb_yesno) = idyes then begin
      KillTask('MyProg.exe');
      UnloadDll(ExpandConstant('{app}\ISTask.dll'));
      UninstallProgressForm.Visible := True;
    end else begin
      MsgBox('Завершите работу программы MyProg, затем снова запустите программу удаления.', mbInformation, mb_ok);
      UnloadDll(ExpandConstant('{app}\ISTask.dll'));
      Abort;
    end;
  end else begin
    UnloadDll(ExpandConstant('{app}\ISTask.dll'));
  end;
end;


AnalogXP 02-04-2009 16:23 1082023

Serega_, спасибо, то что нужно.
Вот только собственную папку так и не сумел удалить. Чего-то я не понял:

Код:

[_Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  If CurUninstallStep = usDone then 
  begin
        ...
        if DirExists(ExpandConstant('{app}') = True then
                DelTree(ExpandConstant('{app}', True, True, True);
  end;
end;


Serega 02-04-2009 16:44 1082062

AnalogXP, значит из этой папки во время удаления запущен какой-то процесс... Попробуйте выяснить какой процесс запущен и используйте для него:
DelayDeleteFile(ExpandConstant('{app}\FileName'), 2);
Цитата:

Цитата из Справки
procedure DelayDeleteFile(const Filename: String; const Tries: Integer);
Описание:
Попытается удалить Filename, повторяя попытки Tries раз, если файл используется. Задержка между попытками - 250 мсек.


AnalogXP 02-04-2009 17:44 1082132

Цитата:

Цитата Serega_
AnalogXP, значит из этой папки во время удаления запущен какой-то процесс... Попробуйте выяснить какой процесс запущен и используйте для него: »

Там остается только одна пустая папка 'language'. Из нее файлы также удаляются а вот сама...

Кстате предыдущий код вообще не компилируется (прошу прощения за ошибку). Вот измененный:
Код:

if DirExists('{app}') = True then
                                DelTree('{app}', True, True, True);

Но как уже сказал папка программы и вложенная, остаются.

Serega 02-04-2009 18:24 1082174

Вот, реализовал интересный эффект - эффект печатной машинки, т.е. текст на мастере появляется не сразу, а по одной букве, что создаёт эффект того, что текст печатается...
Скрипт
Код:

; Интересный эффект для Вашего инсталлятора, эффект печатной машинки...
; Для нормальной работы у Вас должен быть установлен набор от Restools http://restools.hanzify.org/
; Подразумеваю под словом набор - InnoCompiler и ISCmplr, последние версии Вы можете найти на сайте Restools.
; Автор: Serega, http://forum.oszone.net/member.php?userid=88670

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

Code]
var
  lbl1, lbl2: TLabel;
  txt1, txt2: string;
  i: Integer;
  tmr1: TTimer;

procedure tmr1Timer(Sender: TObject);
begin
  tmr1.Enabled:= False;

  txt1:= WizardForm.WelcomeLabel1.Caption;
  txt2:= WizardForm.WelcomeLabel2.Caption;

  lbl1.Caption:= '';
  for i:= 1 to Length(txt1) do begin
    if Application.Terminated then Break; // контроль закрытия приложения и выход из цикла
    lbl1.Caption:= lbl1.Caption + txt1[i];
    Application.ProcessMessages;
    Sleep(100); // время задержки между показом букв
  end;

  lbl2.Caption:= '';
  for i:= 1 to Length(txt2) do begin
    if Application.Terminated then Break; // контроль закрытия приложения и выход из цикла
    lbl2.Caption:= lbl2.Caption + txt2[i];
    Application.ProcessMessages;
    Sleep(60); // время задержки между показом букв
  end;
end;

procedure CreateComponents;
begin
// скрываем стандартные Label'ы
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;

// задаём свои Label'ы
  lbl1:= TLabel.Create(WizardForm);
  with lbl1 do begin
    Left:= WizardForm.WelcomeLabel1.Left;
    Top:= WizardForm.WelcomeLabel1.Top;
    Width:= WizardForm.WelcomeLabel1.Width;
    Height:= WizardForm.WelcomeLabel1.Height;
    AutoSize:= WizardForm.WelcomeLabel1.AutoSize;
    WordWrap:= WizardForm.WelcomeLabel1.WordWrap;
    Font.Style:= WizardForm.WelcomeLabel1.Font.Style;
    Font.Size:= WizardForm.WelcomeLabel1.Font.Size;
    Font.Color:= WizardForm.WelcomeLabel1.Font.Color;
    Transparent:= True;
    Caption:= '';
    Parent:= WizardForm.WelcomePage;
  end;

  lbl2:=TLabel.Create(WizardForm);
  with lbl2 do begin
    Left:= WizardForm.WelcomeLabel2.Left;
    Top:= WizardForm.WelcomeLabel2.Top;
    Width:= WizardForm.WelcomeLabel2.Width;
    Height:= WizardForm.WelcomeLabel2.Height;
    AutoSize:= WizardForm.WelcomeLabel2.AutoSize;
    WordWrap:= WizardForm.WelcomeLabel2.WordWrap;
    Font.Style:= WizardForm.WelcomeLabel2.Font.Style;
    Font.Size:= WizardForm.WelcomeLabel2.Font.Size;
    Font.Color:= WizardForm.WelcomeLabel2.Font.Color;
    Transparent:= True;
    Caption:= '';
    Parent:= WizardForm.WelcomePage;
  end;

  tmr1:= TTimer.Create(WizardForm);
  with tmr1 do begin
    Interval:= 500; // время задержки перед началом показа текста
    OnTimer:= @tmr1Timer;
  end;
end;

procedure InitializeWizard();
begin
  CreateComponents;
end;


AnalogXP 02-04-2009 19:38 1082274

Код:

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppName=MyProgramName
AppVerName=MyProgramName 3.1
AppPublisher=MyCompany
DefaultDirName={pf}\MyProgramName
DefaultGroupName=MyProgramName
AllowNoIcons=yes
OutputDir=E:\Install\Programe\Programa\MyProgramName
OutputBaseFilename=MyProgramName_3.1
SetupIconFile=E:\Install\Programe\Programa\MyProgramName \in.ico
Uninstallable=yes
UninstallDisplayIcon={app}\unins000.exe, 2
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: E:\Install\Programe\Programa\MyProgramName\Installer\MyProgramName .exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Install\Programe\Programa\MyProgramName\Installer\LICENSE.TXT; DestDir: {app}; Flags: ignoreversion
Source: E:\Install\Programe\Programa\MyProgramName\Installer\sqlite3.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Install\Programe\Programa\MyProgramName\Installer\VIcon.bin; DestDir: {app}; Flags: ignoreversion
Source: E:\Install\Programe\Programa\MyProgramName\Installer\Feedback.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Install\Programe\Programa\MyProgramName\Installer\language\*; DestDir: {app}\language; Flags: ignoreversion recursesubdirs
Source: E:\Install\Programe\Programa\MyProgramName\Installer\un.ico; DestDir: {app}; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: {group}\MyProgramName ; Filename: {app}\MyProgramName.exe
Name: {group}\{cm:ProgramOnTheWeb,MyProgramName }; Filename: http://www.mycompany.com/
Name: {group}\{cm:UninstallProgram,MyProgramName }; Filename: {uninstallexe}; IconFilename: {app}\un.ico
Name: {commondesktop}\MyProgramName; Filename: {app}\MyProgramName.exe; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\MyProgramName; Filename: {app}\MyProgramName.exe; Tasks: quicklaunchicon

[Run]
Filename: {app}\MyProgramName.exe; Description: {cm:LaunchProgram,MyProgramName}; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKCU; Subkey: Software\MyProgramName\Options\Position; Flags: uninsdeletekey

[UninstallRun]
Filename: {app}\Feedback.exe; Flags: waituntilterminated

[_Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  If CurUninstallStep = usDone then  // проверяем существование папки после удаления программы
  begin
        if DirExists(ExpandConstant('{userappdata}\MyProgramName')) = True then 
                DelTree(ExpandConstant('{userappdata}\MyProgramName'), True, True, True); 
        if DirExists('{app}') = True then
                DelTree('{app}', True, True, True);
  end;
end;


Serega 02-04-2009 21:55 1082467

AnalogXP, в скрипте, у вас всё нормально, по крайней мере ошибок я не нашёл. Единственное, что в секции [Files], я бы записал так:
читать дальше »

Код:

.........
[Files]
Source: E:\Install\Programe\Programa\MyProgramName\Installer\*; DestDir: {app}; Flags: ignoreversion createallsubdirs recursesubdirs
........

т.е. все файлы в одной строке. Если в папке Installer или её подпапках есть файлы, которые не надо включать в инсталлятор, то нужно использовать Excludes:
Код:

.........
[Files]
Source: E:\Install\Programe\Programa\MyProgramName\Installer\*; Excludes: FileName1.exe, FileName2.exe; DestDir: {app}; Flags: ignoreversion createallsubdirs recursesubdirs
........

т.е. перечисляем файлы через запятую, так же можно использовать переменные - *.txt

Да и используйте в своих сообщениях тег [ more][/more]

Хотя попробуете добавить ещё раз DelTree, т.е.
читать дальше »
Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  If CurUninstallStep = usDone then  // проверяем существование папки после удаления программы
  begin
          if DirExists(ExpandConstant('{userappdata}\MyProgramName')) = True then
                DelTree(ExpandConstant('{userappdata}\MyProgramName'), True, True, True);
          if DirExists('{app}') = True then begin
                  DelTree('{app}', True, True, True);
                  DelTree('{app}', True, True, True);
    end;
  end;
end;


AnalogXP 02-04-2009 21:58 1082468

Цитата:

Цитата Serega_
т.е. все файлы в одной строке. »

Спасибо, я об этом знаю, просто у меня там действительно еще много лишних файлов для дистрибутива.

Что посоветуете, делать с папкой? Так и не хочет удалится. Как найти причину!?

Serega 02-04-2009 22:03 1082478

AnalogXP, вы второй раз использовали DelTree?

AnalogXP 03-04-2009 00:21 1082614

Ну так в примере выше все указал. Вот как стараюсь удалить:

Код:

[_Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  If CurUninstallStep = usDone then  // проверяем существование папки после удаления программы
  begin
        if DirExists(ExpandConstant('{userappdata}\MyProgramName')) = True then 
                DelTree(ExpandConstant('{userappdata}\MyProgramName'), True, True, True); 
        if DirExists('{app}') = True then
                DelTree('{app}', True, True, True);
  end;
end;

Проверяю если есть папка в Application Data и удаляю.
Проверяю если есть папка программы и также пробую удалить.
А вообще, когда вызывается эта процедура?

Serega 03-04-2009 00:45 1082629

AnalogXP, я добавил в прошлое сообщение пример с кодом. Посмотрите внимательней... Там DelTree используется два раза. Попробуйте.

AnalogXP 03-04-2009 02:44 1082667

Цитата:

Цитата Serega_
AnalogXP, я добавил в прошлое сообщение пример с кодом. Посмотрите внимательней... Там DelTree используется два раза. Попробуйте. »

Хе-хе, прозевал :)
Работает спасибо!

Комсомолец 03-04-2009 16:34 1083194

Кто расскаже, что это такое? Я так понял-всплывающая справка по аналогии с msi-инсталляторами? Как ее прикрутить?

Serega 03-04-2009 17:34 1083251

Цитата:

Цитата Комсомолец
что это такое? »

Это раздел справки, который можно прикрутить к своему инсталлятору.
Цитата:

Цитата Комсомолец
Я так понял-всплывающая справка по аналогии с msi-инсталляторами? »

Нет... или слово всплывающая, я понимаю по другому... Одним словом, при запуске своего инсталлятора из командной строки с ключом /?, пример:
setup.exe /?
Появляется окно с разделом справки из Inno Setup, с параметрами командной строки поддерживаемой инсталлятором.
Цитата:

Цитата Комсомолец
Как ее прикрутить? »

Как оказалось проще простого, т.е. создаёте в обычном текстовом документе всё, что здесь написано и сохраняете под именем clihelp.iss. После этого, в своём скрипте записываете, пример:
читать дальше »

Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Files]
Source: clihelp.iss; Flags: dontcopy

[_Code]
const
        ComponentList = '';
        TaskList = '';
        ParameterList = '';
#include "clihelp.iss"

и всё... Попробуйте вызвать готовый инсталлятор с ключом /?

Комсомолец 03-04-2009 18:01 1083268

Serega_, и попробовал. что с /? что с /help начинается обычная установка((

Serega 03-04-2009 18:13 1083274

Вложений: 1
Комсомолец, прикрепил к сообщению: 2 скрипта и инсталлятор. Попробуйте... Всё сделано именно так, как я описал выше постом...

Комсомолец 03-04-2009 18:29 1083285

Serega_, спасибо, скачал. так какой ключ? /? - такой?

Serega 03-04-2009 18:40 1083296

Комсомолец, работают все ключи, с один результатом, а именно: /?, /h, /help - выводят окно справки...

P.S.
Если надо, могу выложить полный раздел справки по параметрам командной строки из последней версии Справки - на русском.
Просто, перевожу для себя...

Комсомолец 03-04-2009 19:03 1083319

Serega_, давай. в принципе есть, но от полной не откажусь. Ключи и правда работают))

Serega 03-04-2009 19:16 1083329

Перевод раздела 'Параметры командной строки инсталлятора' из справки к Inno Setup, версия 5.2.3.

Параметры командной строки инсталлятора

/SP-
Отключает в начале Установки диалог Эта программа установит... Вы желаете продолжить?. Конечно, это не будет иметь никакого эффекта, если DisableStartupPrompt секции [Setup] была установлена на yes.

/SILENT, /VERYSILENT
Установка в тихом или очень тихом режиме. При установке в тихом режиме мастер и фоновое окно мастера не отображаются, отображается только окно прогресса. При очень тихой установке окно прогресса тоже не отображается. Остальная установка проходит как обычно - отображаются сообщения об ошибках в ходе установки, страница приветствия (если ее отображение не отменено директивой DisableStartupPrompt или параметром '/SP-' командной строки, описанной выше).

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

/SUPPRESSMSGBOXES
Установка с подавлением сообщений. Имеет эффект при использовании совместно с '/SILENT' и '/VERYSILENT'.

Заданный по умолчанию ответ в сообщениях, где есть выбор:

- Да, в 'Сохранить новый файл?'.
- Нет, в 'Файл существует, перезаписать?'.
- Прервать, в Прервать/Повторить.
- Отмена, в Повторить/Отмена.
- Да (=продолжить), в DiskSpaceWarning/DirExists/DirDoesntExist/NoUninstallWarning/ExitSetupMessage/ConfirmUninstall.
- Да (=перезагрузить) в FinishedRestartMessage/UninstalledAndNeedsRestart.

5 видов сообщений, которые не поддерживаются:

- Сообщение 'О программе...'
- Сообщение 'Выйти из программы установки?'.
- Cообщение FileNotInDir2, когда во время Установки требуется вставить новый диск и он не был найден.
- Любое сообщение (ошибка), отображенное прежде, чем, инсталлятор (или деинсталлятор) прочитают параметры командной строки.
- Любое сообщение вызванное функцией MsgBox из секции [code].

/LOG
Указывает инсталлятору создать log-файл в папке TEMP для подробного отчета о действиях и событиях в секции [Run], предпринятых в ходе установки. Применяется при отслеживании ошибок. Например, если вы подозреваете, что файл не был перезаписан, хотя должен быть (или наоборот), то log-файл сообщит, что файл был действительно пропущен и почему.

log-файлу присваивается уникальное имя на базе текущей даты. (Существующие файлы не перезаписываются и не дополняются.)

Информация, содержащаяся в log-файле, техническая и поэтому не может быть понята пользователем.

/LOG="имя файла"
Параметр похож на /LOG, но в отличие от него позволяет указать фиксированный путь/имя файла для log-файла. Если файл с указанным именем уже существует, он будет перезаписан. Если файл не может быть создан, установка прервется и выдаст сообщение об ошибке.

/NOCANCEL
Не дает пользователю прервать установку, отключая кнопку 'Отмена' и игнорируя клики на кнопке 'Закрыть'. Используется в комбинации с '/SILENT' или '/VERYSILENT'.

/NORESTART
Указывает инсталлятору не перезагружать компьютер даже если это необходимо.

/RESTARTEXITCODE=код завершения
Задает инсталлятору код, который он должен возвратить, если необходима перезагрузка. Используется с '/NORESTART'.

/LOADINF="имя файла"
Указывает инсталлятору загрузить параметры установки из указанного файла после проверки командной строки. Этот файл может быть подготовлен с помощью команды '/SAVEINF=', см. ниже.

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

/SAVEINF="имя файла"
Указывает инсталлятору сохранять параметры установки в указанный файл.

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

/LANG=language
Задает используемый язык. language определяет имя языка заданного в параметре секции [Languages].

При использовании параметра /LANG, диалог Выбор языка установки будет подавлен.

/DIR="x:\dirname"
Меняет имя папки, заданное по умолчанию, на странице мастера Выбор папки установки. Должен быть указан полный путь.

/GROUP="имя папки"
Меняет имя папки, отображаемое на странице мастера Выбор папки в меню 'Пуск'. Если директива DisableProgramGroupPage секции [Setup] равна yes, этот параметр командной строки игнорируется.

/NOICONS
Указывает инсталлятору отметить выбор Не создавать значков на странице мастера Выбор папки в меню 'Пуск'.

/TYPE=type name
Меняет заданный по умолчанию тип установки.

Если указанный тип будет существовать и не будет 'Выборочным' (custom), то любой указанный параметр /COMPONENTS будет проигнорирован.

/COMPONENTS="имена компонентов разделяются запятыми"
Меняет выбранные по умолчанию компоненты. В этом случае параметр командной строки указывает инсталлятору менять тип установки на 'Выборочный'. Если 'Выборочный' тип не определён, то этот параметр игнорируется.

Только указанные компоненты будут выбраны, с остальных будет снят выбор.

Если перед именем компонента добавить символ "*", то все дочерние компоненты будут также выбраны (за исключением тех, которые имеют флаг dontinheritcheck). Если перед именем компонента добавить символ "!", то компонент не будет выбран.

Этот параметр не снимет выбор с компонентов, которые имеют флаг fixed.
Код:

Пример:
Снимаем выбор со всех компонентов, затем выбираем компоненты "help" и "plugins":
/COMPONENTS="help,plugins"

Код:

Пример:
Снимаем выбор со всех компонентов, затем выбираем родительский компонент "parent" и все его дочерние компоненты, за исключением одного "parent\child":
/COMPONENTS="*parent,!parent\child"

/TASKS="имена задач разделяются запятыми"
Определяет список задач которые должны быть выбраны.

Только указанные задачи будут выбраны, с остальных он будет снят. Используйте параметр /MERGETASKS, если Вы хотите сохранить заданный по умолчанию набор задач и только выбрать/снять некоторые из них.

Если перед именем задачи добавить символ "*" то все дочерние задачи будут также выбраны (за исключением тех, которые имеют флаг dontinheritcheck). Если перед именем задачи добавить символ "!", то задача не будет выбрана.
Код:

Пример:
Снимаем выбор со всех задач, затем выбираем задачи "desktopicon" и "fileassoc":
/TASKS="desktopicon,fileassoc"

Код:

Пример:
Снимаем выбор со всех задач, затем выбираем родительскую задачу "parent" и все ее до-черние задачи, за исключением одной "parent\child":
/TASKS="*parent,!parent\child"

/MERGETASKS="имена задач разделяются запятыми"
Параметр похож на /TASKS, но в отличие от него сохраняет заданный по умолчанию набор задач и лишь дополняет указанными задачами.

Если директива UsePreviousTasks равна yes, то указанные задачи будут выбраны/снят выбор, после того, как предыдущие задачи восстановлены.
Код:

Пример:
Сохраняем заданный по умолчанию набор выбранных задач и дополнительно выбираем задачи "desktopicon" и "fileassoc":
/MERGETASKS="desktopicon,fileassoc"

Код:

Пример:
Сохраняем заданный по умолчанию набор выбранных задач, но снимаем выбор с задачи "desktopicon":
/MERGETASKS="!desktopicon"

/PASSWORD=пароль
Задает пароль. Если не указана директива Password секции [Setup], этот параметр командной строки игнорируется.

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

Комсомолец 03-04-2009 19:34 1083344

Serega_, а это не то же самое, что и в справке инсталлятора? просто у меня тот учебник на русском.

Serega 03-04-2009 19:41 1083353

Комсомолец, :teeth: на первый взгляд, так только кажется... если посмотреть внимательней добавлены команды:
/SUPPRESSMSGBOXES, /TYPE, /TASKS, /MERGETASKS + добавлены описания в старые команды и скорректированы некоторые формулировки...

Комсомолец 03-04-2009 19:57 1083363

Serega_, отлично))

volk1234 06-04-2009 01:27 1085229

Serega_
Я пока не буду поднимать в шапку ссылку на ключи установщика, причину вы знаете.

2ALL
Скоро будет более подробный материал по Inno с ключами и прочим...

Serega_ благодарности ставятся за общеполезные сообщения, содержащие эксклюзивную информацию
или решение проблемы.
В данном случае благодарят если уже выложенна готовая статья или описание
сделанное человеком самостоятельно. В качестве благодарности за работу. Пока никакой работы не сделано.

Необоснованно сделанные благодарности администрация снимает :)

Относитесь к своим благодарностям рачительно - не жадничайте но и не разбрасывайтесь. :)

Devils0411 07-04-2009 14:28 1086779

Есть 3 файла. Скажем File1.bin, File2.bin, File3.bin. При установке (распаковке) файлы File1.bin и File2.bin, должны устанавливаться (копироваться) в заранее указанные пути (File1.bin в %userprofile%\Главное меню\Программы\Автозагрузка, File2.bin в %programfiles%). При установке (копировании) файла File3.bin, должно выскачить окошко, с просьбой указать путь. Вот собственно и все.
З.Ы. Третий файл мне нужно скинуть в ту же папку что и первый, только в "ограниченную учетку" (проблема в том, что на разных компах, по-разному называны учетки :(

Serega 07-04-2009 17:59 1087057

Devils0411,
читать дальше »

Цитата:

Цитата Devils0411
File1.bin в %userprofile%\Главное меню\Программы\Автозагрузка »

Обычно туда только ярлыки добавляют, но если всё же сам файл, то в секции [Files] пишите:
Код:

[Files]
Source: полный путь до файла\File1.bin; DestDir: {userstartup}; Flags: ignoreversion

Цитата:

Цитата Devils0411
File2.bin в %programfiles% »

Здесь тоже не совсем ясно, т.е. просто файл в каталог Program Files? Если да, то добавьте в туже секцию [Files]:
Код:

[Files]
Source: полный путь до файла\File2.bin; DestDir: {pf}; Flags: ignoreversion

Цитата:

Цитата Devils0411
При установке (копировании) файла File3.bin, должно выскачить окошко, с просьбой указать путь »

Конечно можно сделать чтоб при установке выскочил диалог с просьбой указать каталог. А есть вообще смысл изобретать велосипед, когда можно просто выбрать папку установки, на странице выбора директории?
Цитата:

Цитата Devils0411
Третий файл мне нужно скинуть в ту же папку что и первый, только в "ограниченную учетку" »

К сожалению я не знаю, что такое "ограниченная учетка"...
Итог - вот пример всего скрипта:
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\Учётка
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
Source: полный путь до файла\File1.bin; DestDir: {userstartup}; Flags: ignoreversion
Source: полный путь до файла\File2.bin; DestDir: {pf}; Flags: ignoreversion
Source: полный путь до файла\File3.bin; DestDir: {app}; Flags: ignoreversion


Devils0411 07-04-2009 18:15 1087068

Есть учетная запись администратора (C:\Documents and Settings\Administrator), а есть ограниченная учетная запись (C:\Documents and Settings\User). Дык вот путь может быть другой ("C:\Documents and Settings\Buxgalter", "C:\Documents and Settings\student")

Serega 07-04-2009 18:22 1087074

Devils0411, так для этого есть константа {username} - это и будет ваше имя - student или Buxgalter...

Т.е. для того, чтоб попасть в папку C:\Documents and Settings\пользователь, надо записать:
{sd}\Documents and Settings\{username}

Также туда можно попасть, если записать:
{userdesktop}\..\

Devils0411 07-04-2009 18:48 1087090

Serega_, Решился все-таки сделать так:
Код:

[Setup]
AppName=Switch
AppVerName=Switch v 1.0
DefaultDirName={pf}\Switch
OutputDir=C:\
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
Source: C:\File1.bin; DestDir: {app}; Flags: ignoreversion
Source: C:\File2.bin; DestDir: {app}; Flags: ignoreversion
Source: C:\File3.bin; DestDir: {app}; Flags: ignoreversion

[Icons]
Name: "{userstartup}\Enable"; Filename: "{app}\File1.bin"
Name: "{userstartup}\Disable"; Filename: "{app}\File2.bin"

{userstartup} - создает ярлык в C:\Documents and Settings\Admin\Главное меню\Программы\Автозагрузка
А какая константа отвечает за ограниченную учетную запись скажем student или buxgalter - {username}? Она сама будет подставлять нужное имя?
P.S. С ярлыками будет удобней. Сразу не догадался.

Serega 07-04-2009 19:12 1087114

Цитата:

Цитата Devils0411
{userstartup} - создает ярлык в C:\Documents and Settings\Admin\Главное меню\Программы\Автозагрузка »

Она создаст ярлык в C:\Documents and Settings\имя текущего пользователя\Главное меню\Программы\Автозагрузка, т.е. под каким именем запускаете...
Цитата:

Цитата Devils0411
А какая константа отвечает за ограниченную учетную запись скажем student или buxgalter - {username}? Она сама будет подставлять нужное имя? »

дело в том, что это тоже имя текущего пользователя... хм...

Devils0411 07-04-2009 19:39 1087134

Вот в этом то и загвоздка. Да и еще. Что нужно прописать, чтоб не выдавало указать имя папки в меню "все программы"?

Serega 07-04-2009 19:55 1087151

Цитата:

Цитата Devils0411
Что нужно прописать, чтоб не выдавало указать имя папки в меню "все программы"? »

Вы имеете ввиду отключить страницу с выбором папки в меню "Пуск"? Добавьте в секцию [Setup] DisableProgramGroupPage=yes
Я так понял учётная запись Admin у вас одна на всех компьтерах? Если да, тогда запускаете инсталляцию из под учётной записи другого пользователя, а в скрипте записываете так:
[Icons]
Name: {sd}\Documents and Settings\Admin\Главное меню\Программы\Автозагрузка\Enable; Filename: {app}\File1.bin; WorkingDir: {app}
Name: {sd}\Documents and Settings\Admin\Главное меню\Программы\Автозагрузка\Disable; Filename: {app}\File2.bin; WorkingDir: {app}
Name: {userstartup}\Disable; Filename: {app}\File3.bin; WorkingDir: {app}
т.е. ярлык для файла File3.bin, будет создан для текущего пользователя, ярлыки для File1.bin и File2.bin - для пользователя Admin.

Serega 08-04-2009 20:29 1088238

Converter v.0.1.2

Описание

Converter - конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).

Использование

Пользоваться очень просто:
Нажимаете кнопку "Выбрать файл", в диалоге выбираете reg-файл и после завершения работы программы, рядом с reg-файлом, будет создан файл с таким же именем, но иметь расширение *.iss

Что нового
  • Версия 0.1.2
    • Корректно читаются и конвертируются из HEX данных в читаемый вид, значения ключей REG_EXPAND_SZ (expandsz) и REG_MULTI_SZ (multisz);
    • Добавлена поддержка удаления веток и параметров (записи вида [-ветка] и "параметр"=-);
    • Добавлена возможность интеграции в контекстное меню;
    • Добавлена функция drag&drop, т.е. reg-файл можно перетащить мышкой на форму и программа конвертирует его;
    • Добавлена возможность закрыть программу, после конвертирования;
    • Добавлена возможность использования флагов и констант;
    • Добавлена возможность открыть файл, после конвертирования;
    • Все неподдерживаемые в Inno Setup ключи реестра, теперь прописываются в секции кода;
    • Оптимизирован код программы и изменено оформление;
  • Версия 0.1.1
    • Исправлена ошибка с преобразованием: HKEY_LOCAL_MACHINE -> HKLM;
    • Исправлена ошибка, связанная с пустыми данными в reg-файле;
    • Убрал ограничение на размер входного reg-файла;
    • Исправлены мелкие недочёты и ошибки;


P.S.
Если вы заметили, что программа работает не корректно или с ошибками, пожалуйста напишите мне об этом.

boss911 08-04-2009 20:42 1088249

Цитата:

Цитата Serega_
Сделал небольшую программу Converter - конвертирует reg-файлы в формат *.iss »

Штука полезная, конечно. Но ведь зачем, когда есть ISTool для Inno, там это делается так же просто, где сразу можно прикрутить необходимые флаги, задачи и т.п., как для одной строки, так и для всех сразу.

Serega 08-04-2009 20:51 1088256

boss911, но это же ISTool, который нужно устанавливать, а здесь всего 500 кило и установка не нужна. Конвертирование из reg-файлов, это только начало, планирую немного расширить её функциональность в будущем.

katok888 08-04-2009 21:01 1088267

boss911, ISTool иногда коверкает рег файлы

katok888 08-04-2009 21:18 1088283

Serega_, ошибка при открытии файла:
Access violation at address 00460202 in module 'Converter.exe'. Read of address FFFFFFFF.

Serega 08-04-2009 21:26 1088284

katok888, а размер файла какой? Обычно, это происходит при открытии большого файла, я для этого и поставил ограничение...

P.S.
Покажите сам reg-файл.

katok888 08-04-2009 21:58 1088307

Serega_,
Код:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.mp3]
"PerceivedType"="audio"
"Content Type"="audio/mpeg"
@="AIMP.MP3"
"MP2.Last"="Custom"

[HKEY_CLASSES_ROOT\.mp3\OpenWithList]

[HKEY_CLASSES_ROOT\.mp3\OpenWithList\wmplayer.exe]

[HKEY_CLASSES_ROOT\.mp3\OpenWithProgIds]
"mp3file"=hex(0):

[HKEY_CLASSES_ROOT\.mp3\PersistentHandler]
@="{098f2470-bae0-11cd-b579-08002b30bfeb}"


Serega 08-04-2009 22:19 1088327

katok888, исправил и перезалил, попробуйте.

boss911 08-04-2009 23:08 1088382

Цитата:

Цитата Serega_
но это же ISTool, который нужно устанавливать »

Какой там устанавливать, оно работает как portable, тем более распаковать из оф. установщика труда не заставит, всего 1,7 Mb. Не убедил меня, если что. :)

Цитата:

Цитата katok888
ISTool иногда коверкает рег файлы »

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

volk1234 09-04-2009 03:01 1088505

Serega_
добавил в шапку. Правьте пост #581 при появлении новых версий и доработке описания...

Serega 09-04-2009 11:01 1088689

Converter v.0.1.1 - исправил обнаруженные ошибки. Ссылка в шапке темы.

-Marshall- 10-04-2009 22:45 1090495

Скажите пожалуйста, а возможно ли реализовать такое, как у NSIS только в Inno Setup вот так:


Если да, то пожалуйста напишите как...

Я имею ввиду выбор компонентов :)

Serega 10-04-2009 23:50 1090539

-Marshall-, для отображения компонентов в виде дерева, вам понадобится установленные QuickStart Pack и InnoCompiler от Restools. Все ссылки есть в шапке. Вот пример скрипта:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
ComponentsListTVStyle=true

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: a\a; Description: Руководство пользователя; Types: full
Name: a\a\a; Description: Русский; Flags: exclusive
Name: a\a\b; Description: English; Flags: exclusive
Name: a\b; Description: Справка; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\Readme-ru.txt; DestDir: {app}; Components: a\a\a
Source: compiler:Examples\Readme-en.txt; DestDir: {app}; Components: a\a\b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a\b


-Marshall- 11-04-2009 14:38 1090898

Спасибо, с этим я разобрался :)
Можете еще помочь вот в чем: я делаю трансформ-пак в основном под себя, но! я не знаю как зарезервировать файлы... Пробовал "Полноценное резервирование файлов с копированием в отдельную папку", но он почему-то не хочет копировать...
Вот мой SHFileOperation.iss на примере shell32.dll:
читать дальше »

Код:

function BackupDir(const fromDir, toDir: string; IsMove: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: string;
  SR: TFindRec;
  res: Boolean;
begin
    ForceDirectories(toDir);
  if IsMove then
    fos.wFunc  := FO_MOVE else
    fos.wFunc  := FO_COPY;
    fos.fFlags := FOF_FILESONLY or FOF_SILENT or
              FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
    _fromDir:= AddBackslash(fromDir);
    _toDir  := AddBackslash(toDir);
  if (Length(fromDir) = Length(_fromDir)) then
    begin
        res:= FindFirst(_fromDir + '*', SR);
      try
        while res do
        begin
          if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
          begin
            if SR.Attributes = FILE_ATTRIBUTE_DIRECTORY then
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir + #0#0;
                fos.pFrom  := PChar(_fromDir);
                fos.pTo    := PChar(_toDir);
              end else
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir  + SR.Name + #0#0;
                fos.pFrom  := PChar(_fromDir);
                fos.pTo    := PChar(_toDir);
              end;
                Result := (0 = ShFileOperation(fos));
                _fromDir:= ExtractFilePath(_fromDir);
                _toDir:= ExtractFilePath(_toDir);
          end;
          res := FindNext(SR);
        end;
      finally
        FindClose(SR);
      end;
    end else
    begin
      _fromDir:= RemoveBackslashUnlessRoot(_fromDir) + #0#0;
      _toDir  := RemoveBackslashUnlessRoot(_toDir)  + #0#0;
      fos.pFrom  := PChar(_fromDir);
      fos.pTo    := PChar(_toDir);
      Result := (0 = ShFileOperation(fos));
    end;
end;

{****************************************************************}
function MoveDir(const fromDir, toDir: string): Boolean;
begin
  Result := BackupDir(fromDir, toDir, True);
end;

{****************************************************************}
function CopyDir(const fromDir, toDir: string): Boolean;
begin
CopyDir('{sys}\shell32.dll', '{win}\Windows Se7en Theme\Backup');
  Result := BackupDir(fromDir, toDir, False);
end;

{****************************************************************}
function DelDir(dir: string; toRecycle: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _dir: string;
begin
    _dir:= RemoveBackslashUnlessRoot(dir) + #0#0;
    fos.wFunc  := FO_DELETE;
    fos.fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
  if toRecycle then
    fos.fFlags := fos.fFlags or FOF_ALLOWUNDO;
    fos.pFrom  := PChar(_dir);
  Result := (0 = ShFileOperation(fos));
end;

{****************************************************************}
function RenameDir(const fromDir, toDir: string): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: string;
begin
    _fromDir:= RemoveBackslashUnlessRoot(fromDir) + #0#0;
    _toDir  := RemoveBackslashUnlessRoot(toDir) + #0#0;
    fos.wFunc  := FO_RENAME;
    fos.fFlags := FOF_FILESONLY or FOF_ALLOWUNDO or
              FOF_SILENT or FOF_NOCONFIRMATION;
    fos.pFrom  := PChar(_fromDir);
    fos.pTo    := PChar(_toDir);
  Result := (0 = ShFileOperation(fos));
end;


:help: Пробовал через константы "Windows"a...не помогло, пробовал ставить в строчке "Result := BackupDir(fromDir, toDir, False);" True вместо False. Что не так?
И если есть другие способы, то пожалуйста, скажите.......

Serega 11-04-2009 16:40 1091002

-Marshall-, вот пример SHFileOperation.iss, который у меня в архиве.
SHFileOperation.iss
Код:

;***************************************************************;
;****************** SHFileOperation.iss ************************;
;***************************************************************;
;* Include this file in project. Example:
;* #include "SHFileOperation.iss"
;***************************************************************;
;************************ 1 ************************************;
;* function CopyDir(const fromDir, toDir: string): Boolean;
;* Example 1 (without <fromDir> trailing backslash):
;*    CopyDir('C:\TMP\MyApp', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\MyApp\..all <MyApp> subdirs and files
;* Example 2 (with <fromDir> trailing backslash):
;*    CopyDir('C:\TMP\MyApp\', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\..all <MyApp> subdirs and files
;***************************************************************;
;************************ 2 ************************************;
;* function MoveDir(const fromDir, toDir: string): Boolean;
;* Example 1 (without <fromDir> trailing backslash):
;*    MoveDir('C:\TMP\MyApp', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\MyApp\..all <MyApp> subdirs and files
;* Example 2 (with <fromDir> trailing backslash):
;*    MoveDir('C:\TMP\MyApp\', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\..all <MyApp> subdirs and files
;***************************************************************;
;************************ 3 ************************************;
;* function DelDir(dir: string; toRecycle: Boolean): Boolean;
;*  If <toRecycle> is True, <dir> deleted in Recycle Bin.
;***************************************************************;
;************************ 4 ************************************;
;* function RenameDir(const fromDir, toDir: string): Boolean;
;***************************************************************;
;***************************************************************;
;***************************************************************;

[_Code]
type
  TSHFileOpStruct =  record
    Wnd: HWND;
    wFunc: UINT;
    pFrom: PChar;
    pTo: PChar;
    fFlags: Word; // FILEOP_FLAGS;
    fAnyOperationsAborted: BOOL;
    hNameMappings: HWND; // Pointer;
    lpszProgressTitle: PChar; { only used if FOF_SIMPLEPROGRESS }
  end;

const
// use in wFunc
  { $EXTERNALSYM FO_MOVE }
  FO_MOVE          = $0001;
  { $EXTERNALSYM FO_COPY }
  FO_COPY          = $0002;
  { $EXTERNALSYM FO_DELETE }
  FO_DELETE        = $0003;
  { $EXTERNALSYM FO_RENAME }
  FO_RENAME        = $0004;
// use in fFlags
  { $EXTERNALSYM FOF_MULTIDESTFILES }
  FOF_MULTIDESTFILES        = $0001;
  { $EXTERNALSYM FOF_CONFIRMMOUSE }
  FOF_CONFIRMMOUSE          = $0002;
  { $EXTERNALSYM FOF_SILENT }
  FOF_SILENT                = $0004;  { don't create progress/report }
  { $EXTERNALSYM FOF_RENAMEONCOLLISION }
  FOF_RENAMEONCOLLISION      = $0008;
  { $EXTERNALSYM FOF_NOCONFIRMATION }
  FOF_NOCONFIRMATION        = $0010;  { Don't prompt the user. }
  { $EXTERNALSYM FOF_WANTMAPPINGHANDLE }
  FOF_WANTMAPPINGHANDLE      = $0020;  { Fill in
SHFILEOPSTRUCT.hNameMappings
                                          Must be freed using
SHFreeNameMappings }
  { $EXTERNALSYM FOF_ALLOWUNDO }
  FOF_ALLOWUNDO              = $0040;
  { $EXTERNALSYM FOF_FILESONLY }
  FOF_FILESONLY              = $0080;  { on *.*, do only files }
  { $EXTERNALSYM FOF_SIMPLEPROGRESS }
  FOF_SIMPLEPROGRESS        = $0100;  { means don't show names of files }
  { $EXTERNALSYM FOF_NOCONFIRMMKDIR }
  FOF_NOCONFIRMMKDIR        = $0200;  { don't confirm making any
needed dirs }
  { $EXTERNALSYM FOF_NOERRORUI }
  FOF_NOERRORUI              = $0400;  { don't put up error UI }


function SHFileOperation(const lpFileOp: TSHFileOpStruct):Integer;
external 'SHFileOperation@shell32.dll stdcall';

{****************************************************************}
{****************************************************************}
{****************************************************************}

function BackupDir(const fromDir, toDir: string; IsMove: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: string;
  SR: TFindRec;
  res: Boolean;
begin
    ForceDirectories(toDir);
  if IsMove then
    fos.wFunc  := FO_MOVE else
    fos.wFunc  := FO_COPY;
    fos.fFlags := FOF_FILESONLY or FOF_SILENT or
              FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
    _fromDir:= AddBackslash(fromDir);
    _toDir  := AddBackslash(toDir);
  if (Length(fromDir) = Length(_fromDir)) then
    begin
        res:= FindFirst(_fromDir + '*', SR);
      try
        while res do
        begin
          if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
          begin
            if SR.Attributes = FILE_ATTRIBUTE_DIRECTORY then
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir + #0#0;
                fos.pFrom  := PChar(_fromDir);
                fos.pTo    := PChar(_toDir);
              end else
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir  + SR.Name + #0#0;
                fos.pFrom  := PChar(_fromDir);
                fos.pTo    := PChar(_toDir);
              end;
                Result := (0 = ShFileOperation(fos));
                _fromDir:= ExtractFilePath(_fromDir);
                _toDir:= ExtractFilePath(_toDir);
          end;
          res := FindNext(SR);
        end;
      finally
        FindClose(SR);
      end;
    end else
    begin
      _fromDir:= RemoveBackslashUnlessRoot(_fromDir) + #0#0;
      _toDir  := RemoveBackslashUnlessRoot(_toDir)  + #0#0;
      fos.pFrom  := PChar(_fromDir);
      fos.pTo    := PChar(_toDir);
      Result := (0 = ShFileOperation(fos));
    end;
end;

{****************************************************************}
function MoveDir(const fromDir, toDir: string): Boolean;
begin
  Result := BackupDir(fromDir, toDir, True);
end;

{****************************************************************}
function CopyDir(const fromDir, toDir: string): Boolean;
begin
  Result := BackupDir(fromDir, toDir, False);
end;

{****************************************************************}
function DelDir(dir: string; toRecycle: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _dir: string;
begin
    _dir:= RemoveBackslashUnlessRoot(dir) + #0#0;
    fos.wFunc  := FO_DELETE;
    fos.fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
  if toRecycle then
    fos.fFlags := fos.fFlags or FOF_ALLOWUNDO;
    fos.pFrom  := PChar(_dir);
  Result := (0 = ShFileOperation(fos));
end;

{****************************************************************}
function RenameDir(const fromDir, toDir: string): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: string;
begin
    _fromDir:= RemoveBackslashUnlessRoot(fromDir) + #0#0;
    _toDir  := RemoveBackslashUnlessRoot(toDir) + #0#0;
    fos.wFunc  := FO_RENAME;
    fos.fFlags := FOF_FILESONLY or FOF_ALLOWUNDO or
              FOF_SILENT or FOF_NOCONFIRMATION;
    fos.pFrom  := PChar(_fromDir);
    fos.pTo    := PChar(_toDir);
  Result := (0 = ShFileOperation(fos));
end;

{****************************************************************}
function FilesMaskOperation(const fromDir, toDir, fileMask: string; FileOp: Integer; EmptyDirRemove: Boolean; toRecycle: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: string;
  FSR, DSR: TFindRec;
  FindResult: Boolean;
  APath: string;
begin
  APath := AddBackslash(fromDir);
  FindResult := FindFirst(APath + fileMask, FSR);
  try
    while FindResult do
    begin
      if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
        begin
          Case FileOp of
            FO_COPY:
              begin
                fos.wFunc  := FO_COPY;
              end;
            FO_MOVE:
              begin
                fos.wFunc  := FO_MOVE;
              end;
            FO_DELETE:
              begin
                fos.wFunc  := FO_DELETE;
                if toRecycle then fos.fFlags := fos.fFlags or FOF_ALLOWUNDO;
              end;
            FO_RENAME:
              begin
                fos.wFunc  := FO_RENAME;
              end;
          else
            ;
          end;
            fos.fFlags := fos.fFlags or FOF_FILESONLY or FOF_SILENT or
                  FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
            _fromDir:= APath + FSR.Name + #0#0;
            _toDir:= AddBackslash(toDir) + FSR.Name + #0#0;
            ForceDirectories(ExtractFilePath(_toDir));
            fos.pFrom  := PChar(_fromDir);
            fos.pTo    := PChar(_toDir);
            Result := (0 = ShFileOperation(fos));
        end;
      FindResult := FindNext(FSR);
    end;
    FindResult := FindFirst(APath + '*.*', DSR);
    while FindResult do
    begin
      if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
        not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} FilesMaskOperation(APath + DSR.Name, AddBackslash(toDir) + DSR.Name, fileMask, FileOp, EmptyDirRemove, toRecycle);
      FindResult := FindNext(DSR);
    end;
  finally
    FindClose(FSR);
    FindClose(DSR);
    if EmptyDirRemove then RemoveDir(APath);
  end;
end;

function CopyFiles(const fromDir, toDir, fileMask: string): Boolean;
begin
  Result := FilesMaskOperation(fromDir, toDir, fileMask,
        FO_COPY, False, False);
end;

function MoveFiles(const fromDir, toDir, fileMask: string): Boolean;
begin
  Result := FilesMaskOperation(fromDir, toDir, fileMask,
        FO_MOVE, True, False);
end;

function DelFiles(const fromDir, fileMask: string; toRecycle: Boolean ): Boolean;
begin
  Result := FilesMaskOperation(fromDir, '', fileMask,
        FO_DELETE, True, toRecycle);
end;
{****************************************************************}
{****************************************************************}


пример использования
Код:

;Как исправить небольшую ошибку в работе востановления файлов и папок при удалении, т.е. есть скрипт для этого но он
;не корректо работает с востановлением папок а именно получаеться так что деинсталлятор не может перезаписать папку, а просто
;создает в ней же свою копию (должно быть так имя_папки1\, а получаеться так имя_папки1\имя_папки1\), а вот с обычными
;файлами без папок все хорошо.

#include "SHFileOperation.iss"

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UpdateUninstallLogAppName=False

[Tasks]
Name: src; Description: Создать резервную копию файлов?

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; BeforeInstall: CreateBackup; Flags: ignoreversion

[_Code]
function MoveFile(const srcFile, destFile: PChar): Integer; external 'MoveFileA@kernel32.dll stdcall';

procedure CreateBackup;
var
  srcFile, destFile: string;
  basePath, shortPath: string;
begin
  if IsTaskSelected('src') then
  begin
    basePath := ExpandConstant('{app}');
    srcFile := ExpandConstant(CurrentFileName);
    shortPath := srcFile;
    StringChangeEx(shortPath, basePath, '', True);
    destFile := ExpandConstant('{app}\Backup') + shortPath;
    ForceDirectories(ExtractFilePath(destFile));
    MoveFile(PChar(srcFile), PChar(destFile));
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
 if CurUninstallStep = usPostUninstall then
  begin
    MoveDir(ExpandConstant('{app}\Backup\'), ExpandConstant('{app}'));
    RemoveDir(ExpandConstant('{app}\Backup\'));
  end;
end;


-Marshall- 11-04-2009 18:50 1091120

Код:

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; BeforeInstall: CreateBackup;

Я так понял он резервирует MyProg.exe? Или что? :search:
Если я неправильно изъяснился, то я поправлю себя: как сделать, чтоб Inno Setup скопировал нужные файлы в нужную директорию, независимо, где располагаются эти файлы. Например мне нужно, чтоб перед выполнением сценариев секции [Run], инсталлятор скопировал файл shell32.dll из {sys} в {app}\Backup

Serega 11-04-2009 21:52 1091280

Цитата:

Цитата -Marshall-
инсталлятор скопировал файл shell32.dll из {sys} в {app}\Backup »

читать дальше »

Source: {sys}\shell32.dll; DestDir: {app}\Backup; Flags: external skipifsourcedoesntexist

-Marshall- 11-04-2009 22:02 1091291

ааааа, по-ходу то, спс :)

МИШАНЧИК 12-04-2009 06:39 1091512

Подскажите пожалуйста!
Имеется ли возможность как-то сделать(в скрипте прописать) чтобы при деинсталяции скомпилированной мной программы деинсталятор сначала закрывал .exe процесс деинсталируемой программы?

Serega 12-04-2009 08:33 1091525

МИШАНЧИК, вот ссылка на пост, там как раз приведён пример и прикреплена необходимая .dll’ка.

volk1234 12-04-2009 12:42 1091706

Цитата:

Цитата Serega_
Большая просьба, если вы заметили, что программа работает не правильно, пожалуйста напишите об этом. »

На мой взгляд в таком случае в названии вашего конвертера должна присуствовать надпись beta - дабы пользователи были предупреждены...

МИШАНЧИК 12-04-2009 12:55 1091718

Serega_, а куда эту .dll’ку засунуть? В папку Инно, или в инсталятор?
Я так понял чтоб завершить процесс.exe при деинсталяции нужно в:
[UninstallRun]
Filename: {app}\процесс.exe; Flags: waituntilterminated
Правильно?

И ещё, скачал по ссылке Inno Setup 5.2.3 RU. Он при установке предлагает выбрать русский язык, а сама Инно всё равно после установки на английском. Где я неправ?

Serega 12-04-2009 13:16 1091743

Вложений: 1
Цитата:

Цитата volk1234
должна присуствовать надпись beta - дабы пользователи были предупреждены... »

Спасибо, сразу не сообразил... Исправил.

МИШАНЧИК
Цитата:

Цитата МИШАНЧИК
куда эту .dll’ку засунуть? В папку Инно, или в инсталятор? »

а туда, куда вам больше нравиться... :wink: извините, за неуместный юмор...
У меня допустим все необходимые .dll'ки живут в C:\Program Files\Inno Setup 5\Libraries\*
Цитата:

Цитата из скрипта
[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion

т.е. нужно указывать полный путь - Source: полный путь до файла\ISTask.dll (при моём варианте расположения можно сократить до - compiler:Libraries\ISTask.dll, где compiler это каталог Inno setup), а DestDir: {app} - означает, что она будет скопирована в папку с приложением.
Цитата:

Цитата МИШАНЧИК
Я так понял чтоб завершить процесс.exe при деинсталяции нужно в »

Нет. Там полный пример, т.е. попробуйте скомпилировать сразу из того скрипта, предварительно указав путь до ISTask.dll или расположив её рядом со скриптом. Произведите установку и после запуска MyProg.exe попробуйте удалить программу. Появится сообщение с предложением закрыть программу. Одним словом попробуйте и сразу многое станет понятно.

Цитата:

Цитата МИШАНЧИК
а сама Инно всё равно после установки на английском »

точно не помню, так как сам пользуюсь расширенной версией от Restools, а она на английском...
Всё вспомнил, там должен идти отдельно файл Compil32.exe и именно он русифицирован.
Если его нет, то вот нашёл в старой версии, прикрепил.

МИШАНЧИК 12-04-2009 13:29 1091753

Serega_, а по поводу:
Цитата:

Цитата Serega_
Появится сообщение с предложением закрыть программу. »

А можно как-то чтоб без вывода окна для пользоавтеля? Чтоб деинсталятор сам принудительно закрывал программу(завершал процесс)?

Serega 12-04-2009 13:58 1091787

Цитата:

Цитата МИШАНЧИК
А можно как-то чтоб без вывода окна для пользоавтеля? »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Run]
Filename: {app}\MyProg.exe; Description: Запустить программу MyProg?; Flags: postinstall nowait skipifsilent

; ниже поправьте название секции
[_Code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
  external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function KillTask(ExeFileName: string): Integer;
  external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  if RunTask('MyProg.exe', false) then begin
    KillTask('MyProg.exe');
    UnloadDll(ExpandConstant('{app}\ISTask.dll'));
  end;
end;



P.S.
В прошлом сообщении я прикрепил Compil32 от 5.2.2, извините сразу не глянул... перезалил, теперь там 5.2.3

МИШАНЧИК 12-04-2009 15:04 1091843

Serega_, большое Вам спасибо!
Только я очень, очень начинающий и поэтому мне не очень ясно.
Допустим мне нужно при деинсталяции завершить 2 процесса:
1.Program1.exe
2.Program2.exe
скрипт будет выглядеть так:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion
Source: compiler:Examples\Program1.exe; DestDir: {app}; Flags: ignoreversion
Source: compiler:Examples\Program2.exe; DestDir: {app}; Flags: ignoreversion

[Run]
Filename: {app}\Program1.exe; Description: Запустить программу Program1?; Flags: postinstall nowait skipifsilent

; ниже поправьте название секции(ЭТО Я НЕ ПОНЯЛ в какую секцию вставлять и нужно ли указывать - [code])
[code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
if RunTask('Program1.exe', 'Program2.exe', false) then begin
KillTask('Program1.exe', 'Program2.exe');
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
end;
end;
[code]

Serega 12-04-2009 15:37 1091869

Вложений: 1
МИШАНЧИК, чтоб было более понятно, решил прикрепить скрипт, просто на форуме воспринимается секция [code], как одноимённый тег...

P.S.
Скачайте справку на русском, ссылка в шапке, очень полезная вещь... :wink:

-Marshall- 12-04-2009 19:45 1092068

У меня еще один вопрос, по поводу секции Components. Сделал все по примеру и получилось, только меня не радует одно, что все оно идет в столбик, а я хотел бы, чтоб его можно было открывать и закрывать так, как на том же самом скрине Seven Remix

Serega 12-04-2009 20:07 1092084

-Marshall-, я же вам писал пример, который отображает список компонентов в виде дерева. Посмотрите внимательно пост, вы всё сделали как написано в скрипте? За отображение в виде дерева отвечает команда ComponentsListTVStyle=true. При этом имена компонентов должы иметь знак '\', пример:
a
a\a
a\a\a
a\a\a\a

-Marshall- 12-04-2009 22:32 1092197

Спасибо, я просто не обратил внимание на секцию [Setup] :meeting:

tem000 14-04-2009 14:20 1093747

Serega_, Подскажи пожалуйста, как можно сделать чтобы при выборе компонентов, какой то один пункт был отмечен и его нельзя было оключить (т.е чекбокс был бы не активным). И еще как сделать чтобы по умолчанию дерево компонентов было раскрыто или закрыто. Заранее спасибо...
читать дальше »
"примерно так"

Serega 14-04-2009 15:50 1093818

Цитата:

Цитата tem000
при выборе компонентов, какой то один пункт был отмечен и его нельзя было оключить »

используйте флаг fixed
Цитата:

Цитата tem000
как сделать чтобы по умолчанию дерево компонентов было раскрыто или закрыто »

по умолчанию список компонентов всегда развёрнут, а если необходимо чтоб он был свёрнут, надо использовать флаг collapsed.

Вопрос по скриншоту:
Снизу окна компонентов выводится их описание, а что выводится справа?

tem000 14-04-2009 16:32 1093847

Цитата:

Цитата Serega_
Снизу окна компонентов выводится их описание, а что выводится справа? »

Там отображаются маленькие превью, при выборе допустим какого нибудь скина отображается его маленькая картинка, или можно посмотреть какие иконки ставить и т.д. Прога называется AIMP2 MegaPack 2.51 Build 330.7 (сборка не моя скачал из инета) инсталятор сделан в Inno Setup, там в него много чего напихано распаковывается легко, скрипт очень большой единственное там по ходу в секции CODE много чего прописано на сколько я понял в том числе эта фишка с картинками.
читать дальше »
"читать дальше"


P.S Serega_, спасибо за быстрый ответ :teeth:

Serega 14-04-2009 17:02 1093874

Цитата:

Цитата tem000
единственное там по ходу в секции CODE много чего прописано на сколько я понял в том числе эта фишка с картинками »

на этой странице практически всё (90%) прописывается в секции Code.

Drongo 14-04-2009 20:14 1094050

Ребятки, вот нужно сделать такой инсталлятор, я сделаю, не вопрос, но есть один нюанс, нужно, чтобы у него было, во время установки, на выбор:
1. Или во время установки, в окне 800х600 (или любой другой оптимальный размер. На весь экран, крайний случай.) менялись картинки, как у игр, когда устанавливаешь игры, показываются некоторые фрагменты игровых моментов.
2. Или если первый вариант невозможен, то чтобы в окне самого инсталятора (можно размер самого окна инсталятора увеличить?), как в комментарии 463, и вот рядом нашёл в комменте 466 менялись картинки скриншотов, не одна была фиксировано, а менялись, скажем, после каждых пяти процентов установленной игры? Или как должно быть правильно? (Мне второй вариант понравился больше, можно как-то его прикрутить?)

P.S. Я никогда не делал такие инсталы, поэтому если не сложно, поясните на пальцах, куда скриншоты класть, и где что прописывать для отображения?

Drongo 14-04-2009 20:37 1094071

Решил поэкспериментировать со вторым вариантом, но тут пишет ошибку Undeclared identifier TIME_FOR_VIEW



Участок кода

Код:

...
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;
...


Или весь код
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "My Program"
#define MyAppVerName "My Program 1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "StyleBuilder.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{337AE44F-3DF6-4C55-AFCA-AAA9A6436F0E}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=E:\
OutputBaseFilename=setup
Compression=no
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
;Source: "D:\Контроль\TGTSoft\StyleBuilder\StyleBuilder.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Programms\Я_Автоустановка\BartPE\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Сode]
////////////////////////////////////////////////////
{Установка слайдшоу на окне инсталятора}
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  URLLabel: TNewStaticText;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;
///////////////////////////////////////////////////
const
  BASS_SAMPLE_LOOP        = 4;  //повторение

type
  HSTREAM = DWORD;      //тип звукового потока

function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';

function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function  BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

function  BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';
///////////////////////////////
var
  state, soft: boolean;
  Image1, Image2: TBitmapImage;
const
  NeedSize = 6;
  DRIVE_UNKNOWN = 0;
  DRIVE_NO_ROOT_DIR = 1;
  DRIVE_REMOVEABLE = 2;
  DRIVE_FIXED = 3;
  DRIVE_REMOTE = 4;
  DRIVE_CDROM = 5;
  DRIVE_RAMDISK = 6;

var
  ListBox: TListBox;

function GetLogicalDrives: DWORD;
  external 'GetLogicalDrives@kernel32.dll stdcall';

function GetDriveType(nDrive: string): Longint;
  external 'GetDriveTypeA@kernel32.dll stdcall';

function GetVideoCardName(): PChar;
  external 'hwc_GetVideoCardName@files:get_hw_caps.dll stdcall';

function GetSoundCardName(): PChar;
  external 'hwc_GetSoundCardName@files:get_hw_caps.dll stdcall';

function DetectHardware(): Integer;
  external 'hwc_DetectHardware@files:get_hw_caps.dll stdcall';

function GetHardDriveFreeSpace(hdd: integer): Integer;
  external 'hwc_GetHardDriveFreeSpace@files:get_hw_caps.dll stdcall';

function GetHardDriveName(hdd: integer): PChar;
  external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall';

function GetHardDriveTotalSpace(hdd: integer): Integer;
  external 'hwc_GetHardDriveTotalSpace@files:get_hw_caps.dll stdcall';

function GetHardDrivesCount(): Integer;
  external 'hwc_GetHardDrivesCount@files:get_hw_caps.dll stdcall';

function GetSoundCards(): Integer;
  external 'hwc_GetSoundCards@files:get_hw_caps.dll stdcall';

function GetSystemPage(): Integer;
  external 'hwc_GetSystemPage@files:get_hw_caps.dll stdcall';

function GetSystemPhys(): Integer;
  external 'hwc_GetSystemPhys@files:get_hw_caps.dll stdcall';

function GetVidMemLocal(): Integer;
  external 'hwc_GetVidMemLocal@files:get_hw_caps.dll stdcall';

function GetVidMemNonLocal(): Integer;
  external 'hwc_GetVidMemNonLocal@files:get_hw_caps.dll stdcall';

function GetVideoCardDev(): Integer;
  external 'hwc_GetVideoCardDev@files:get_hw_caps.dll stdcall';

function GetVideoCardVen(): Integer;
  external 'hwc_GetVideoCardVen@files:get_hw_caps.dll stdcall';

function DelSp(const s: string): string; // функция удаления пробелов в начале строки
var
  c, i: integer;
  stt, st, st1: string;
begin
  c := 0;
  st := s;

  for i := 1 to Length(st) do
  begin

    stt := copy(st, i, 1);
    if (stt = ' ') and (c >= 1) then
    begin
      st1 := st1;
      c := c + 1;
    end
    else if (stt = ' ') and (c = 0) then
    begin
      c := c + 1;
      st1 := st1 + stt;
    end
    else if (stt <> ' ') then
    begin
      c := 0;
      st1 := st1 + stt;
    end
  end;

  Result := st1;
end;

procedure URLLabelOnClick(Sender: TObject);
var
  ErrorCode: Integer;
begin
  ShellExec('open', 'http://game-torrent.info', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;

procedure ListBoxOnClick(Sender: TObject);
var
  NewLetter, OldString: string;
  i: Integer;
begin
  for i := 0 to ListBox.Items.Count - 1 do
  begin
    if ListBox.Selected[i] then
    begin
      NewLetter := Copy(ListBox.Items[i], 0, 1);
      OldString := Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text));
      WizardForm.DirEdit.Text := NewLetter + OldString;
    end;
  end;
end;


procedure InitializeWizard();
var
  Name1: string;
  i: Integer;
  Text: TNewStaticText;
  Path: string;
  FreeMB, TotalMB: Cardinal;
  drives: DWORD;

begin
  ExtractTemporaryFile('BASS.dll');
    ExtractTemporaryFile('my.mp3');
  if BASS_Init(-1, 44100, 0, 0, 0) then
begin
  BASS_Start();
  Name1:=ExpandConstant('{tmp}\my.mp3');
    i:=BASS_StreamCreateFile(FALSE, PChar(Name1), 0, 0, 4);
  if i <> 0 then
        begin
  BASS_ChannelPlay(i, True);
end
end

///////////////////////////////////////////////////////////
{Изменение окна инсталятора с пермещение прогрессбара}
  ExtractTemporaryFile('Image_1.bmp');
  ExtractTemporaryFile('Image_2.bmp');
  ExtractTemporaryFile('Image_3.bmp');
  ExtractTemporaryFile('Image_4.bmp');
  ExtractTemporaryFile('Image_5.bmp');
  ExtractTemporaryFile('Image_6.bmp');
  ExtractTemporaryFile('Image_7.bmp');
  ExtractTemporaryFile('Image_8.bmp');
  ExtractTemporaryFile('Image_9.bmp');
  ExtractTemporaryFile('Image_10.bmp');

  currTime := 0;

  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + 10;
  WizardForm.ProgressGauge.Left := ScaleX(10);
  WizardForm.ProgressGauge.Width := WizardForm.Width - WizardForm.CancelButton.Width - ScaleX(40);
  WizardForm.ProgressGauge.Height := 12;
  WizardForm.ProgressGauge.Hide;
  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := WizardForm.ProgressGauge.Width;
  WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
  WizardForm.StatusLabel.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
  SplashImage.Hide;
///////////////////////////////////////////////////////////

  URLLabel := TNewStaticText.Create(WizardForm);
  URLLabel.Caption := 'Special for Game-Torrent.info';
  URLLabel.Cursor := crHand;
  URLLabel.OnClick := @URLLabelOnClick;
  URLLabel.Parent := WizardForm;
  { Alter Font *after* setting Parent so the correct defaults are inherited first }
  URLLabel.Font.Style := URLLabel.Font.Style + [fsUnderline];
  URLLabel.Font.Color := clBlue;
  URLLabel.Top :=  330;
  URLLabel.Left := 30;

  ExtractTemporaryFile('Welcome.bmp')
  ExtractTemporaryFile('Finish.bmp')
  WizardForm.WizardSmallBitmapImage.Top:=0
  WizardForm.WizardSmallBitmapImage.Left:=0
  WizardForm.WizardSmallBitmapImage.Width:=498
  WizardForm.WizardSmallBitmapImage.Height:=58
  WizardForm.PageNameLabel.Visible:=false
  WizardForm.PageDescriptionLabel.Visible:=false
  WizardForm.FinishedLabel.Visible:=False
  WizardForm.FinishedHeadingLabel.Visible:=False
  WizardForm.WelcomeLabel1.Visible:=False
  WizardForm.WelcomeLabel2.Visible:=False
  Text := TNewStaticText.Create(WizardForm);
  Text.Top := 102;
  Text.Width := 332;
  Text.Height := 14;
  Text.Caption := 'Список жестких дисков и свободного места';
  Text.Parent := WizardForm.SelectDirPage;

  ListBox := TListBox.Create(WizardForm);
  ListBox.Top := 120;
  ListBox.Width := 332;
  ListBox.Height := ScaleY(90);
  ListBox.Parent := WizardForm.SelectDirPage;
  ListBox.OnClick := @ListBoxOnClick;
  ListBox.Font.Name := 'Courier New';
  ListBox.Font.Size := 10;
  ListBox.Font.Style := [fsBold];
  ListBox.Color := clBtnFace;

  drives := GetLogicalDrives();
  for i := 0 to 31 do
  begin
    if (drives and (1 shl i)) > 0 then
    begin
      Path := chr(ord('A') + i) + ':\';
      if GetDriveType(Path) = DRIVE_FIXED then
      begin
        GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
        if FreeMB>1024 then ListBox.Items.Add(Path + '  ' + IntToStr(round(FreeMB / TotalMB * 100)) + '%  ' + floatToStr(round(FreeMB/1024*100)/100) + ' GB')
        else ListBox.Items.Add(Path + '  ' + IntToStr(round(FreeMB / TotalMB * 100)) + '%  ' + IntToStr(FreeMB) + ' MB');
      end;
    end;
  end;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
var
  Path,s,z: String;
  FreeMB, TotalMB: Cardinal;
begin
  Result:= True;
  if CurPageID = wpSelectDir then
    begin
      Path:= ExtractFileDrive(WizardForm.DirEdit.Text);
      GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
      if FreeMB < (NeedSize*1024) then
    begin
      if FreeMB>1024 then
      begin
      s:='Для установки приложения необходимо '+ IntTostr(NeedSize)+ ' GB,'#13+'а на выбранном Вами диске доступно только '+ floatToStr(round(FreeMB/1024*100)/100) + ' GB!'
      end
        else s:='Для установки приложения необходимо '+ IntTostr(NeedSize)+ ' GB,'#13+'а на выбранном Вами диске доступно только '+ + IntToStr(FreeMB)+' MB';
      MsgBox(s, mbCriticalError, MB_OK)
        Result := False;
    end;
    end;
////////////////////////////////
begin
if CurPageID = wpUserInfo then
begin
Result:=true;
if not state
or not soft
then
begin
z:='Не все компоненты удовлетворяют требованиям игры.' #13+#13 'Вы действительно хотите продолжить установку?'
if MsgBox(z, mbInformation, MB_YESNO)=idNo
then Result:=false;
end
end
end
end;

procedure CurPageChanged(CurPageID: Integer);
var
  Text: TNewStaticText;
  Windows,WindowsName: TMemo;
  Os,OS1,OS2,OS3,OS4,OS5,OS6,OS7,OS8,OS9,OS10,HARD: string; // строка с названием необходимой ОС
  ProcessorName: string;
  Processor, VideoCardPanel, AudioCardPanel, RAMPanel, PageFilePanel: TMemo;
  ProcessorNamePanel, VideoCardNamePanel, AudioCardNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  ProcessorMHZ: Cardinal;
  StaticText: TNewStaticText;
  VidRam: integer;
  pfunc: LongWord;
begin
/////////////////////////////////////////
{Здесь код показа на странице Инсталл измененного прогрессбара}
if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 5);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      URLLabel.Hide;

      WizardForm.ProgressGauge.Show;
      SplashImage.Show;
      WizardForm.StatusLabel.Show;

      WizardForm.CancelButton.Enabled :=True;
    end
  else
    begin
    URLLabel.Show;
    WizardForm.ProgressGauge.Hide;
    SplashImage.Hide;
    WizardForm.StatusLabel.Hide;
    //WizardForm.FilenameLabel.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;

    end;
//////////////////////////////////////////////////////////////
If CurPageID=wpFinished then
  begin
  Image2:=TBitmapImage.Create(WizardForm)
 with Image2 do begin
  Left:=0
  Top:=0
  Width:=497
  Height:=313
  Parent:=WizardForm.FinishedPage
  Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\Finish.bmp')
  end
  WizardForm.NextButton.Left:=380;
  WizardForm.NextButton.Top:=325;
 end
 //////////////////////////////
 If CurPageID=wpWelcome then
 begin
  If WizardForm.FindComponent('NextButton') is TButton
then
  TButton(WizardForm.FindComponent('NextButton')).Caption:='Начать>';
  end
  begin
  Image1:=TBitmapImage.Create(WizardForm)
 with Image1 do begin
  Left:=0
  Top:=0
  Width:=497
  Height:=313
  Parent:=WizardForm.WelcomePage
  Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\Welcome.bmp')
  end
  end
  if CurPageID=wpSelectTasks then
 begin
  If WizardForm.FindComponent('NextButton') is TButton
then
  TButton(WizardForm.FindComponent('NextButton')).Caption:='Установка';
  If WizardForm.FindComponent('CancelButton') is TButton
then
  TButton(WizardForm.FindComponent('CancelButton')).Caption:='Выход';
  end
 if CurPageID = wpUserInfo then
  begin
  //подменяем сраницу информации о пользователе на информацию об ОС
    wizardForm.UserInfoNameEdit.visible:=false;
    wizardForm.UserInfoNameEdit.text:='Игрок'; //на случай, когда имя пользователя не указано в системе
    wizardForm.UserInfoNameLabel.visible:=false;
    wizardForm.UserInfoOrgLabel.visible:=false;
    wizardForm.UserInfoOrgEdit.visible:=false;
    wizardForm.UserInfoOrgEdit.text:='Группа игроков ';//на случай, когда организация не указано в системе
    wizardForm.PageNameLabel.Caption := 'Аппаратное обеспечение и Операционная система';
    wizardForm.PageDescriptionLabel.Caption := 'Программа установки обнаружила следующие необходимые компоненты и Операционную систему ';
    RegQueryStringValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', 'ProcessorNameString', ProcessorName);
    RegQueryDWordValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', '~MHz', ProcessorMHZ);

  OS:=' Microsoft Windows XP Service Pack 2';
  OS10:=' Microsoft Windows XP Service Pack 3'; //строка является записью из реестра
  OS1:=' Microsoft Windows 2000 Service Pack 4'; //строка является записью из реестра
  OS2:=' Windows Vista (TM) Ultimate ';
  OS3:=' Windows Vista (TM) Home Basic ';
  OS4:=' Windows Vista (TM) Home Premium ';
  OS5:=' Windows Vista (TM) Business ';
  OS6:=' Windows Vista (TM) Ultimate Service Pack 1'
  OS7:=' Windows Vista (TM) Home Basic Service Pack 1';
  OS8:=' Windows Vista (TM) Home Premium Service Pack 1';
  OS9:=' Windows Vista (TM) Business Service Pack 1';
  HARD:='Все компоненты удовлетворяют требованиям игры.';
  Windows := TMemo.Create(WizardForm);

  StaticText := TNewStaticText.Create(TNewStaticText.Create(WizardForm));
  with StaticText do begin
    Left := 0;
    Top := 52;
    Width := 417;
    Height := 14;
    Caption := 'Все компоненты удовлетворяют требованиям игры.';
    Parent := WizardForm.UserInfoPage;
    StaticText.font.color:=clGreen;
  end


  with Windows do
  begin
    Text := ' Операц. система';
    Parent := WizardForm.UserInfoPage;

    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(20);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := clBtnFace;
  end
    Processor := TMemo.Create(WizardForm);
  with Processor do begin
    Text := ' Процессор';
    Parent := WizardForm.UserInfoPage;

    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(77);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := clBtnFace;
  end
    VideoCardPanel := TMemo.Create(WizardForm);
  with VideoCardPanel do begin
    Text := ' Видеоадаптер';
    Parent := WizardForm.UserInfoPage;

    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(104);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := clBtnFace;
  end
    AudioCardPanel := TMemo.Create(WizardForm);
  with AudioCardPanel do begin
    Text := ' Звуковая карта';
    Parent := WizardForm.UserInfoPage;
    Color := clBtnFace;
    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(131);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;

  end
    RAMPanel := TMemo.Create(WizardForm);
  with RAMPanel do begin
    Text := ' ОЗУ';
    Parent := WizardForm.UserInfoPage;
    Color := clBtnFace;
    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(158);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.


    ReadOnly := True;

  end

  PageFilePanel := TMemo.Create(WizardForm);
  with PageFilePanel do begin
    Text := ' Файл подкачки';
    Parent := WizardForm.UserInfoPage;
    Color := clBtnFace;
    Left := ScaleX(0); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(185);
    Width := ScaleX(106); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.


    ReadOnly := True;

    ProcessorNamePanel := TMemo.Create(WizardForm);
  with ProcessorNamePanel do begin

    Text :=  DelSP(ProcessorName) + '  ' + IntToStr(ProcessorMHZ) + 'MHz'; //новое обработанное значение строки
    Parent := WizardForm.UserInfoPage;

    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(77);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := $CCFFCC;

    if ProcessorMHZ < 2800 then
  begin
    ProcessorNamePanel.Color := $ccccff;
    StaticText.Caption := 'Не все компоненты удовлетворяют требованиям игры.';
    StaticText.font.color:=clRed;
  end;

  VideoCardNamePanel := TMemo.Create(WizardForm);
  with VideoCardNamePanel do begin
    Text :=  ' ' + GetVideoCardName + 'MB'; //+'    ОЗУ-'+inttostr(round(GetVidMemLocal/1000000))+' МБ'
    Parent := WizardForm.UserInfoPage;
    VidrAM := GetVidMemLocal / 1000000;

    if VidRam > 127 then
    begin
      if VidRam < 200 then text := text + ' ОЗУ - 128 МB'
      else if VidRam < 300 then text := text + ' ОЗУ - 256 МB'
      else if VidRam < 400 then text := text + ' ОЗУ - 384 МB'
      else if VidRam > 500 then text := text + ' ОЗУ - 512 МB';
    end;

    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(104);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := $CCFFCC;

    if GetVidMemLocal < 255000000 then //128 MB
  begin
    StaticText.Caption := 'Не все компоненты удовлетворяют требованиям игры.';
    StaticText.font.color:=clRed;
    VideoCardNamePanel.Color := $ccccff;
  end;


  end
    AudioCardNamePanel := TMemo.Create(WizardForm);
  with AudioCardNamePanel do begin
    Text := ' ' + GetSoundCardName;
    Parent := WizardForm.UserInfoPage;
    Color := $CCFFCC;
    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(131);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R

    ReadOnly := True;

  end
    RAMTotalPanel := TMemo.Create(WizardForm);
  with RAMTotalPanel do begin
    Text :=  ' ' + IntToStr(GetSystemPhys + 1) + ' MB';
    Parent := WizardForm.UserInfoPage;
    Color := $CCFFCC;

    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(158);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    if GetSystemPhys + 1 < 1024 then
  begin
    RAMTotalPanel.Color := $ccccff;
    StaticText.Caption := 'Не все компоненты удовлетворяют требованиям игры.';
    StaticText.font.color:=clRed;
  end;
  end;

  PageFileTotalPanel := TMemo.Create(WizardForm);
  with PageFileTotalPanel do begin
    Text :=  ' ' + IntToStr(GetSystemPage) + ' MB';
    Parent := WizardForm.UserInfoPage;
    Color := $CCFFCC;

    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(185);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    if GetSystemPage < 1247 then
  begin
    PageFileTotalPanel.Color := $ccccff;
    StaticText.Caption := 'Не все компоненты удовлетворяют требованиям игры.';
    StaticText.font.color:=clRed;
  end;
  end;


  end

  if ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion,ProductName|}')='' then
  begin

    WindowsName := TMemo.Create(WizardForm);
    with WindowsName do begin
    Text := ExpandConstant(' {reg:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion,ProductName|}')+ExpandConstant(' {reg:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion,CSDVersion|}');
    Parent := WizardForm.UserInfoPage;

    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(20);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;
    Color := $CCFFCC;
  end

  end

 end;

 // Проверка Windows 9x
  if ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion,ProductName|}')<>'' then
  begin
  WindowsName := TMemo.Create(WizardForm);
  with WindowsName do begin
    Text := ExpandConstant(' {reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion,ProductName|}')+ExpandConstant(' {reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion,CSDVersion|}');
    Parent := WizardForm.UserInfoPage;
    Color := $CCFFCC;
    Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
    Top := ScaleY(20);
    Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
    Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.

    ReadOnly := True;

  end

  end;


  if OS=(WindowsName.Text) then state:=true else
  if OS2=(WindowsName.Text) then state:=true else
  if OS3=(WindowsName.Text) then state:=true else
  if OS4=(WindowsName.Text) then state:=true else
  if OS5=(WindowsName.Text) then state:=true else
  if OS6=(WindowsName.Text) then state:=true else
  if OS7=(WindowsName.Text) then state:=true else
  if OS8=(WindowsName.Text) then state:=true else
  if OS9=(WindowsName.Text) then state:=true else
  if OS10=(WindowsName.Text) then state:=true else
  if OS1=(WindowsName.Text) then state:=true else state:=false;

////////////////////////////////////////////////////////////////////////
{условие проверки оборудования}
  if HARD=(StaticText.Caption) then soft:=true else soft:=false;
////////////////////////////////////////////////////////////////////////
  Text := TNewStaticText.Create(WizardForm);
    with Text do begin
    Left := 0;
    Top := 0;
    Width := 417;
    Height := 14;
    if state then
    begin
      Font.Color:=clGreen;
      WindowsName.color:=$CCFFCC;
    // SP_Num.color:=$CCFFCC;
      Caption := 'Операционная система соответствует требованиям игры.';
    end
    else
    begin
      Font.Color:=clREd;
      WindowsName.color:=clRed;

      WindowsName.Left := ScaleX(110); //оригинал S.T.A.L.K.E.R.
      WindowsName.Top := ScaleY(20);
      WindowsName.Width := ScaleX(304); //оригинал S.T.A.L.K.E.R.
      WindowsName.Height := ScaleY(22); //оригинал S.T.A.L.K.E.R.
      WindowsName.ReadOnly := True;



      Caption := 'Операционная система не соответствует требованиям игры.';
    end
    Parent := WizardForm.UserInfoPage;
  end
    Text := TNewStaticText.Create(TNewStaticText.Create(WizardForm));
  with Text do begin
    Left := 0;
    Top := 220;
    Width := 417;
    Height := 14;
    Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».';
    Parent := WizardForm.UserInfoPage;
  end

 end;
end;

procedure DeInitializeSetup();
begin
 KillTimer(0, TimerID);
 BASS_Stop(); //нужно для остановки проигрывания
 BASS_Free(); //нужно для быстрой выгрузки библиотеки вместе с муз. файлом
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = InfoPage.ID then UpdateInfo()  // Обновление информации о системе
end;

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

;[Run]
;Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent



Что и где объявить?

Serega 14-04-2009 21:05 1094098

Drongo, по первому вопросу, лучше воспользоваться GameScript Generator, а по второму пример, названия картинок и путь до них, нужно поправить в секции [Files], там единственное идёт показ по времени, где-то у меня был пример по процентам, поищу...

Цитата:

Цитата Drongo
Undeclared identifier TIME_FOR_VIEW »

надо добавить в самое начало скрипта:
#define TIME_FOR_VIEW 1

Drongo 15-04-2009 12:24 1094621

Цитата:

Цитата Serega_
там единственное идёт показ по времени »

Это нормально, так как установка около 3.66 ГБ, будет сжата по максимуму, так что нормально, но если будет время поискать по процентам, не откажусь опробовать и такой вариант.
В принципе всё получилось и инсталятор рабочий! :up: Только три нюанса портят всю красоту...

Три нюанса

1. Диалог установки



2. Картинка вверху, во время выбора куда устанавливать, нужны ли ярлыки



3. Финиш установки


Подскажите, что и где нужно подправить? Я бы хотел вместо этих стандартных, втулить свои, пользовательские картинки. Какой нужен размер?

Скрипт предложенный Serega_, на нём я остановился.
Скрипт
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "My Program"
#define MyAppVerName "My Program 1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "StyleBuilder.exe"
#define TIME_FOR_VIEW 1

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{337AE44F-3DF6-4C55-AFCA-AAA9A6436F0E}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=E:\
OutputBaseFilename=setup
Compression=none
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: compiler:Libraries\InnoCallback.dll; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_2.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_3.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_4.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_5.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_6.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_7.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_8.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_9.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_10.bmp; Flags: dontcopy

;Source: "D:\Контроль\TGTSoft\StyleBuilder\StyleBuilder.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Programms\Я_Автоустановка\BartPE\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Сode]
//--------------
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin
    if RunMyProg.Checked then
    Exec(ExpandConstant('{app}\MyProg.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('Image_2.bmp')
  ExtractTemporaryFile('Image_3.bmp')
  ExtractTemporaryFile('Image_4.bmp')
  ExtractTemporaryFile('Image_5.bmp')
  ExtractTemporaryFile('Image_6.bmp')
  ExtractTemporaryFile('Image_7.bmp')
  ExtractTemporaryFile('Image_8.bmp')
  ExtractTemporaryFile('Image_9.bmp')
  ExtractTemporaryFile('Image_10.bmp')

  currTime := 0;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
//  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(150);
  WelcomeLabel1.Top := ScaleY(15);
  WelcomeLabel1.Width := ScaleX(320);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clBlack;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 14;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

      WelcomeLabel2:=TLabel.Create(WizardForm);
      WelcomeLabel2.Left := ScaleX(150);
      WelcomeLabel2.Top := ScaleY(90);
      WelcomeLabel2.Width := ScaleX(320);
      WelcomeLabel2.Height := ScaleY(200);
      WelcomeLabel2.AutoSize := False;
      WelcomeLabel2.WordWrap := True;
      WelcomeLabel2.Font.Color := clBlack;
      WelcomeLabel2.Font.Size := 8;
      WelcomeLabel2.Transparent := True;
      WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clBlack;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clBlack;
      PageDescriptionLabel.Transparent := True;
      PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(150);
  FinishedHeadingLabel.Top := ScaleY(15);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clBlack;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
//  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(150);
      FinishedLabel.Top := ScaleY(90);
      FinishedLabel.Width := ScaleX(320);
      FinishedLabel.Height := ScaleY(200);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clBlack;
      FinishedLabel.Font.Size := 8;
      FinishedLabel.Transparent := True;
      FinishedLabel.Parent := WizardForm.FinishedPage;

  RunMyProg := TCheckBox.Create(WizardForm);
  RunMyProg.Parent := WizardForm.FinishedPage;
  RunMyProg.Left := ScaleX(150);
  RunMyProg.Top := ScaleY(152);
  RunMyProg.Width := ScaleX(14);
  RunMyProg.Height := ScaleX(14);
//  RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

      RunLabel:=TLabel.Create(WizardForm);
      RunLabel.Left := ScaleX(170);
      RunLabel.Top := ScaleY(150);
      RunLabel.Width := ScaleX(200);
      RunLabel.Height := ScaleY(20);
      RunLabel.AutoSize := False;
      RunLabel.WordWrap := True;
      RunLabel.Font.Color := clBlack;
      RunLabel.Font.Size := 10;
      RunLabel.OnClick := @RLabelOnClick;
      RunLabel.Transparent := True;
      RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить программу';

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;
//--------------
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

;[Run]
;Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent

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


tem000 15-04-2009 13:37 1094679

Цитата:

Цитата Drongo
Подскажите, что и где нужно подправить? Я бы хотел вместо этих стандартных, втулить свои, пользовательские картинки. Какой нужен размер? »

Drongo, Вот скрипт с секцией CODE написаный Serega_, сам им пользуюсь, в первое окно ставлю картинку размером 500х313, а узкий сверху 500х60, картинки кидай в папку
embedded.

читать дальше »
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}

[code]
var
WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
RunMyProg: TCheckBox;

procedure RLabelOnClick(Sender: TObject);
begin
if RunMyProg.Checked=false then
begin
RunMyProg.Checked := true;
end else
RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
ErrorCode: Integer;
begin
if CurStep = ssDone then
begin
if RunMyProg.Checked then
Exec(ExpandConstant('{app}\MyProg.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
end;

procedure InitializeWizard();
begin
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
WizardForm.FinishedLabel.Hide;
// низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
WizardForm.RunList.Height := 0;
WizardForm.RunList.Width := 0;

WizardForm.WizardBitmapImage.Align:=true;
WizardForm.WizardBitmapImage2.Align:=true;
WizardForm.WizardSmallBitmapImage.Align:=true;

WelcomeLabel1:=TLabel.Create(WizardForm);
WelcomeLabel1.Left:=ScaleX(150);
WelcomeLabel1.Top := ScaleY(15);
WelcomeLabel1.Width := ScaleX(320);
WelcomeLabel1.Height := ScaleY(75);
WelcomeLabel1.AutoSize := False;
WelcomeLabel1.WordWrap := True;
WelcomeLabel1.Font.Color := clBlack;
// здесь можно поиграть шрифтом
// WelcomeLabel1.Font.Style := [fsBold];
// WelcomeLabel1.Font.Name:='MS Sans Serif';
WelcomeLabel1.Font.Size := 14;
WelcomeLabel1.Transparent := True;
WelcomeLabel1.Parent := WizardForm.WelcomePage;

WelcomeLabel2:=TLabel.Create(WizardForm);
WelcomeLabel2.Left := ScaleX(150);
WelcomeLabel2.Top := ScaleY(90);
WelcomeLabel2.Width := ScaleX(320);
WelcomeLabel2.Height := ScaleY(200);
WelcomeLabel2.AutoSize := False;
WelcomeLabel2.WordWrap := True;
WelcomeLabel2.Font.Color := clBlack;
WelcomeLabel2.Font.Size := 8;
WelcomeLabel2.Transparent := True;
WelcomeLabel2.Parent := WizardForm.WelcomePage;

PageNameLabel := TLabel.Create(WizardForm);
PageNameLabel.Left := ScaleX(25);
PageNameLabel.Top := ScaleY(10);
PageNameLabel.Width := ScaleX(300);
PageNameLabel.Height := ScaleY(14);
PageNameLabel.AutoSize := False;
PageNameLabel.WordWrap := True;
PageNameLabel.Font.Color := clBlack;
PageNameLabel.Font.Style := [fsBold];
PageNameLabel.Transparent := True;
PageNameLabel.Parent := WizardForm.MainPanel;

PageDescriptionLabel := TLabel.Create(WizardForm);
PageDescriptionLabel.Left := ScaleX(40);
PageDescriptionLabel.Top := ScaleY(25);
PageDescriptionLabel.Width := ScaleX(475);
PageDescriptionLabel.Height := ScaleY(30);
PageDescriptionLabel.AutoSize := False;
PageDescriptionLabel.WordWrap := True;
PageDescriptionLabel.Font.Color := clBlack;
PageDescriptionLabel.Transparent := True;
PageDescriptionLabel.Parent := WizardForm.MainPanel;

FinishedHeadingLabel:=TLabel.Create(WizardForm);
FinishedHeadingLabel.Left := ScaleX(150);
FinishedHeadingLabel.Top := ScaleY(15);
FinishedHeadingLabel.Width := ScaleX(320);
FinishedHeadingLabel.Height := ScaleY(75);
FinishedHeadingLabel.AutoSize := False;
FinishedHeadingLabel.WordWrap := True;
FinishedHeadingLabel.Font.Color := clBlack;
// здесь тоже можно поиграть шрифтом
// FinishedHeadingLabel.Font.Style := [fsBold];
// FinishedHeadingLabel.Font.Name:='MS Sans Serif';
FinishedHeadingLabel.Font.Size := 14;
FinishedHeadingLabel.Transparent := True;
FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

FinishedLabel:=TLabel.Create(WizardForm);
FinishedLabel.Left := ScaleX(150);
FinishedLabel.Top := ScaleY(90);
FinishedLabel.Width := ScaleX(320);
FinishedLabel.Height := ScaleY(200);
FinishedLabel.AutoSize := False;
FinishedLabel.WordWrap := True;
FinishedLabel.Font.Color := clBlack;
FinishedLabel.Font.Size := 8;
FinishedLabel.Transparent := True;
FinishedLabel.Parent := WizardForm.FinishedPage;

RunMyProg := TCheckBox.Create(WizardForm);
RunMyProg.Parent := WizardForm.FinishedPage;
RunMyProg.Left := ScaleX(150);
RunMyProg.Top := ScaleY(152);
RunMyProg.Width := ScaleX(14);
RunMyProg.Height := ScaleX(14);
// RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

RunLabel:=TLabel.Create(WizardForm);
RunLabel.Left := ScaleX(170);
RunLabel.Top := ScaleY(150);
RunLabel.Width := ScaleX(200);
RunLabel.Height := ScaleY(20);
RunLabel.AutoSize := False;
RunLabel.WordWrap := True;
RunLabel.Font.Color := clBlack;
RunLabel.Font.Size := 10;
RunLabel.OnClick := @RLabelOnClick;
RunLabel.Transparent := True;
RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
RunLabel.Caption := 'Запустить программу';
end;

Drongo 15-04-2009 14:08 1094698

tem000, Спасибо, в принципе уже разобрался. :)
Цитата:

Цитата tem000
размером 500х313, а узкий сверху 500х60 »

За точные размеры - спасибо.
Осталось только Объеденить код с проверкой параметров системы и текущий код с показом картинок. Немогу. Не разбираюсь в языке... Возможно ли эти два кода объеденить в один?

Код с картинками
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Need for Speed Most Wanted"
#define MyAppVerName "Need for Speed Most Wanted"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "StyleBuilder.exe"
#define TIME_FOR_VIEW 1

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{337AE44F-3DF6-4C55-AFCA-AAA9A6436F0E}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=E:\
OutputBaseFilename=setup
Compression=none
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: compiler:Libraries\InnoCallback.dll; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_2.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_3.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_4.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_5.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_6.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_7.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_8.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_9.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_10.bmp; Flags: dontcopy

;Source: "D:\Контроль\TGTSoft\StyleBuilder\StyleBuilder.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Контроль\Диск-А\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Сode]
//--------------
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin
    if RunMyProg.Checked then
    Exec(ExpandConstant('{app}\MyProg.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('Image_2.bmp')
  ExtractTemporaryFile('Image_3.bmp')
  ExtractTemporaryFile('Image_4.bmp')
  ExtractTemporaryFile('Image_5.bmp')
  ExtractTemporaryFile('Image_6.bmp')
  ExtractTemporaryFile('Image_7.bmp')
  ExtractTemporaryFile('Image_8.bmp')
  ExtractTemporaryFile('Image_9.bmp')
  ExtractTemporaryFile('Image_10.bmp')

  currTime := 0;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(10);
  WelcomeLabel1.Top := ScaleY(10);
  WelcomeLabel1.Width := ScaleX(350);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clGreen;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 14;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

      WelcomeLabel2:=TLabel.Create(WizardForm);
      WelcomeLabel2.Left := ScaleX(10);
      WelcomeLabel2.Top := ScaleY(70);
      WelcomeLabel2.Width := ScaleX(200);
      WelcomeLabel2.Height := ScaleY(300);
      WelcomeLabel2.AutoSize := False;
      WelcomeLabel2.WordWrap := True;
      WelcomeLabel2.Font.Color := clGreen;
      WelcomeLabel2.Font.Style := [fsBold];
      WelcomeLabel2.Font.Size := 10;
      WelcomeLabel2.Transparent := True;
      WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clRed;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clRed;
      PageDescriptionLabel.Transparent := True;
      PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(10);
  FinishedHeadingLabel.Top := ScaleY(10);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clBlue;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
//  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(10);
      FinishedLabel.Top := ScaleY(70);
      FinishedLabel.Width := ScaleX(220);
      FinishedLabel.Height := ScaleY(300);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clRed;
      FinishedLabel.Font.Size := 10;
      FinishedLabel.Transparent := True;
      FinishedLabel.Parent := WizardForm.FinishedPage;

  RunMyProg := TCheckBox.Create(WizardForm);
  RunMyProg.Parent := WizardForm.FinishedPage;
  RunMyProg.Left := ScaleX(10);
  RunMyProg.Top := ScaleY(270);
  RunMyProg.Width := ScaleX(13);
  RunMyProg.Height := ScaleX(13);
  //RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

      RunLabel:=TLabel.Create(WizardForm);
      RunLabel.Left := ScaleX(30);
      RunLabel.Top := ScaleY(270);
      RunLabel.Width := ScaleX(200);
      RunLabel.Height := ScaleY(20);
      RunLabel.AutoSize := False;
      RunLabel.WordWrap := True;
      RunLabel.Font.Color := clGreen;
      RunLabel.Font.Style := [fsBold];
      RunLabel.Font.Size := 10;
      RunLabel.OnClick := @RLabelOnClick;
      RunLabel.Transparent := True;
      RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить программу';

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;
//--------------

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

;[Run]
;Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent



Код с проверкой кофигурации
Код:

[Сode]
type
 PDisplay_Device = record
  cb: DWord;
  DeviceName: array [0..31] of char;
  DeviceString: array [0..127] of char;
  StateFlags: DWord;
  DeviceID, DeviceKey: array [0..127] of char;
 end;

 TMixerCaps = record
  vPid, vDriverVersion: DWord;
  sName: array [0..31] of char;
  Support, cDestinations: DWord;
 end;

// Проверка версии Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
        {Win9x}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
    LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
    HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
        {WinNT}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
    LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
    LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
  oneMB = 1024*1024;
  NeedMHz = 1800;
  NeedVideoRAM = 128;
  NeedSoundCard = 'Creative X-Fi';
  NeedMB = 512;
  NeedPageFile = 1024;

var
  InfoPage: TWizardPage;
  TopText, BottomText: TNewStaticText;
  ChangeText: Boolean;
  SystemPanel, ProcessorPanel, VideoPanel,
  AudioPanel, RAMPanel, PageFilePanel: TMemo;
  SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
  AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  lpCaps: TMixerCaps;
  Version: TWindowsVersion;
  MemoryEx: TMemoryStatusEx;
  n, errCode: Integer;
  Keys: TArrayOfString;
  DeviceValue: Cardinal;
  lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
 external 'GetSystemMetrics@user32.dll stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
 external 'GetDeviceCaps@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
 external 'CreateDCA@GDI32 stdcall';

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
 external 'EnumDisplayDevicesA@user32.dll stdcall';

function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
 external 'mixerGetDevCapsA@winmm.dll stdcall';

function mixerGetNumDevs: Integer;
 external 'mixerGetNumDevs@winmm.dll stdcall';

// Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
  if Abs(Bytes/Multiple) > Bytes/Multiple then
    Result := (Bytes/Multiple + 1)*Multiple
  else
    Result := Bytes
end;

// Перевод числа в значение Бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
 if not noMB then
    Result := FloatToStr(Int(Bytes)) + ' Мб'
 else
                if Bytes < 1024 then
      Result := FloatToStr(Int(Bytes)) + ' Бт'
    else
                        if Bytes/1024 < 1024 then
          Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Кб'
      else
                                        if Bytes/oneMB < 1024 then
            Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Мб'
          else
            if Bytes/oneMB/1000 < 1024 then
                Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Гб'
            else
                                                          Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Тб'
 StringChange(Result, ',', '.')
end;

// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
 while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1)
 Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
 Result := Lo
 if Lo < 0 then
    Result := Result + $7FFFFFFF + $7FFFFFFF + 2
 for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

function CheckCPU(NeedMHz: Integer): Boolean;
var
  String: String;
begin
        String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys)        // Количество ядер
        for n := 0 to GetArrayLength(Keys)-1 do
      RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
        if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
        Exit
  else
    Result := True
end;

function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
        MemoryEx.dwLength := SizeOf(MemoryEx)
        if not GlobalMemoryStatusEx(MemoryEx) then
        MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
  else
          if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
        Exit
    else
        Result := True
end;

procedure CreateCheckForm();
begin

  TopText := TNewStaticText.Create(InfoPage)
  with TopText do
  begin
    Parent := InfoPage.Surface
    Left := 0
    AutoSize := True
  end

  BottomText := TNewStaticText.Create(InfoPage)
  with BottomText do
  begin
    Parent := InfoPage.Surface
    Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».'
    Font.Color := clBlack
    Left := 0
    Top := 200
    AutoSize := True
  end

  SystemPanel := TMemo.Create(InfoPage)
  with SystemPanel do
  begin
    Text := 'Система'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ScaleY(33)
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  SystemVersionPanel := TMemo.Create(InfoPage)
  with SystemVersionPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := SystemPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  ProcessorPanel := TMemo.Create(InfoPage)
  with ProcessorPanel do
  begin
    Text := 'Процессор'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := SystemPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  ProcessorMHzPanel := TMemo.Create(InfoPage)
  with ProcessorMHzPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := ProcessorPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  VideoPanel := TMemo.Create(InfoPage)
  with VideoPanel do
  begin
    Text := 'Видеоадаптер'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ProcessorPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  VideoRAMPanel := TMemo.Create(InfoPage)
  with VideoRAMPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := VideoPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  AudioPanel := TMemo.Create(InfoPage)
  with AudioPanel do
  begin
    Text := 'Звуковая карта'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := VideoPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  AudioNamePanel := TMemo.Create(InfoPage)
  with AudioNamePanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := AudioPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  RAMPanel := TMemo.Create(InfoPage)
  with RAMPanel do
  begin
    Text := 'Объём памяти'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := AudioPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  RAMTotalPanel := TMemo.Create(InfoPage)
  with RAMTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := RAMPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  PageFilePanel := TMemo.Create(InfoPage)
  with PageFilePanel do
  begin
    Text := 'Файл подкачки'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := RAMPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end;

  PageFileTotalPanel := TMemo.Create(InfoPage)
  with PageFileTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := PageFilePanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

end;

procedure UpdateInfo();
var
  DeviceName, DeviceKey: String;
begin
  ChangeText := False

  GetWindowsVersionEx(Version)

  // Операционная система:
  SystemVersionPanel.Color := $CCFFCC

  DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
  if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
        RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
  if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
    DeviceName := DeviceName + ' ' + DeviceKey
        StringChange(DeviceName, 'Microsoft ', '')
  SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
                            '.' + IntToStr(Version.Build)

  if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and  // Windows 2000 SP4
    (Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and  // Windows XP SP2
    (Pos('XP Service Pack 3', SystemVersionPanel.Text) = 0) and  // Windows XP SP3
    (Pos('Vista', SystemVersionPanel.Text) = 0) then  // Windows Vista (c любым SP или без него)
    begin
      SystemVersionPanel.Color := $CCCCFF
      ChangeText := True
    end

  // Процессор:
  ProcessorMHzPanel.Color := $CCFFCC

  if not CheckCPU(NeedMHz) then
    begin
      ProcessorMHzPanel.Color := $CCCCFF
      ChangeText := True
    end

  ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
  if GetArrayLength(Keys) > 1 then
    ProcessorPanel.Text := 'Процессоры' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

  // Видеокарта:
  VideoRAMPanel.Color := $CCFFCC

  lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
  DeviceKey := ''
        n := 0
  while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
            (lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
        for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
  Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127)  // Ключ драйвера получаем из API
        StringChange(DeviceKey, '\Registry\Machine\', '')
  errCode := 1
  DeviceValue := 0
  if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
                for n := 1 to Length(DeviceName) do
      begin
        DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
        errCode := errCode*$100
      end
  else
    if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
    else
        RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
        DeviceName := ''
  for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
  Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

  if DeviceName <> '' then
    if DeviceValue > 0 then
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
    else
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
  else
    begin
      VideoRAMPanel.Text := ' Драйвер устройства не обнаружен'
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  if (DeviceValue/oneMB < NeedVideoRAM) then
    begin
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
                        IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
                        GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

  // Звуковая карта:
  AudioNamePanel.Color := $CCFFCC

  // for errCode := 0 to 1 do  // Вывод основного звукового устройства
  for errCode := 0 to mixerGetNumDevs do
    begin
                  mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
      DeviceName := ' '
                  for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
      Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
      Delete(DeviceName, Pos(' [', DeviceName), 31)
      StringChange(DeviceName, 'SB ', 'Creative ')
      Delete(DeviceName, Pos(' Audio', DeviceName), 31)
                  SetArrayLength(Keys, errCode)
      if errCode > 0 then Keys[errCode-1] := DeviceName
    end

        if GetArrayLength(Keys) > 1 then
    begin
    AudioPanel.Text := 'Звуковые карты'
    // AudioPanel.Text := 'Звуковые карты (' + IntToStr(GetArrayLength(Keys)) +')'
    AudioNamePanel.Text := ''
    for n := 1 to GetArrayLength(Keys) do
        AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1]  // + '(' + IntToStr(n) + ')'
    end
  else
    if GetArrayLength(Keys) = 0 then
    begin
      AudioNamePanel.Text := ' Драйвер устройства не обнаружен'
      AudioNamePanel.Color := $CCCCFF
      ChangeText := True
    end
      else
      AudioNamePanel.Text := Keys[0]
  if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
    AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')'

  // Объём памяти:
    RAMTotalPanel.Color := $CCFFCC
  if not CheckMemorySize(NeedMB) then
    begin
      RAMTotalPanel.Color := $CCCCFF
      ChangeText := True
    end
  RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' всего, ' +
                              ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
                                                        Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' используется, ' +
                              ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' свободно'

  // Виртуальная память:
  PageFileTotalPanel.Color := $CCFFCC
  PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' всего, ' +
                                  ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
                                            Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' занято системным кэшем'
  if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
    begin
      PageFileTotalPanel.Color := $CCCCFF
      ChangeText := True
    end

  if ChangeText = True then
    begin
      TopText.Top := 0
      TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям программы.' #13
                        'Пожалуйста, проверьте позиции, выделенные красным цветом.'
      TopText.Font.Color := clRed
      WizardForm.NextButton.Enabled := False
    end
  else
    begin
      TopText.Caption := 'Все компоненты соответствуют минимальным требованиям программы.'
      TopText.Font.Color := clGreen
      TopText.Top := 8
      WizardForm.NextButton.Enabled := True
    end
end;

procedure InitializeWizard();
begin
  InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
                                          'Программа установки обнаружила следующие наобходимые компоненты.')
  CreateCheckForm()  // Создание объектов TMemo, в которых будет выводится информация о системе
  UpdateInfo()  // Обновление информации о системе
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = InfoPage.ID then UpdateInfo()  // Обновление информации о системе
end;


Serega 15-04-2009 15:21 1094749

Drongo,
читать дальше »
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Need for Speed Most Wanted"
#define MyAppVerName "Need for Speed Most Wanted"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "StyleBuilder.exe"
#define TIME_FOR_VIEW 1

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{337AE44F-3DF6-4C55-AFCA-AAA9A6436F0E}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=E:\
OutputBaseFilename=setup
Compression=none
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: compiler:Libraries\InnoCallback.dll; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_2.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_3.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_4.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_5.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_6.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_7.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_8.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_9.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_10.bmp; Flags: dontcopy

;Source: "D:\Контроль\TGTSoft\StyleBuilder\StyleBuilder.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Контроль\Диск-А\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

;[Run]
;Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent

[_Code]
type
 PDisplay_Device = record
  cb: DWord;
  DeviceName: array [0..31] of char;
  DeviceString: array [0..127] of char;
  StateFlags: DWord;
  DeviceID, DeviceKey: array [0..127] of char;
 end;

 TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

 TMixerCaps = record
  vPid, vDriverVersion: DWord;
  sName: array [0..31] of char;
  Support, cDestinations: DWord;
 end;

// Проверка версии Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
        {Win9x}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
    LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
    HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
        {WinNT}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
    LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
    LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
  oneMB = 1024*1024;
  NeedMHz = 1800;
  NeedVideoRAM = 128;
  NeedSoundCard = 'Creative X-Fi';
  NeedMB = 512;
  NeedPageFile = 1024;

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

  InfoPage: TWizardPage;
  TopText, BottomText: TNewStaticText;
  ChangeText: Boolean;
  SystemPanel, ProcessorPanel, VideoPanel,
  AudioPanel, RAMPanel, PageFilePanel: TMemo;
  SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
  AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  lpCaps: TMixerCaps;
  Version: TWindowsVersion;
  MemoryEx: TMemoryStatusEx;
  n, errCode: Integer;
  Keys: TArrayOfString;
  DeviceValue: Cardinal;
  lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
 external 'GetSystemMetrics@user32.dll stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
 external 'GetDeviceCaps@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
 external 'CreateDCA@GDI32 stdcall';

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
 external 'EnumDisplayDevicesA@user32.dll stdcall';

function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
 external 'mixerGetDevCapsA@winmm.dll stdcall';

function mixerGetNumDevs: Integer;
 external 'mixerGetNumDevs@winmm.dll stdcall';

//--------------
function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin
    if RunMyProg.Checked then
    Exec(ExpandConstant('{app}\MyProg.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить программу';

  if CurPageID = InfoPage.ID then UpdateInfo()  // Обновление информации о системе

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;

// Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
  if Abs(Bytes/Multiple) > Bytes/Multiple then
    Result := (Bytes/Multiple + 1)*Multiple
  else
    Result := Bytes
end;

// Перевод числа в значение Бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
 if not noMB then
    Result := FloatToStr(Int(Bytes)) + ' Мб'
 else
                if Bytes < 1024 then
      Result := FloatToStr(Int(Bytes)) + ' Бт'
    else
                        if Bytes/1024 < 1024 then
          Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Кб'
      else
                                        if Bytes/oneMB < 1024 then
            Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Мб'
          else
            if Bytes/oneMB/1000 < 1024 then
                Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Гб'
            else
                                                          Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Тб'
 StringChange(Result, ',', '.')
end;

// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
 while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1)
 Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
 Result := Lo
 if Lo < 0 then
    Result := Result + $7FFFFFFF + $7FFFFFFF + 2
 for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

function CheckCPU(NeedMHz: Integer): Boolean;
var
  String: String;
begin
        String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys)        // Количество ядер
        for n := 0 to GetArrayLength(Keys)-1 do
      RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
        if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
        Exit
  else
    Result := True
end;

function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
        MemoryEx.dwLength := SizeOf(MemoryEx)
        if not GlobalMemoryStatusEx(MemoryEx) then
        MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
  else
          if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
        Exit
    else
        Result := True
end;

procedure CreateCheckForm();
begin

  TopText := TNewStaticText.Create(InfoPage)
  with TopText do
  begin
    Parent := InfoPage.Surface
    Left := 0
    AutoSize := True
  end

  BottomText := TNewStaticText.Create(InfoPage)
  with BottomText do
  begin
    Parent := InfoPage.Surface
    Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».'
    Font.Color := clBlack
    Left := 0
    Top := 200
    AutoSize := True
  end

  SystemPanel := TMemo.Create(InfoPage)
  with SystemPanel do
  begin
    Text := 'Система'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ScaleY(33)
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  SystemVersionPanel := TMemo.Create(InfoPage)
  with SystemVersionPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := SystemPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  ProcessorPanel := TMemo.Create(InfoPage)
  with ProcessorPanel do
  begin
    Text := 'Процессор'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := SystemPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  ProcessorMHzPanel := TMemo.Create(InfoPage)
  with ProcessorMHzPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := ProcessorPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  VideoPanel := TMemo.Create(InfoPage)
  with VideoPanel do
  begin
    Text := 'Видеоадаптер'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ProcessorPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  VideoRAMPanel := TMemo.Create(InfoPage)
  with VideoRAMPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := VideoPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  AudioPanel := TMemo.Create(InfoPage)
  with AudioPanel do
  begin
    Text := 'Звуковая карта'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := VideoPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  AudioNamePanel := TMemo.Create(InfoPage)
  with AudioNamePanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := AudioPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  RAMPanel := TMemo.Create(InfoPage)
  with RAMPanel do
  begin
    Text := 'Объём памяти'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := AudioPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  RAMTotalPanel := TMemo.Create(InfoPage)
  with RAMTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := RAMPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  PageFilePanel := TMemo.Create(InfoPage)
  with PageFilePanel do
  begin
    Text := 'Файл подкачки'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := RAMPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end;

  PageFileTotalPanel := TMemo.Create(InfoPage)
  with PageFileTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := PageFilePanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

end;

procedure UpdateInfo();
var
  DeviceName, DeviceKey: String;
begin
  ChangeText := False

  GetWindowsVersionEx(Version)

  // Операционная система:
  SystemVersionPanel.Color := $CCFFCC

  DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
  if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
        RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
  if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
    DeviceName := DeviceName + ' ' + DeviceKey
        StringChange(DeviceName, 'Microsoft ', '')
  SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
                            '.' + IntToStr(Version.Build)

  if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and  // Windows 2000 SP4
    (Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and  // Windows XP SP2
    (Pos('XP Service Pack 3', SystemVersionPanel.Text) = 0) and  // Windows XP SP3
    (Pos('Vista', SystemVersionPanel.Text) = 0) then  // Windows Vista (c любым SP или без него)
    begin
      SystemVersionPanel.Color := $CCCCFF
      ChangeText := True
    end

  // Процессор:
  ProcessorMHzPanel.Color := $CCFFCC

  if not CheckCPU(NeedMHz) then
    begin
      ProcessorMHzPanel.Color := $CCCCFF
      ChangeText := True
    end

  ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
  if GetArrayLength(Keys) > 1 then
    ProcessorPanel.Text := 'Процессоры' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

  // Видеокарта:
  VideoRAMPanel.Color := $CCFFCC

  lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
  DeviceKey := ''
        n := 0
  while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
            (lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
        for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
  Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127)  // Ключ драйвера получаем из API
        StringChange(DeviceKey, '\Registry\Machine\', '')
  errCode := 1
  DeviceValue := 0
  if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
                for n := 1 to Length(DeviceName) do
      begin
        DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
        errCode := errCode*$100
      end
  else
    if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
    else
        RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
        DeviceName := ''
  for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
  Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

  if DeviceName <> '' then
    if DeviceValue > 0 then
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
    else
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
  else
    begin
      VideoRAMPanel.Text := ' Драйвер устройства не обнаружен'
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  if (DeviceValue/oneMB < NeedVideoRAM) then
    begin
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
                        IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
                        GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

  // Звуковая карта:
  AudioNamePanel.Color := $CCFFCC

  // for errCode := 0 to 1 do  // Вывод основного звукового устройства
  for errCode := 0 to mixerGetNumDevs do
    begin
                  mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
      DeviceName := ' '
                  for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
      Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
      Delete(DeviceName, Pos(' [', DeviceName), 31)
      StringChange(DeviceName, 'SB ', 'Creative ')
      Delete(DeviceName, Pos(' Audio', DeviceName), 31)
                  SetArrayLength(Keys, errCode)
      if errCode > 0 then Keys[errCode-1] := DeviceName
    end

        if GetArrayLength(Keys) > 1 then
    begin
    AudioPanel.Text := 'Звуковые карты'
    // AudioPanel.Text := 'Звуковые карты (' + IntToStr(GetArrayLength(Keys)) +')'
    AudioNamePanel.Text := ''
    for n := 1 to GetArrayLength(Keys) do
        AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1]  // + '(' + IntToStr(n) + ')'
    end
  else
    if GetArrayLength(Keys) = 0 then
    begin
      AudioNamePanel.Text := ' Драйвер устройства не обнаружен'
      AudioNamePanel.Color := $CCCCFF
      ChangeText := True
    end
      else
      AudioNamePanel.Text := Keys[0]
  if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
    AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')'

  // Объём памяти:
    RAMTotalPanel.Color := $CCFFCC
  if not CheckMemorySize(NeedMB) then
    begin
      RAMTotalPanel.Color := $CCCCFF
      ChangeText := True
    end
  RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' всего, ' +
                              ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
                                                        Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' используется, ' +
                              ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' свободно'

  // Виртуальная память:
  PageFileTotalPanel.Color := $CCFFCC
  PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' всего, ' +
                                  ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
                                            Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' занято системным кэшем'
  if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
    begin
      PageFileTotalPanel.Color := $CCCCFF
      ChangeText := True
    end

  if ChangeText = True then
    begin
      TopText.Top := 0
      TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям программы.' #13
                        'Пожалуйста, проверьте позиции, выделенные красным цветом.'
      TopText.Font.Color := clRed
      WizardForm.NextButton.Enabled := False
    end
  else
    begin
      TopText.Caption := 'Все компоненты соответствуют минимальным требованиям программы.'
      TopText.Font.Color := clGreen
      TopText.Top := 8
      WizardForm.NextButton.Enabled := True
    end
end;

procedure InitializeWizard();
begin
  InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
                                          'Программа установки обнаружила следующие наобходимые компоненты.')
  CreateCheckForm()  // Создание объектов TMemo, в которых будет выводится информация о системе
  UpdateInfo()  // Обновление информации о системе

  ExtractTemporaryFile('Image_2.bmp')
  ExtractTemporaryFile('Image_3.bmp')
  ExtractTemporaryFile('Image_4.bmp')
  ExtractTemporaryFile('Image_5.bmp')
  ExtractTemporaryFile('Image_6.bmp')
  ExtractTemporaryFile('Image_7.bmp')
  ExtractTemporaryFile('Image_8.bmp')
  ExtractTemporaryFile('Image_9.bmp')
  ExtractTemporaryFile('Image_10.bmp')

  currTime := 0;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(10);
  WelcomeLabel1.Top := ScaleY(10);
  WelcomeLabel1.Width := ScaleX(350);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clGreen;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 14;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

      WelcomeLabel2:=TLabel.Create(WizardForm);
      WelcomeLabel2.Left := ScaleX(10);
      WelcomeLabel2.Top := ScaleY(70);
      WelcomeLabel2.Width := ScaleX(200);
      WelcomeLabel2.Height := ScaleY(300);
      WelcomeLabel2.AutoSize := False;
      WelcomeLabel2.WordWrap := True;
      WelcomeLabel2.Font.Color := clGreen;
      WelcomeLabel2.Font.Style := [fsBold];
      WelcomeLabel2.Font.Size := 10;
      WelcomeLabel2.Transparent := True;
      WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clRed;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clRed;
      PageDescriptionLabel.Transparent := True;
      PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(10);
  FinishedHeadingLabel.Top := ScaleY(10);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clBlue;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
//  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(10);
      FinishedLabel.Top := ScaleY(70);
      FinishedLabel.Width := ScaleX(220);
      FinishedLabel.Height := ScaleY(300);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clRed;
      FinishedLabel.Font.Size := 10;
      FinishedLabel.Transparent := True;
      FinishedLabel.Parent := WizardForm.FinishedPage;

  RunMyProg := TCheckBox.Create(WizardForm);
  RunMyProg.Parent := WizardForm.FinishedPage;
  RunMyProg.Left := ScaleX(10);
  RunMyProg.Top := ScaleY(270);
  RunMyProg.Width := ScaleX(13);
  RunMyProg.Height := ScaleX(13);
  //RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

      RunLabel:=TLabel.Create(WizardForm);
      RunLabel.Left := ScaleX(30);
      RunLabel.Top := ScaleY(270);
      RunLabel.Width := ScaleX(200);
      RunLabel.Height := ScaleY(20);
      RunLabel.AutoSize := False;
      RunLabel.WordWrap := True;
      RunLabel.Font.Color := clGreen;
      RunLabel.Font.Style := [fsBold];
      RunLabel.Font.Size := 10;
      RunLabel.OnClick := @RLabelOnClick;
      RunLabel.Transparent := True;
      RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;
//--------------


Drongo 15-04-2009 17:18 1094897

Serega_, Спасибо!!! :up: Я выделил красной строкой, в части кода, ниже. Тот участок, на который ругался InnoSetup, пришлось закоментировать эту строку, вроде порядок, откомпилилось на ура. Это критично, что этой строки у меня не будет?
Небольшая поправка
Код:

...
procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить игру';

  if CurPageID = InfoPage.ID then UpdateInfo()  // Обновление информации о системе

  if (CurPageID = wpInstalling) then
    begin
...


Serega 15-04-2009 17:46 1094917

Drongo, я забыл там в конце строки поставить ';' и надо процедуру - procedure CurPageChanged(CurPageID: Integer);... одним словом надо
так
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Need for Speed Most Wanted"
#define MyAppVerName "Need for Speed Most Wanted"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "StyleBuilder.exe"
#define TIME_FOR_VIEW 1

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{337AE44F-3DF6-4C55-AFCA-AAA9A6436F0E}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=E:\
OutputBaseFilename=setup
Compression=none
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: compiler:Libraries\InnoCallback.dll; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_2.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_3.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_4.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_5.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_6.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_7.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_8.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_9.bmp; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_10.bmp; Flags: dontcopy

;Source: "D:\Контроль\TGTSoft\StyleBuilder\StyleBuilder.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Контроль\Диск-А\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

;[Run]
;Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent

[_Code]
type
 PDisplay_Device = record
  cb: DWord;
  DeviceName: array [0..31] of char;
  DeviceString: array [0..127] of char;
  StateFlags: DWord;
  DeviceID, DeviceKey: array [0..127] of char;
 end;

 TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

 TMixerCaps = record
  vPid, vDriverVersion: DWord;
  sName: array [0..31] of char;
  Support, cDestinations: DWord;
 end;

// Проверка версии Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
        {Win9x}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
    LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
    HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
        {WinNT}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
    LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
    LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
  oneMB = 1024*1024;
  NeedMHz = 1800;
  NeedVideoRAM = 128;
  NeedSoundCard = 'Creative X-Fi';
  NeedMB = 512;
  NeedPageFile = 1024;

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

  InfoPage: TWizardPage;
  TopText, BottomText: TNewStaticText;
  ChangeText: Boolean;
  SystemPanel, ProcessorPanel, VideoPanel,
  AudioPanel, RAMPanel, PageFilePanel: TMemo;
  SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
  AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  lpCaps: TMixerCaps;
  Version: TWindowsVersion;
  MemoryEx: TMemoryStatusEx;
  n, errCode: Integer;
  Keys: TArrayOfString;
  DeviceValue: Cardinal;
  lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
 external 'GetSystemMetrics@user32.dll stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
 external 'GetDeviceCaps@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
 external 'CreateDCA@GDI32 stdcall';

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
 external 'EnumDisplayDevicesA@user32.dll stdcall';

function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
 external 'mixerGetDevCapsA@winmm.dll stdcall';

function mixerGetNumDevs: Integer;
 external 'mixerGetNumDevs@winmm.dll stdcall';

//--------------
function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin
    if RunMyProg.Checked then
    Exec(ExpandConstant('{app}\MyProg.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

// Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
  if Abs(Bytes/Multiple) > Bytes/Multiple then
    Result := (Bytes/Multiple + 1)*Multiple
  else
    Result := Bytes
end;

// Перевод числа в значение Бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
 if not noMB then
    Result := FloatToStr(Int(Bytes)) + ' Мб'
 else
                if Bytes < 1024 then
      Result := FloatToStr(Int(Bytes)) + ' Бт'
    else
                        if Bytes/1024 < 1024 then
          Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Кб'
      else
                                        if Bytes/oneMB < 1024 then
            Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Мб'
          else
            if Bytes/oneMB/1000 < 1024 then
                Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Гб'
            else
                                                          Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Тб'
 StringChange(Result, ',', '.')
end;

// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
 while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1)
 Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
 Result := Lo
 if Lo < 0 then
    Result := Result + $7FFFFFFF + $7FFFFFFF + 2
 for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

function CheckCPU(NeedMHz: Integer): Boolean;
var
  String: String;
begin
        String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys)        // Количество ядер
        for n := 0 to GetArrayLength(Keys)-1 do
      RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
        if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
        Exit
  else
    Result := True
end;

function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
        MemoryEx.dwLength := SizeOf(MemoryEx)
        if not GlobalMemoryStatusEx(MemoryEx) then
        MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
  else
          if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
        Exit
    else
        Result := True
end;

procedure CreateCheckForm();
begin

  TopText := TNewStaticText.Create(InfoPage)
  with TopText do
  begin
    Parent := InfoPage.Surface
    Left := 0
    AutoSize := True
  end

  BottomText := TNewStaticText.Create(InfoPage)
  with BottomText do
  begin
    Parent := InfoPage.Surface
    Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».'
    Font.Color := clBlack
    Left := 0
    Top := 200
    AutoSize := True
  end

  SystemPanel := TMemo.Create(InfoPage)
  with SystemPanel do
  begin
    Text := 'Система'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ScaleY(33)
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  SystemVersionPanel := TMemo.Create(InfoPage)
  with SystemVersionPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := SystemPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  ProcessorPanel := TMemo.Create(InfoPage)
  with ProcessorPanel do
  begin
    Text := 'Процессор'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := SystemPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  ProcessorMHzPanel := TMemo.Create(InfoPage)
  with ProcessorMHzPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := ProcessorPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  VideoPanel := TMemo.Create(InfoPage)
  with VideoPanel do
  begin
    Text := 'Видеоадаптер'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ProcessorPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  VideoRAMPanel := TMemo.Create(InfoPage)
  with VideoRAMPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := VideoPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  AudioPanel := TMemo.Create(InfoPage)
  with AudioPanel do
  begin
    Text := 'Звуковая карта'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := VideoPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  AudioNamePanel := TMemo.Create(InfoPage)
  with AudioNamePanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := AudioPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  RAMPanel := TMemo.Create(InfoPage)
  with RAMPanel do
  begin
    Text := 'Объём памяти'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := AudioPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  RAMTotalPanel := TMemo.Create(InfoPage)
  with RAMTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := RAMPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  PageFilePanel := TMemo.Create(InfoPage)
  with PageFilePanel do
  begin
    Text := 'Файл подкачки'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := RAMPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end;

  PageFileTotalPanel := TMemo.Create(InfoPage)
  with PageFileTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := PageFilePanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

end;

procedure UpdateInfo();
var
  DeviceName, DeviceKey: String;
begin
  ChangeText := False

  GetWindowsVersionEx(Version)

  // Операционная система:
  SystemVersionPanel.Color := $CCFFCC

  DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
  if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
        RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
  if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
    DeviceName := DeviceName + ' ' + DeviceKey
        StringChange(DeviceName, 'Microsoft ', '')
  SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
                            '.' + IntToStr(Version.Build)

  if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and  // Windows 2000 SP4
    (Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and  // Windows XP SP2
    (Pos('XP Service Pack 3', SystemVersionPanel.Text) = 0) and  // Windows XP SP3
    (Pos('Vista', SystemVersionPanel.Text) = 0) then  // Windows Vista (c любым SP или без него)
    begin
      SystemVersionPanel.Color := $CCCCFF
      ChangeText := True
    end

  // Процессор:
  ProcessorMHzPanel.Color := $CCFFCC

  if not CheckCPU(NeedMHz) then
    begin
      ProcessorMHzPanel.Color := $CCCCFF
      ChangeText := True
    end

  ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
  if GetArrayLength(Keys) > 1 then
    ProcessorPanel.Text := 'Процессоры' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

  // Видеокарта:
  VideoRAMPanel.Color := $CCFFCC

  lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
  DeviceKey := ''
        n := 0
  while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
            (lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
        for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
  Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127)  // Ключ драйвера получаем из API
        StringChange(DeviceKey, '\Registry\Machine\', '')
  errCode := 1
  DeviceValue := 0
  if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
                for n := 1 to Length(DeviceName) do
      begin
        DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
        errCode := errCode*$100
      end
  else
    if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
    else
        RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
        DeviceName := ''
  for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
  Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

  if DeviceName <> '' then
    if DeviceValue > 0 then
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
    else
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
  else
    begin
      VideoRAMPanel.Text := ' Драйвер устройства не обнаружен'
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  if (DeviceValue/oneMB < NeedVideoRAM) then
    begin
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
                        IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
                        GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

  // Звуковая карта:
  AudioNamePanel.Color := $CCFFCC

  // for errCode := 0 to 1 do  // Вывод основного звукового устройства
  for errCode := 0 to mixerGetNumDevs do
    begin
                  mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
      DeviceName := ' '
                  for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
      Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
      Delete(DeviceName, Pos(' [', DeviceName), 31)
      StringChange(DeviceName, 'SB ', 'Creative ')
      Delete(DeviceName, Pos(' Audio', DeviceName), 31)
                  SetArrayLength(Keys, errCode)
      if errCode > 0 then Keys[errCode-1] := DeviceName
    end

        if GetArrayLength(Keys) > 1 then
    begin
    AudioPanel.Text := 'Звуковые карты'
    // AudioPanel.Text := 'Звуковые карты (' + IntToStr(GetArrayLength(Keys)) +')'
    AudioNamePanel.Text := ''
    for n := 1 to GetArrayLength(Keys) do
        AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1]  // + '(' + IntToStr(n) + ')'
    end
  else
    if GetArrayLength(Keys) = 0 then
    begin
      AudioNamePanel.Text := ' Драйвер устройства не обнаружен'
      AudioNamePanel.Color := $CCCCFF
      ChangeText := True
    end
      else
      AudioNamePanel.Text := Keys[0]
  if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
    AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')'

  // Объём памяти:
    RAMTotalPanel.Color := $CCFFCC
  if not CheckMemorySize(NeedMB) then
    begin
      RAMTotalPanel.Color := $CCCCFF
      ChangeText := True
    end
  RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' всего, ' +
                              ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
                                                        Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' используется, ' +
                              ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' свободно'

  // Виртуальная память:
  PageFileTotalPanel.Color := $CCFFCC
  PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' всего, ' +
                                  ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
                                            Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' занято системным кэшем'
  if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
    begin
      PageFileTotalPanel.Color := $CCCCFF
      ChangeText := True
    end

  if ChangeText = True then
    begin
      TopText.Top := 0
      TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям программы.' #13
                        'Пожалуйста, проверьте позиции, выделенные красным цветом.'
      TopText.Font.Color := clRed
      WizardForm.NextButton.Enabled := False
    end
  else
    begin
      TopText.Caption := 'Все компоненты соответствуют минимальным требованиям программы.'
      TopText.Font.Color := clGreen
      TopText.Top := 8
      WizardForm.NextButton.Enabled := True
    end
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить программу';

  if CurPageID = InfoPage.ID then UpdateInfo();  // Обновление информации о системе

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;

procedure InitializeWizard();
begin
  InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
                                          'Программа установки обнаружила следующие наобходимые компоненты.')
  CreateCheckForm()  // Создание объектов TMemo, в которых будет выводится информация о системе
  UpdateInfo()  // Обновление информации о системе

  ExtractTemporaryFile('Image_2.bmp')
  ExtractTemporaryFile('Image_3.bmp')
  ExtractTemporaryFile('Image_4.bmp')
  ExtractTemporaryFile('Image_5.bmp')
  ExtractTemporaryFile('Image_6.bmp')
  ExtractTemporaryFile('Image_7.bmp')
  ExtractTemporaryFile('Image_8.bmp')
  ExtractTemporaryFile('Image_9.bmp')
  ExtractTemporaryFile('Image_10.bmp')

  currTime := 0;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(10);
  WelcomeLabel1.Top := ScaleY(10);
  WelcomeLabel1.Width := ScaleX(350);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clGreen;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 14;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

      WelcomeLabel2:=TLabel.Create(WizardForm);
      WelcomeLabel2.Left := ScaleX(10);
      WelcomeLabel2.Top := ScaleY(70);
      WelcomeLabel2.Width := ScaleX(200);
      WelcomeLabel2.Height := ScaleY(300);
      WelcomeLabel2.AutoSize := False;
      WelcomeLabel2.WordWrap := True;
      WelcomeLabel2.Font.Color := clGreen;
      WelcomeLabel2.Font.Style := [fsBold];
      WelcomeLabel2.Font.Size := 10;
      WelcomeLabel2.Transparent := True;
      WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clRed;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clRed;
      PageDescriptionLabel.Transparent := True;
      PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(10);
  FinishedHeadingLabel.Top := ScaleY(10);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clBlue;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
//  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(10);
      FinishedLabel.Top := ScaleY(70);
      FinishedLabel.Width := ScaleX(220);
      FinishedLabel.Height := ScaleY(300);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clRed;
      FinishedLabel.Font.Size := 10;
      FinishedLabel.Transparent := True;
      FinishedLabel.Parent := WizardForm.FinishedPage;

  RunMyProg := TCheckBox.Create(WizardForm);
  RunMyProg.Parent := WizardForm.FinishedPage;
  RunMyProg.Left := ScaleX(10);
  RunMyProg.Top := ScaleY(270);
  RunMyProg.Width := ScaleX(13);
  RunMyProg.Height := ScaleX(13);
  //RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

      RunLabel:=TLabel.Create(WizardForm);
      RunLabel.Left := ScaleX(30);
      RunLabel.Top := ScaleY(270);
      RunLabel.Width := ScaleX(200);
      RunLabel.Height := ScaleY(20);
      RunLabel.AutoSize := False;
      RunLabel.WordWrap := True;
      RunLabel.Font.Color := clGreen;
      RunLabel.Font.Style := [fsBold];
      RunLabel.Font.Size := 10;
      RunLabel.OnClick := @RLabelOnClick;
      RunLabel.Transparent := True;
      RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;
//--------------

просто была ссылка на процедуру, которая ещё не прописана... :wink:

Drongo 15-04-2009 22:06 1095171

Serega_, Ох выручил ты меня. ))) Спасибо. Собственно, этот код можно в коллекцию вносить, ты знаешь сам какую. ;)

Пока редактировал код, такая лажа произошла, вырубили электричество, а я как последний ламер, :lamer: не успел сохранить код, который делал, теперь почти всё заново делать. :teeth: Повторение, мать учения?. ;)

BlackSelf 16-04-2009 12:24 1095645

Здравствуйте. Подскажите, как можно сделать проигрывание видео в окне инсталлятора на протяжении всего процесса установки (от wpWelcome до wpFinished). Знаю, что должна быть определенная библиотека, позволяющая проигрывать swf и flv, но её так нигде и не встретил.
З.Ы. Не появился ли способ отображения процесса распаковки в прогрессбаре архивов freearc'a?

Serega 16-04-2009 15:48 1095861

Цитата:

Цитата BlackSelf
Подскажите, как можно сделать проигрывание видео в окне инсталлятора на протяжении всего процесса установки (от wpWelcome до wpFinished). Знаю, что должна быть определенная библиотека, позволяющая проигрывать swf и flv, но её так нигде и не встретил. »

попробуйте использовать Corona Skin & Check System Requirements, я думаю вам поможет.
Описание:

обложка для Inno Setup с проверкой системных требований.
Кроме визуального стиля Corona(WMP9) в инсталлятор по выбору пользователя добавляется:
Проверка системы/минимальных требований. Переключение Мастера на этапе установки в компактное/обычное окно. Подсчёт времени установки. Деинсталляция программы перед установкой. Удаление оставшихся после деинсталляции файлов. Автонастройка процесса сборки. Шифрование. Запуск настроек системы клавишами F1-F12. Объём и кол-во скопированных файлов на прогрессбаре. Экран справки/скриншотов. Слайдшоу, SCR, BMP или AVI-файл в фоновом окне. Проигрывание музыки в фоне и многое другое...

Цитата:

Цитата BlackSelf
Не появился ли способ отображения процесса распаковки в прогрессбаре архивов freearc'a? »

пока не встречался...

Drongo 16-04-2009 16:19 1095906

Привет Serega_, это снова я. Два последних вопроса:
1. Где прописать минимальные значения, при которых должна идти установка? Нужны следующие минимальные значения.
а) CPU 1.5 GHz
б) ОЗУ - 256 Mb
в) Видеопамять - 64 Mb

2. Можно ли стандартное окно установки увеличить на 20 в ширину и 20 в высоту? Второй вопрос чисто теоретический, бьюсь с первым. С операционными системами разобрался, а вот с железом, пока никак. Если не затруднит покажи где эти значения нужно менять? :)

Код Скрипта
Код:

[_Code]
type
 PDisplay_Device = record
  cb: DWord;
  DeviceName: array [0..31] of char;
  DeviceString: array [0..127] of char;
  StateFlags: DWord;
  DeviceID, DeviceKey: array [0..127] of char;
 end;

 TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

 TMixerCaps = record
  vPid, vDriverVersion: DWord;
  sName: array [0..31] of char;
  Support, cDestinations: DWord;
 end;

// Проверка версии Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
        {Win9x}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
    LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
    HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
        {WinNT}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
    LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
    LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
  oneMB = 1024*1024;
  NeedMHz = 1800;
  NeedVideoRAM = 128;
  NeedSoundCard = 'Creative X-Fi';
  NeedMB = 512;
  NeedPageFile = 1024;

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

  InfoPage: TWizardPage;
  TopText, BottomText: TNewStaticText;
  ChangeText: Boolean;
  SystemPanel, ProcessorPanel, VideoPanel,
  AudioPanel, RAMPanel, PageFilePanel: TMemo;
  SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
  AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  lpCaps: TMixerCaps;
  Version: TWindowsVersion;
  MemoryEx: TMemoryStatusEx;
  n, errCode: Integer;
  Keys: TArrayOfString;
  DeviceValue: Cardinal;
  lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
 external 'GetSystemMetrics@user32.dll stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
 external 'GetDeviceCaps@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
 external 'CreateDCA@GDI32 stdcall';

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
 external 'EnumDisplayDevicesA@user32.dll stdcall';

function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
 external 'mixerGetDevCapsA@winmm.dll stdcall';

function mixerGetNumDevs: Integer;
 external 'mixerGetNumDevs@winmm.dll stdcall';

//--------------
function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  10*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_11.bmp')) end;
  11*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_12.bmp')) end;
  12*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_13.bmp'))end;
  13*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_14.bmp'))end;
  14*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_15.bmp')) end;
  15*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_16.bmp')) end;
  16*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_17.bmp')) end;
  17*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_18.bmp')) end;
  18*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_19.bmp')) end;
  19*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_20.bmp'))end;
  20*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_21.bmp')) end;
  21*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_22.bmp')) end;
  22*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_23.bmp')) end;
  23*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_24.bmp')) end;
  24*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_25.bmp')) end;
  25*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_26.bmp')) end;
  26*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_27.bmp')) end;
  end;
  if CurrTime = 26*{#TIME_FOR_VIEW} then CurrTime := -1;
  //--------------
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin
    if RunMyProg.Checked then
    Exec(ExpandConstant('{app}\MyProg.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

// Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
  if Abs(Bytes/Multiple) > Bytes/Multiple then
    Result := (Bytes/Multiple + 1)*Multiple
  else
    Result := Bytes
end;

// Перевод числа в значение Бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
 if not noMB then
    Result := FloatToStr(Int(Bytes)) + ' Мб'
 else
                if Bytes < 1024 then
      Result := FloatToStr(Int(Bytes)) + ' Бт'
    else
                        if Bytes/1024 < 1024 then
          Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Кб'
      else
                                        if Bytes/oneMB < 1024 then
            Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Мб'
          else
            if Bytes/oneMB/1000 < 1024 then
                Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Гб'
            else
                                                          Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Тб'
 StringChange(Result, ',', '.')
end;

// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
 while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1)
 Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
 Result := Lo
 if Lo < 0 then
    Result := Result + $7FFFFFFF + $7FFFFFFF + 2
 for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

function CheckCPU(NeedMHz: Integer): Boolean;
var
  String: String;
begin
        String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys)        // Количество ядер
        for n := 0 to GetArrayLength(Keys)-1 do
      RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
        if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
        Exit
  else
    Result := True
end;

function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
        MemoryEx.dwLength := SizeOf(MemoryEx)
        if not GlobalMemoryStatusEx(MemoryEx) then
        MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
  else
          if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
        Exit
    else
        Result := True
end;

procedure CreateCheckForm();
begin

  TopText := TNewStaticText.Create(InfoPage)
  with TopText do
  begin
    Parent := InfoPage.Surface
    Left := 0
    AutoSize := True
  end

  BottomText := TNewStaticText.Create(InfoPage)
  with BottomText do
  begin
    Parent := InfoPage.Surface
    Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».'
    Font.Color := clBlack
    Left := 0
    Top := 200
    AutoSize := True
  end

  SystemPanel := TMemo.Create(InfoPage)
  with SystemPanel do
  begin
    Text := 'Система'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ScaleY(33)
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  SystemVersionPanel := TMemo.Create(InfoPage)
  with SystemVersionPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := SystemPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  ProcessorPanel := TMemo.Create(InfoPage)
  with ProcessorPanel do
  begin
    Text := 'Процессор'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := SystemPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  ProcessorMHzPanel := TMemo.Create(InfoPage)
  with ProcessorMHzPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := ProcessorPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  VideoPanel := TMemo.Create(InfoPage)
  with VideoPanel do
  begin
    Text := 'Видеоадаптер'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ProcessorPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  VideoRAMPanel := TMemo.Create(InfoPage)
  with VideoRAMPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := VideoPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  AudioPanel := TMemo.Create(InfoPage)
  with AudioPanel do
  begin
    Text := 'Звуковая карта'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := VideoPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  AudioNamePanel := TMemo.Create(InfoPage)
  with AudioNamePanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := AudioPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  RAMPanel := TMemo.Create(InfoPage)
  with RAMPanel do
  begin
    Text := 'Объём памяти'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := AudioPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  RAMTotalPanel := TMemo.Create(InfoPage)
  with RAMTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := RAMPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  PageFilePanel := TMemo.Create(InfoPage)
  with PageFilePanel do
  begin
    Text := 'Файл подкачки'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := RAMPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end;

  PageFileTotalPanel := TMemo.Create(InfoPage)
  with PageFileTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := PageFilePanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

end;

procedure UpdateInfo();
var
  DeviceName, DeviceKey: String;
begin
  ChangeText := False

  GetWindowsVersionEx(Version)

  // Операционная система:
  SystemVersionPanel.Color := $CCFFCC

  DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
  if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
        RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
  if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
    DeviceName := DeviceName + ' ' + DeviceKey
        StringChange(DeviceName, 'Microsoft ', '')
  SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
                            '.' + IntToStr(Version.Build)

  if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and  // Windows 2000 SP4
    (Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and  // Windows XP SP2
    (Pos('XP Service Pack 3', SystemVersionPanel.Text) = 0) and  // Windows XP SP3
    (Pos('Vista', SystemVersionPanel.Text) = 0) then  // Windows Vista (c любым SP или без него)
    begin
      SystemVersionPanel.Color := $CCCCFF
      ChangeText := True
    end

  // Процессор:
  ProcessorMHzPanel.Color := $CCFFCC

  if not CheckCPU(NeedMHz) then
    begin
      ProcessorMHzPanel.Color := $CCCCFF
      ChangeText := True
    end

  ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
  if GetArrayLength(Keys) > 1 then
    ProcessorPanel.Text := 'Процессоры' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

  // Видеокарта:
  VideoRAMPanel.Color := $CCFFCC

  lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
  DeviceKey := ''
        n := 0
  while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
            (lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
        for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
  Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127)  // Ключ драйвера получаем из API
        StringChange(DeviceKey, '\Registry\Machine\', '')
  errCode := 1
  DeviceValue := 0
  if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
                for n := 1 to Length(DeviceName) do
      begin
        DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
        errCode := errCode*$100
      end
  else
    if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
    else
        RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
        DeviceName := ''
  for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
  Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

  if DeviceName <> '' then
    if DeviceValue > 0 then
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
    else
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
  else
    begin
      VideoRAMPanel.Text := ' Драйвер устройства не обнаружен'
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  if (DeviceValue/oneMB < NeedVideoRAM) then
    begin
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
                        IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
                        GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

  // Звуковая карта:
  AudioNamePanel.Color := $CCFFCC

  // for errCode := 0 to 1 do  // Вывод основного звукового устройства
  for errCode := 0 to mixerGetNumDevs do
    begin
                  mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
      DeviceName := ' '
                  for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
      Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
      Delete(DeviceName, Pos(' [', DeviceName), 31)
      StringChange(DeviceName, 'SB ', 'Creative ')
      Delete(DeviceName, Pos(' Audio', DeviceName), 31)
                  SetArrayLength(Keys, errCode)
      if errCode > 0 then Keys[errCode-1] := DeviceName
    end

        if GetArrayLength(Keys) > 1 then
    begin
    AudioPanel.Text := 'Звуковые карты'
    // AudioPanel.Text := 'Звуковые карты (' + IntToStr(GetArrayLength(Keys)) +')'
    AudioNamePanel.Text := ''
    for n := 1 to GetArrayLength(Keys) do
        AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1]  // + '(' + IntToStr(n) + ')'
    end
  else
    if GetArrayLength(Keys) = 0 then
    begin
      AudioNamePanel.Text := ' Драйвер устройства не обнаружен'
      AudioNamePanel.Color := $CCCCFF
      ChangeText := True
    end
      else
      AudioNamePanel.Text := Keys[0]
  if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
    AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')'

  // Объём памяти:
    RAMTotalPanel.Color := $CCFFCC
  if not CheckMemorySize(NeedMB) then
    begin
      RAMTotalPanel.Color := $CCCCFF
      ChangeText := True
    end
  RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' всего, ' +
                              ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
                                                        Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' используется, ' +
                              ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' свободно'

  // Виртуальная память:
  PageFileTotalPanel.Color := $CCFFCC
  PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' всего, ' +
                                  ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
                                            Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' занято системным кэшем'
  if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
    begin
      PageFileTotalPanel.Color := $CCCCFF
      ChangeText := True
    end

  if ChangeText = True then
    begin
      TopText.Top := 0
      TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям программы.' #13
                        'Пожалуйста, проверьте позиции, выделенные красным цветом.'
      TopText.Font.Color := clRed
      WizardForm.NextButton.Enabled := False
    end
  else
    begin
      TopText.Caption := 'Все компоненты соответствуют минимальным требованиям программы.'
      TopText.Font.Color := clGreen
      TopText.Top := 8
      WizardForm.NextButton.Enabled := True
    end
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить программу';

  if CurPageID = InfoPage.ID then UpdateInfo();  // Обновление информации о системе

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;

procedure InitializeWizard();
begin
  InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
                                          'Программа установки обнаружила следующие наобходимые компоненты.')
  CreateCheckForm()  // Создание объектов TMemo, в которых будет выводится информация о системе
  UpdateInfo()  // Обновление информации о системе

  ExtractTemporaryFile('Image_2.bmp')
  ExtractTemporaryFile('Image_3.bmp')
  ExtractTemporaryFile('Image_4.bmp')
  ExtractTemporaryFile('Image_5.bmp')
  ExtractTemporaryFile('Image_6.bmp')
  ExtractTemporaryFile('Image_7.bmp')
  ExtractTemporaryFile('Image_8.bmp')
  ExtractTemporaryFile('Image_9.bmp')
  ExtractTemporaryFile('Image_10.bmp')
  ExtractTemporaryFile('Image_11.bmp')
  ExtractTemporaryFile('Image_12.bmp')
  ExtractTemporaryFile('Image_13.bmp')
  ExtractTemporaryFile('Image_14.bmp')
  ExtractTemporaryFile('Image_15.bmp')
  ExtractTemporaryFile('Image_16.bmp')
  ExtractTemporaryFile('Image_17.bmp')
  ExtractTemporaryFile('Image_18.bmp')
  ExtractTemporaryFile('Image_19.bmp')
  ExtractTemporaryFile('Image_20.bmp')
  ExtractTemporaryFile('Image_21.bmp')
  ExtractTemporaryFile('Image_22.bmp')
  ExtractTemporaryFile('Image_23.bmp')
  ExtractTemporaryFile('Image_24.bmp')
  ExtractTemporaryFile('Image_25.bmp')
  ExtractTemporaryFile('Image_26.bmp')
  ExtractTemporaryFile('Image_27.bmp')


  currTime := 0;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(10);
  WelcomeLabel1.Top := ScaleY(10);
  WelcomeLabel1.Width := ScaleX(350);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clGreen;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 14;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

      WelcomeLabel2:=TLabel.Create(WizardForm);
      WelcomeLabel2.Left := ScaleX(10);
      WelcomeLabel2.Top := ScaleY(70);
      WelcomeLabel2.Width := ScaleX(200);
      WelcomeLabel2.Height := ScaleY(300);
      WelcomeLabel2.AutoSize := False;
      WelcomeLabel2.WordWrap := True;
      WelcomeLabel2.Font.Color := clGreen;
      WelcomeLabel2.Font.Style := [fsBold];
      WelcomeLabel2.Font.Size := 10;
      WelcomeLabel2.Transparent := True;
      WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clRed;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clRed;
      PageDescriptionLabel.Transparent := True;
      PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(10);
  FinishedHeadingLabel.Top := ScaleY(10);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clBlue;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
//  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(10);
      FinishedLabel.Top := ScaleY(70);
      FinishedLabel.Width := ScaleX(220);
      FinishedLabel.Height := ScaleY(300);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clRed;
      FinishedLabel.Font.Size := 10;
      FinishedLabel.Transparent := True;
      FinishedLabel.Parent := WizardForm.FinishedPage;

  RunMyProg := TCheckBox.Create(WizardForm);
  RunMyProg.Parent := WizardForm.FinishedPage;
  RunMyProg.Left := ScaleX(10);
  RunMyProg.Top := ScaleY(270);
  RunMyProg.Width := ScaleX(13);
  RunMyProg.Height := ScaleX(13);
  //RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

      RunLabel:=TLabel.Create(WizardForm);
      RunLabel.Left := ScaleX(30);
      RunLabel.Top := ScaleY(270);
      RunLabel.Width := ScaleX(200);
      RunLabel.Height := ScaleY(20);
      RunLabel.AutoSize := False;
      RunLabel.WordWrap := True;
      RunLabel.Font.Color := clGreen;
      RunLabel.Font.Style := [fsBold];
      RunLabel.Font.Size := 10;
      RunLabel.OnClick := @RLabelOnClick;
      RunLabel.Transparent := True;
      RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;
//--------------


Serega 16-04-2009 17:33 1095969

Drongo, ну с первым вопросом, насколько я понял, вы разобрались? тогда по второму:
Размеры формы указываются в Height, Width и можно ClientHeight, ClientWidth. Отличаются они тем, что одни параметры размера задаются без учёта бордюра, а вторые с учётом бордюра. Размеры родной формы мастера:

WizardForm.ClientHeight:= 360;
WizardForm.ClientWidth:= 497;
WizardForm.Height:= 389;
WizardForm.Width:= 505;

на мой взгляд лучше указывать оба параметра, хотя это не критично, но на разных версиях Windows и при разных установленных темах, ширина бордюра будет разной. А так мы сразу указываем размер формы и размер её бордюра... :wink:

volk1234 16-04-2009 18:11 1096015

А на мой взгляд неплохо было бы осветить первый вопрос в ветке.
Другим же интересно :)
Цитата:

Цитата Drongo
1. Где прописать минимальные значения, при которых должна идти установка? Нужны следующие минимальные значения.
а) CPU 1.5 GHz
б) ОЗУ - 256 Mb
в) Видеопамять - 64 Mb »


Drongo 16-04-2009 18:24 1096027

Цитата:

Цитата Serega_
Размеры формы указываются в Height, Width и можно ClientHeight, ClientWidth. Отличаются они тем, что одни параметры размера задаются без учёта бордюра, а вторые с учётом бордюра. Размеры родной формы мастера »

Понял. Я их тут объявил, всё получилось, но придётся в таком случае переделывать размеры для рисунков и перемещать объекты с формы в другое место, одним словом подгонять под новую форму. Это не критично, если надо будет сильно, сделаю, а пока и так пойдёт с таким размером.
Размер формы
Код:

...
procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
 
begin
  WizardForm.ClientHeight:= 800;
  WizardForm.ClientWidth:= 750;
  WizardForm.Height:= 500;
  WizardForm.Width:= 700;


begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить программу';

  if CurPageID = InfoPage.ID then UpdateInfo();  // Обновление информации о системе

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
  end;
end;
...



Минимальные параметры для проверки
Код:

...
const
  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
  oneMB = 1024*1024;
  NeedMHz = 1800; // Частота процессора
  NeedVideoRAM = 128; // Объём видеопамяти
  NeedSoundCard = 'Creative X-Fi'; // Звуковая карта
  NeedMB = 512; // ОЗУ
  NeedPageFile = 1024; // Файл подкачки
...


Serega 16-04-2009 18:41 1096047

Drongo, чуть поправлю, размеры формы должны находится в procedure InitializeWizard();, в вашем варианте она тоже будет работать, но это не правильно. Потому, что процедура InitializeWizard работает при инициализации формы, а procedure CurPageChanged(CurPageID: Integer); - работает на смену страниц, т.е. нужно добавить в самое начало процедуры:
читать дальше »
Код:

..............................................
procedure InitializeWizard();
begin
  WizardForm.ClientHeight:= 800;
  WizardForm.ClientWidth:= 750;
  WizardForm.Height:= 500;
  WizardForm.Width:= 700;

  InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
                                          'Программа установки обнаружила следующие наобходимые компоненты.')
  CreateCheckForm()  // Создание объектов TMemo, в которых будет выводится информация о системе
  UpdateInfo()  // Обновление информации о системе
.........................................


Drongo 17-04-2009 15:16 1096755

Serega_, В принципе всё сработало как надо. Для этого инсталятора уже переделывать ничего не буду, а для общего развития, подскажи, где менять, чтобы кнопки, линиии и размер куда мы картинку загоняем, изменить\сместить под новые размеры формы? Я только нашёл для ProgressBar.
Код:

...
WizardForm.ProgressGauge.Top := ScaleY(430); // Значение 430 как раз.
...

И последний штрих, какой флаг выставить для того, чтобы был заранее отмечен пункт Создать значок на Рабочем столе
Код:

...
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
...


Habetdin 17-04-2009 16:01 1096797

Цитата:

Цитата Drongo
чтобы был заранее отмечен пункт »

Цитата:

Цитата Drongo
Flags: unchecked »

попробуйте unchecked заменить на checked

Serega 17-04-2009 18:26 1096943

Цитата:

Цитата Habetdin
попробуйте unchecked заменить на checked »

Habetdin, флага checked - нет и при компиляции скрипта выскочит ошибка... Надо просто убрать Flags: unchecked :wink:
Цитата:

Цитата Drongo
а для общего развития, подскажи, где менять, чтобы кнопки, линиии и размер куда мы картинку загоняем, изменить\сместить под новые размеры формы? »

Компоненты основных страниц
Код:

{ для всех страниц, кроме первой - wpWelcome и последней - wpFinished }
  WizardForm.MainPanel // верхняя панель, где маленький рисунок WizardSmallBitmapImage
  WizardForm.WizardSmallBitmapImage // сам, маленький рисунок
  WizardForm.Bevel1 // точно не уверен, но помоему Bevel расположеный сразу под MainPanel
  WizardForm.PageNameLabel // имя страницы, пример: Выбор папки установки
  WizardForm.PageDescriptionLabel // описание страницы, пример: В какую папку вы хотите установить [name]?
  WizardForm.InnerNotebook // Notebook, даже незнаю как перевести ;)... расплогается по центу мастера, между верхним и нижним Bevel
{ для всех страниц }
  WizardForm.Caption // пишется на бордюре Установка - [name]
  WizardForm.Bevel // черта над кнопками (нижний Bevel)
  WizardForm.BackButton // кнопка 'Назад'
  WizardForm.NextButton // кнопка 'Далее'
  WizardForm.CancelButton // кнопка 'Отмена'

WizardForm.WelcomePage // или wpWelcome - страница приветствия
  WizardForm.WizardBitmapImage // большой рисунок, расположен слевой стороны окна мастера
  WizardForm.WelcomeLabel1 // текст: Вас приветствует мастер установки [name]
  WizardForm.WelcomeLabel2 // текст: Программа установит... и так далее

WizardForm.SelectDirPage // или wpSelectDir - страница выбора папки назначения
  WizardForm.SelectDirBitmapImage // рисунок папки на странице выбора директории
  WizardForm.SelectDirLabel // текст: Программа установит [name] в следующую папку
  WizardForm.SelectDirBrowseLabel // текст: Нажмите Далее, чтобы продолжить. Если Вы хотите выбрать другую папку нажмите Обзор.
  WizardForm.DirEdit // Edit в котором пишется путь к папке назначения
  WizardForm.DirBrowseButton // кнопка Обзор...
  WizardForm.DiskSpaceLabel // текст: Требуется как минимум [size] Мб свободного дискового пространства

WizardForm.SelectComponentsPage // или wpSelectComponents - страница выбора компонентов
  WizardForm.SelectComponentsLabel // текст: Выберите компоненты, которые Вы хотите установить... и так далее
  WizardForm.TypesCombo // ComboBox с выбором типа установки (Полная установка, Выборочная установка)
  WizardForm.ComponentsList // CheckListBox - окно выбора компонентов
  WizardForm.ComponentsDiskSpaceLabel // текст: Текущий выбор требует не менее [size] Мб на диске

WizardForm.SelectProgramGroupPage // или wpSelectProgramGroup - страница выбора программной группы
  WizardForm.SelectStartMenuFolderLabel // текст: Программа создаст ярлыки в следующей папке меню Пуск
  WizardForm.SelectGroupBitmapImage // рисунок папки
  WizardForm.SelectStartMenuFolderBrowseLabel // текст: Нажмите Далее, чтобы продолжить... и так далее
  WizardForm.GroupEdit // Edit с названием группы меню Пуск
  WizardForm.GroupBrowseButton // кнопка Обзор...

WizardForm.SelectTasksPage // или wpSelectTasks - страница выбора дополнительных задач
  WizardForm.TasksList // CheckListBox - окно выбора дополнительных задач
  WizardForm.SelectTasksLabel // текст: Выберите дополнительные задачи, которые должны выполнится... и так далее

WizardForm.ReadyPage // или wpReady - страница Всё готово к установке
  WizardForm.ReadyLabel // текст: нажмите Установить, чтобы продолжить... и так далее
  WizardForm.ReadyMemo // отображается список выбора

WizardForm.InstallingPage // или wpInstalling - страница установки, где отбражается прогрессбар
  WizardForm.FilenameLabel // при установке отбражаются имена копируемых файлов
  WizardForm.StatusLabel // при установке отбражаются пути куда копируются файлы
  WizardForm.ProgressGauge // прогрессбар

WizardForm.FinishedPage // или wpFinished - страница завершения установки
  WizardForm.FinishedHeadingLabel // текст: Завершение Мастера установки [name]
  WizardForm.FinishedLabel // текст: Программа [name] установлена на Ваш компьютер... и так далее


Drongo 17-04-2009 20:05 1097024

Цитата:

Цитата Habetdin
попробуйте unchecked заменить на checked »

Я тоже, по аналогии с С++ сразу попробовал checked. :gigi:
Цитата:

Цитата Serega_
Надо просто убрать Flags: unchecked »

И убирал тоже, но лапоть, запускал не тот .ехе, который получался после опыта, а ранее сохранённый, он рядом лежал. :gigi:
Приблизительно так

Для каждого компонета добавляем Top, Left, и т.д. и ScaleX(), ScaleY(). Правильно?
Код:

...
WizardForm.FilenameLabel.Top := ScaleY(330);
WizardForm.FilenameLabel.Top := ScaleY(430);
WizardForm.FilenameLabel.Left := ScaleX(10);
WizardForm.FilenameLabel.Width := ScaleX(380);
WizardForm.FilenameLabel.Height := ScaleX(18);
...


Serega 17-04-2009 20:30 1097055

Цитата:

Цитата Drongo
Для каждого компонета добавляем Top, Left, и т.д. и ScaleX(), ScaleY(). Правильно? »

Всё правильно, но если нужно просто изменить расположение стандартных компонентов, хватит того, что просто указать Top и Left, так как они не создаются заново, а мы только изменяем их расположение на форме... Да и как говорят, для развития, ScaleX или ScaleY
Цитата:

Цитата из Справки
Берет координату X (или ширину) и возвращает значение в масштабе шрифта текущего диалогового окна. Если шрифт MS Sans Serif размером 8 и Windows у пользователя запущена с опцией Мелкий шрифт (96 dpi), то X будет возвращен без изменений.

P.S.
Drongo, в примере вы два раза указали значение Top, я думаю это опечатка для примера?
WizardForm.FilenameLabel.Top := ScaleY(330);
WizardForm.FilenameLabel.Top := ScaleY(430);
Вообще сработает последнее значение. Нет, точнее сработают оба, но результат вывода будет по последнему значению... :wink:

Drongo 17-04-2009 21:12 1097076

Цитата:

Цитата Serega_
в примере вы два раза указали значение Top, я думаю это опечатка для примера? »

Издержки Copy\Paste. Скопировать скопировал, но изменить забыл, имелось ввиду X и Y
Цитата:

Цитата Serega_
Да и как говорят, для развития, ScaleX или ScaleY »


Serega 17-04-2009 21:40 1097100

Drongo, X - ширена, Y- высота... всё как в математике... :wink:, т.е. смещение по вертикали Y (ScaleY - Top, Height), смещение по горизонтали X (ScaleX - Width, Left).

P.S.
Нашёл на просторах своего винчестера скрипт, который показывает изменение координат стандартных компонентов, я думаю, пригодится как наглядный пример работы с компонентами.
скрипт
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[_Code]
Procedure InitializeWizard();
begin
  with WizardForm do
  begin
    Position:= poScreenCenter
    ClientWidth:= 690
    ClientHeight:= 496
    Font.Color:= clWindow
    Font.Name:= 'MS Sans Serif'
    Font.Style:= []
    with Bevel do
    begin
      Left:=0
      Top:=313
      Width:=497
      Height:=2
      Visible:=False
    end;
    with CancelButton do
    begin
      Left:=600
      Top:=462
      Width:=77
      Height:=25
      BringToFront
    end;
    with NextButton do
    begin
      Left:=375
      Top:=462
      Width:=77
      Height:=25
      BringToFront
    end;
    with BackButton do
    begin
      Left:=293
      Top:=462
      Width:=77
      Height:=25
      BringToFront
    end;
    with OuterNotebook do
    begin
      Left:=0
      Top:=0
      Width:=690
      Height:=496
    end;
    with MainPanel do
    begin
      Left:=0
      Top:=0
      Width:=690
      Height:=496
      Color:=clWindow
      with WizardSmallBitmapImage do
      begin
        Left:=0
        Top:=0
        Width:=690
        Height:=496
        BackColor:=clWindow
      end;
      with PageDescriptionLabel do
      begin
        Left:=25
        Top:=25
        Width:=500
        Height:=14
        Color:=6697728
        Font.Color:=clWindow
      end;
      with PageNameLabel do
      begin
        Left:=15
        Top:=7
        Width:=500
        Height:=14
        Color:=6697728
        Font.Color:=clWindow
      end;
    end;
    with BeveledLabel do
    begin
      Left:=10
      Top:=468
      Width:=150
      Height:=14
      Enabled:=False
      Color:=14405068
    end

  // страница приветствия wpWelcome
    with WelcomePage do
    begin
      Color:=11232829
      with WizardBitmapImage do
      begin
        Left:=0
        Top:=0
        Width:=690
        Height:=496
      end
      with WelcomeLabel2 do
      begin
        Left:=205
        Top:=230
        Width:=465
        Height:=200
      end
      with WelcomeLabel1 do
      begin
        Left:=205
        Top:=190
        Width:=465
        Height:=28
        Font.Color:=clWindow
        Font.Size:=8
      end
    end
    with InnerPage do
    begin
      with Bevel1 do
      begin
        Left:=0
        Top:=58
        Width:=499
        Height:=3
        Visible:=False
      end
      with InnerNotebook do
      begin
        Left:=205
        Top:=79
        Width:=465
        Height:=354
        BringToFront
        Color:=11232829
      end;
    end;
  // страница лицензии wpLicense
    with LicensePage do
    begin
      with LicenseNotAcceptedRadio do
      begin
        Left:=0
        Top:=338
        Width:=465
        Height:=17
        Checked:=True
      end
      with LicenseAcceptedRadio do
      begin
        Left:=0
        Top:=318
        Width:=465
        Height:=17
      end
      with LicenseMemo do
      begin
        Left:=0
        Top:=38
        Width:=465
        Height:=266
        ReadOnly:=True
        ScrollBars:=ssVertical
      end
      with LicenseLabel1 do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=28
      end
    end
  // страница пароля wpPassword
    with PasswordPage do
    begin
      with PasswordEdit do
      begin
        Left:=0
        Top:=50
        Width:=465
        Height:=21
        Font.Color:=clWindowText
      end
      with PasswordEditLabel do
      begin
        Left:=0
        Top:=34
        Width:=465
        Height:=14
      end
      with PasswordLabel do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=28
      end
    end
  // информация перед установкой wpInfoBefore
    with InfoBeforePage do
    begin
      with InfoBeforeMemo do
      begin
        Left:=0
        Top:=24
        Width:=465
        Height:=327
        ScrollBars:=ssVertical
      end
      with InfoBeforeClickLabel do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=14
      end
    end
  // страница информация о пользователе wpUserInfo
    with UserInfoPage do
    begin
      with UserInfoSerialEdit do
      begin
        Left:=0
        Top:=120
        Width:=465
        Height:=21
        Font.Color:=clWindowText
      end
      with UserInfoSerialLabel do
      begin
        Left:=0
        Top:=104
        Width:=465
        Height:=14
      end
      with UserInfoOrgEdit do
      begin
        Left:=0
        Top:=68
        Width:=465
        Height:=21
        Font.Color:=clWindowText
      end
      with UserInfoOrgLabel do
      begin
        Left:=0
        Top:=52
        Width:=465
        Height:=14
      end
      with UserInfoNameEdit do
      begin
        Left:=0
        Top:=16
        Width:=465
        Height:=21
        Font.Color:=clWindowText
      end
      with UserInfoNameLabel do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=14
      end
    end
  // страница выбора директории wpSelectDir
    with SelectDirPage do
    begin
      with SelectDirBitmapImage do
      begin
        Left:=0
        Top:=0
        Width:=32
        Height:=32
        Visible:=False
      end
      with DiskSpaceLabel do
      begin
        Left:=0
        Top:=340
        Width:=465
        Height:=14
      end
      with DirBrowseButton do
      begin
        Left:=388
        Top:=288
        Width:=77
        Height:=25
      end
      with DirEdit do
      begin
        Left:=0
        Top:=290
        Width:=378
        Height:=21
        Font.Color:=clWindowText
      end
      with SelectDirBrowseLabel do
      begin
        Left:=0
        Top:=24
        Width:=465
        Height:=28
      end
      with SelectDirLabel do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=14
      end
    end
  // страница компонентов wpSelectComponents
    with SelectComponentsPage do
    begin
      with ComponentsDiskSpaceLabel do
      begin
        Left:=0
        Top:=340
        Width:=417
        Height:=14
      end
      with ComponentsList do
      begin
        Left:=0
        Top:=48
        Width:=465
        Height:=275
        Font.Color:=clWindow
        Color:=11232829
      end
      with TypesCombo do
      begin
        Left:=0
        Top:=24
        Width:=465
        Height:=21
        Font.Color:=clWindow
        Color:=11232829
      end
      with SelectComponentsLabel do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=14
      end
    end
  // страница выбора программной группы меню Пуск wpSelectProgramGroup
    with SelectProgramGroupPage do
    begin
      with SelectGroupBitmapImage do
      begin
        Left:=0
        Top:=0
        Width:=32
        Height:=32
        Visible:=False
      end
      with NoIconsCheck do
      begin
        Left:=0
        Top:=337
        Width:=465
        Height:=17
      end
      with GroupBrowseButton do
      begin
        Left:=388
        Top:=288
        Width:=77
        Height:=25
      end
      with GroupEdit do
      begin
        Left:=0
        Top:=290
        Width:=378
        Height:=21
        Font.Color:=clWindowText
      end
      with SelectStartMenuFolderBrowseLabel do
      begin
        Left:=0
        Top:=24
        Width:=465
        Height:=28
      end
      with SelectStartMenuFolderLabel do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=14
      end
    end
  // страница выбора дополнительных задач wpSelectTasks
    with SelectTasksPage do
    begin
      with TasksList do
      begin
        Left:=0
        Top:=34
        Width:=465
        Height:=317
        Color:=11232829
      end
      with SelectTasksLabel do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=28
      end
    end
  // страница Всё готово к установке wpReady
    with ReadyPage do
    begin
      with ReadyMemo do
      begin
        Left:=0
        Top:=34
        Width:=465
        Height:=317
        Color:=11232829
      end
      with ReadyLabel do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=28
      end
    end
  // без коментариев, просто я её никогда не видел... ;) wpPreparing {видимо в бане парится постоянно, когда я компилирую}
    with PreparingPage do
    begin
      with PreparingErrorBitmapImage do
      begin
        Left:=0
        Top:=0
        Width:=16
        Height:=16
        Visible:=False
      end
      with PreparingLabel do
      begin
        Left:=24
        Top:=0
        Width:=393
        Height:=14
        Visible:=False
      end
    end
  // страница Установки wpInstalling
    with InstallingPage do
    begin
      with FilenameLabel do
      begin
        Left:=0
        Top:=16
        Width:=465
        Height:=16
      end
      with StatusLabel do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=16
      end
      with ProgressGauge do
      begin
        Left:=0
        Top:=42
        Width:=465
        Height:=21
        Min:=0
        Max:=100
      end
    end
  // страница информации после установки wpInfoAfter
    with InfoAfterPage do
    begin
      with InfoAfterMemo do
      begin
        Left:=0
        Top:=24
        Width:=465
        Height:=327
        ScrollBars:=ssVertical
      end
      with InfoAfterClickLabel do
      begin
        Left:=0
        Top:=0
        Width:=465
        Height:=14
      end
    end
  // финальная страница wpFinished
    with FinishedPage do
    begin
      Color:=11232829
      with WizardBitmapImage2 do
      begin
        Left:=0
        Top:=0
        Width:=690
        Height:=496
      end;
      with NoRadio do
      begin
        Left:=205
        Top:=227
        Width:=465
        Height:=17
      end;
      with YesRadio do
      begin
        Left:=205
        Top:=199
        Width:=465
        Height:=17
      end;
      with RunList do
      begin
        Left:=205
        Top:=199
        Width:=465
        Height:=149
        BorderStyle:=bsNone
      end;
      with FinishedLabel do
      begin
        Left:=205
        Top:=119
        Width:=465
        Height:=53
      end;
      with FinishedHeadingLabel do
      begin
        Left:=205
        Top:=79
        Width:=465
        Height:=24
        Font.Color:=clWindow
        Font.Size:=8
      end;
    end
  end
end;


tem000 19-04-2009 16:05 1098248

Вложений: 1
Русская версия Inno Setup Compiler 5.2.3 (ISPP 5.2.3.0) от ResTools


Русская версия расширенной версии Inno Setup от ResTools. За основу был взят перевод от Inno Setup 5.2.3 RU из шапки, в настройках программы не перевел некоторые функции, не понял для чего они нужны поэтому не смог правильно сформулировать и оставил без перевода. Короче перевод проги процентов 80, если где некорректный перевод пишите исправлю.

Serega 19-04-2009 17:05 1098270

tem000, спасибо, вроде на первый взгляд ошибок не увидел, но если что, то напишу...

P.S.
Скажу по своему опыту, некоторые вещи от перевода, теряют свою суть и понимание процесса...

tem000 19-04-2009 17:25 1098276

Цитата:

Цитата Serega_
P.S.
Скажу по своему опыту, некоторые вещи от перевода, теряют свою суть и понимание процесса... »

Serega_, есть такая фигня, я делал перевод в основном для себя не могу сидеть на прогах с англиским интерфейсом как то напрягает. В расширенной версии оказалось много полезных функций и работать в ней как то камфортней что ли. А вообще старался более правильно и доходчиво передать смысл. Единственное не перевел до конца мастера, там при правке сообщений в теле программы прога начинала выдавать ошибки что ни есть гуд. Поэтому оставил как есть, лучше рабочая но не до конца русифицированная, чем полностью русская но не рабочая. :teeth:

Serega 19-04-2009 17:54 1098292

Цитата:

Цитата tem000
есть такая фигня, я делал перевод в основном для себя не могу сидеть на прогах с англиским интерфейсом как то напрягает. В расширенной версии оказалось много полезных функций и работать в ней как то комфортней что ли. А вообще старался более правильно и доходчиво передать смысл. Единственное не перевел до конца мастера, там при правке сообщений в теле программы прога начинала выдавать ошибки что ни есть гуд. Поэтому оставил как есть, лучше рабочая но не до конца русифицированная, чем полностью русская но не рабочая. »

Большое вам спаибо за перевод, но между нами, я постоянно перевожу часть Дополнительных апплет панели управления (аддон от prokazzza), в самом начале, это был мой, своего рода протест против английского языка... Со временем я начал понимать суть фраз просто пробежавшись по тексту, а потом я понял, что перевод - это один из способов изучения иностранного языка... ;)

volk1234 19-04-2009 19:33 1098353

А кроме всего прочего, перевод программы это еще и способ изучить программу лучше, чем другие пользователи :)
Я перевожу Locate32 и раньше переводил Notepad2... так что знаю что говорю :)
Перевод поднимаю в шапку.

tem000
Пожалуйста в дальнейшем правьте первоначальный пост #639 , подробности в РМ.
И еще давайте пишите сюда, что вам непонятно - давайте вместе допереведем...

ForestDron 20-04-2009 11:43 1098839

Пацаны пожалуста помогите НУБУ, как удалить после установки инсталятора эти файлы: Sounds.exe,Video.exe,Music.exe,Resources.exe.
За ранее спасибо :)


Код:


[Setup]
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
DefaultDirName=C:\Program Files\T34vsTiger
DefaultGroupName={#MyAppName}
OutputDir=C:\Documents and Settings\Äðîí\Ðàáî÷èé ñòîë
OutputBaseFilename=setup2
Compression=lzma/ultra64
SolidCompression=yes
WizardImageFile=D:\Games\T34vsTiger.bmp
ShowComponentSizes=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "D:\Games\T34vsTiger\T34.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Games\T34vsTiger\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\Games\T34vsTiger\Sounds.exe"; DestDir: "{app}"; Flags: deleteafterinstall nocompression
Source: "D:\Games\T34vsTiger\Video.exe"; DestDir: "{app}"; Flags: deleteafterinstall nocompression
Source: "D:\Games\T34vsTiger\Music.exe"; DestDir: "{app}"; Flags: deleteafterinstall nocompression
Source: "D:\Games\T34vsTiger\Resources.exe"; DestDir: "{app}"; Flags: deleteafterinstall nocompression


[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}";WorkingDir: "{app}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
Filename: "{app}\Sounds.exe"; Parameters: "-y";StatusMsg: "Èä¸ò ðàñïàêîâêà ôàéëîâ"; Flags: waituntilterminated;
Filename: "{app}\Video.exe"; Parameters: "-y";StatusMsg: "Èä¸ò ðàñïàêîâêà ôàéëîâ"; Flags: waituntilterminated;
Filename: "{app}\Music.exe"; Parameters: "-y";StatusMsg: "Èä¸ò ðàñïàêîâêà ôàéëîâ"; Flags: waituntilterminated;
Filename: "{app}\Resources.exe"; Parameters: "-y";StatusMsg: "Èä¸ò ðàñïàêîâêà ôàéëîâ"; Flags: waituntilterminated;


Serega 20-04-2009 12:28 1098890

ForestDron, надо так:
читать дальше »
Код:

.......................................
[Files]
Source: D:\Games\T34vsTiger\T34.exe; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\T34vsTiger\*; DestDir: {app}; Excludes: Sounds.exe, Video.exe, Music.exe, Resources.exe; Flags: ignoreversion recursesubdirs createallsubdirs
Source: D:\Games\T34vsTiger\Sounds.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall nocompression
Source: D:\Games\T34vsTiger\Video.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall nocompression
Source: D:\Games\T34vsTiger\Music.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall nocompression
Source: D:\Games\T34vsTiger\Resources.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall nocompression
.......................................


ForestDron 20-04-2009 14:39 1099007

Serega Братка помог отдуши,просто человеческое спасибо :bow:

Sserss 21-04-2009 23:00 1100447

Нужна помощь плиз.При большом (1.7 Гб) компилируемом фале после компиляции не отображается иконка Setupa заданная в SetupIconFile=ххххх.ico. При компиляции файла например 170 Мб все нормально заданная иконка отображается. :dont-know

Serega 21-04-2009 23:19 1100464

Цитата:

Цитата Sserss
При большом (1.7 Гб) компилируемом фале после компиляции не отображается иконка Setupa заданная в SetupIconFile=ххххх.ico. »

Это связано с большим размером инсталлятора, выход из ситуации, это использовать внешние файлы. Можно в виде архивов, т.е. сохраняете архив рядом с инсталлятором. При установке ваш инсталлятор копирует архив в папку назначения, распаковывает и затем удаляет этот архив.

Sserss 21-04-2009 23:42 1100483

Спасибо за помощь! Но я не представляю как это воплотить, не знаю какие команды должны быть в скрипте для распаковки и удаления архива.А архив какой 7zip,RAR или Zip.
Пример бы какой нибудь если Вам нетрудно.

Serega 21-04-2009 23:55 1100497

Устанавливаем 7z SFX архив в папку с программой, запускаем его и удаляем после выполнения.
читать дальше »
Код:

[Components]
Name: "eng"; Description: "Английская версия";  Flags: exclusive
Name: "rus"; Description: "Русская версия";  Flags: exclusive

[Types]
Name: "custom"; Description: "Выборочная установка"; Flags: iscustom

[Files]
Source: "D:\GAME\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Components: rus; Source: "{src}\Rus\GAME_RUS.exe"; DestDir: "{app}"; Flags: ignoreversion external deleteafterinstall

[Run]
Filename: "{app}\GAME_RUS.exe"; WorkingDir: "{app}"; Parameters: "-y"; StatusMsg: "Процесс русификации..."; Flags: waituntilterminated skipifdoesntexist


Запуск 7z SFX архива из секции Code
читать дальше »
Код:

[Setup]
AppName=Need for Speed - Carbon
AppVerName=Need for Speed - Carbon v1.3
DefaultDirName={sd}\Games\NFSCarbon

[Components]
Name: eng; Description: Английская версия; Flags: exclusive
Name: rus; Description: Русская версия; Flags: exclusive

[Types]
Name: custom; Description: Выборочная установка; Flags: iscustom

[Files]
Source: D:\NFSCarbon\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs

[Run]
Filename: {src}\Rus\NFSC_RUS.exe; Components: rus; WorkingDir: {src}\Rus; Parameters: "-y -o""{app}"""; StatusMsg: Установка русификации...; Flags: waituntilterminated

[_Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  res:Integer;
  app, arc, dest:string;
begin
  If CurStep=ssPostInstall then
  begin
    app:=ExpandConstant('{src}')+'\7za.exe'; // консольная утилита 7z
    arc:=ExpandConstant('{src}')+'\ARC.7z';  // сам архив
    dest:=ExpandConstant('{app}');          // путь распаковки
    Exec(app, 'x "'+ arc + '" -y -o"'+ dest + '"', '', SW_SHOWNORMAL, ewWaitUntilTerminated, res);//ключи командной строки 7z
  end;
end;


Sserss 22-04-2009 00:00 1100504

Спасибо огромное за быстрый ответ. Попробую разобраться.

BlackSelf 01-05-2009 06:09 1108388

Здравствуйте. Появилось ещё пару вопросов.
1. Как поставить прозрачность на секцию messages (чтобы текст отображался, а фон этого текста стал прозрачным)? И возможно ли это?
2. Вставил проигрывание музыки в инсталл. Нужно создать кнопку пауза/проигрывание. Подскажите, как это сделать.
3. В общем, возможно ли сделать следующее: при распаковке архивов фриарка во временной папке создавать лог. А из него как-нибудь брать проценты распаковки и выводить их на прогресс-бар?

Serega 01-05-2009 08:12 1108401

BlackSelf,
1. В сообщение проблема установить свой рисунок, не говоря уже о прозрачности, но можно попробовать создать новую форму, а уже её попытаться сделать полупрозрачной, но даже и при таком раскладе не получится сделать видимым один текст... т.е. чем прозрачней форма, тем тусклее текст.

2. Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.mycompany.com
AppSupportURL=http://www.mycompany.com
AppUpdatesURL=http://www.mycompany.com
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Files]
Source: compiler:Libraries\BASSMOD.dll; Flags: dontcopy
; указываем музыку, которую надо проиграть
Source: mattis-lowsi_jeti_maah.mod; Flags: dontcopy

[_Code]
const
  BASS_MUSIC_RAMP        = 1;      // normal ramping (only for Fast Tracker .xm)
  BASS_MUSIC_RAMPS        = 2;      // sensitive ramping (only for Fast Tracker .xm)
  BASS_MUSIC_LOOP        = 4;      // loop music
  BASS_MUSIC_FT2MOD      = 16;    // play .MOD as FastTracker 2 does
  BASS_MUSIC_PT1MOD      = 32;    // play .MOD as ProTracker 1 does
  BASS_MUSIC_SURROUND            = 512;    // surround sound
  BASS_MUSIC_SURROUND2          = 1024;  // surround sound (mode 2)

function BASSMOD_Init(device: Integer; freq, flags: DWORD): Boolean;
  external 'BASSMOD_Init@files:BASSMOD.dll stdcall delayload';

procedure BASSMOD_MusicFree();
  external 'BASSMOD_MusicFree@files:BASSMOD.dll stdcall delayload';
 
function BASSMOD_MusicLoad(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): Boolean;
  external 'BASSMOD_MusicLoad@files:BASSMOD.dll stdcall delayload';

function BASSMOD_MusicPlay(): Boolean;
  external 'BASSMOD_MusicPlay@files:BASSMOD.dll stdcall delayload';

function BASSMOD_MusicGetPosition(): Boolean;
  external 'BASSMOD_MusicGetPosition@files:BASSMOD.dll stdcall delayload';

function BASSMOD_MusicStop(): Boolean;
  external 'BASSMOD_MusicStop@files:BASSMOD.dll stdcall delayload';

function BASSMOD_MusicPause(): Boolean;
  external 'BASSMOD_MusicPause@files:BASSMOD.dll stdcall delayload';

procedure BASSMOD_Free();
external 'BASSMOD_Free@files:BASSMOD.dll stdcall delayload';

procedure PlayButtonOnClick(Sender: TObject);
var
  Name1: string;
begin
  if not BASSMOD_MusicPlay then begin
    Name1:=ExpandConstant('{tmp}\mattis-lowsi_jeti_maah.mod');
    if BASSMOD_MusicLoad(FALSE, PChar(Name1), 0, 0, 4 or 512 or 32 or 1) then
    BASSMOD_MusicPlay;
  end;
end;

procedure PauseButtonOnClick(Sender: TObject);
begin
  BASSMOD_MusicPause;
end;

procedure StopButtonOnClick(Sender: TObject);
begin
  BASSMOD_MusicStop;
  BASSMOD_MusicFree;
end;

procedure InitializeWizard();
var
  Name1: string;
  PlayButton, PauseButton, StopButton, RewButton: TButton;
  Text: TNewStaticText;
  Panel1: TPanel;
begin
  // распаковываем BASSMOD.dll во временную папку
  ExtractTemporaryFile(ExpandConstant('BASSMOD.dll'));
  // распаковываем mattis-lowsi_jeti_maah.mod во временную папку
  ExtractTemporaryFile(ExpandConstant('mattis-lowsi_jeti_maah.mod'));

  if not BASSMOD_Init(-1,44100,0) then begin
    MsgBox('BASSMOD не смогла инициализироваться, проигрывание музыки невозможно.', mbInformation, MB_OK)
    BASSMOD_Free;
  end;

  Name1:= ExpandConstant('{tmp}\mattis-lowsi_jeti_maah.mod');
  BASSMOD_MusicFree;
  if BASSMOD_MusicLoad(FALSE, PChar(Name1), 0, 0, BASS_MUSIC_LOOP or BASS_MUSIC_SURROUND) then
  BASSMOD_MusicPlay;

// создаём панель, на которой будут отбражаться кнопки
  Panel1 := TPanel.Create(WizardForm);
  with Panel1 do begin
    Parent := WizardForm;
    Left := ScaleX(1);
    Top := ScaleY(315);
    Width := ScaleX(165);
    Height := ScaleY(46);
    TabOrder := 0;
    Color := clWhite;
    BevelInner := bvLowered;
    BevelOuter:= bvRaised;
    BorderStyle := bsSingle;
  end;
// создаём три кнопки PlayButton, PauseButton, StopButton и текст Text
  PlayButton := TButton.Create(WizardForm);
  with PlayButton do begin
    Left := 5;
    Top := 335;
    Width := 50;
    Height := 20;
    Caption := 'игра';
    OnClick := @PlayButtonOnClick;
    Parent := WizardForm;
    Cursor := crHand;
    Hint := 'Воспроизведение музыки';
    ShowHint := True;
  end;
 
  PauseButton := TButton.Create(WizardForm);
  with PauseButton do begin
    Left := 58;
    Top := 335;
    Width := 50;
    Height := 20;
    Caption := 'пауза';
    OnClick := @PauseButtonOnClick;
    Parent := WizardForm;
    Cursor := crHand;
    Hint := 'Приостановить музыку';
    ShowHint := True;
  end;
 
  StopButton := TButton.Create(WizardForm);
  with StopButton do begin
    Left := 111;
    Top := 335;
    Width := 50;
    Height := 20;
    Caption := 'cтоп';
    OnClick := @StopButtonOnClick;
    Parent := WizardForm;
    Cursor := crHand;
    Hint := 'Остановить музыку';
    ShowHint := True;
  end;
 
  Text := TNewStaticText.Create(WizardForm);
  with Text do begin
    Caption := 'музыка инсталлятора';
    Parent := WizardForm;
    Font.Style := Text.Font.Style + [fsUnderline];
    Font.Color := clNavy;
    Top := 319;
    Left :=26;
    Color := clWhite;
  end;
end;


3. Не знаю, я с фриарком не знаком.
Мне интересно, что так все носятся с этим фриарком? Мне кажется 7z пакует намного лучше...
Если интересно, в этом сообщении я выкладывал ссылку на библиотеку is7z.dll, для показа хода распаковки 7z архивов во втором прогрессбаре.

BlackSelf 01-05-2009 20:48 1108753

Serega_, спасибо.
А насчет фриарка: он пакует лучше, поэтому я предпочитаю работать именно с ним.

Drongo 01-05-2009 21:08 1108776

Привет, я с таким вопросом снова, нужно сделать, чтобы менялись картинки скриншотов
Цитата:

Цитата Drongo
а менялись, скажем, после каждых пяти процентов установленной игры? »

Или по какому-то алгоритму, чтобы 26 картинок, не повторялись, а общие 100 % установки делились на 25-26 и менялись бы с интервалом, в 4 %
Цитата:

Цитата Serega_
там единственное идёт показ по времени, где-то у меня был пример по процентам, поищу... »

Это не критично и не срочно. Если есть такой код - хорошо, нет - ничего страшного.

BlackSelf 01-05-2009 22:12 1108829

Drongo, если я правильно понял, то тебе нужно слайдшоу по процентам установки.
Вот пример с тремя картинками. Думаю, будет понятно, как поставить 25 картинок.
Пример
[Setup]
AppName=My Program
AppVerName=My Program
CreateAppDir=No
WindowVisible=Yes

[Files]
Source: innocallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: pic1.bmp; DestDir: {tmp}; Flags: dontcopy
Source: pic2.bmp; DestDir: {tmp}; Flags: dontcopy
Source: pic3.bmp; DestDir: {tmp}; Flags: dontcopy

[code]
type
TProc=procedure(HandleW, msg, idEvent, TimeSys: LongWord);
var
BackgroundBitmapImage: TBitmapImage;
TimerID: LongWord;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';
function GetSystemMetrics(nIndex:Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';

procedure InitializeWizard();
begin
ExtractTemporaryFile('pic1.bmp')
ExtractTemporaryFile('pic2.bmp')
ExtractTemporaryFile('pic3.bmp')
end;

function PercentProgress(): Integer;
begin
with WizardForm.ProgressGauge do begin
Result:=(Position-Min)/((Max - Min)/100)
end
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
percent: integer;
begin
percent:=PercentProgress
with BackgroundBitmapImage do begin
if ((percent>0) and (percent<33) and (Tag<>1)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\pic1.bmp')
Tag:=1
end else
if ((percent>34) and (percent<66) and (Tag<>2)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\pic2.bmp')
Tag:=2
end else
if ((percent>67) and (percent<100) and (Tag<>3)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\pic3.bmp')
Tag:=3
end
end
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
Width, Height: Integer;
begin
If CurPageID=wpInstalling
then
begin
pfunc:=WrapTimerProc(@OnTimer, 4)
TimerID:=SetTimer(0, 0, 500, pfunc)
BackgroundBitmapImage:=TBitmapImage.Create(MainForm)
with BackgroundBitmapImage do begin
BackColor:=clBlack
Center:=True
Align:=alClient
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\pic1.bmp')
Parent:=MainForm
Tag:=1
end
end
if CurPageID=wpFinished
then
begin
BackgroundBitmapImage.Hide
end
end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID)
end;

tem000 01-05-2009 22:35 1108848

Serega_, подскажи пожалуйста если знаешь, как в свойствах ярлыка прописать вот эти пункты
смысл такой программа имеет один файл .exe, но в ней имеется как бы еще одна программа ссылающаяся на тот же файл, обе программы можно запустить как 2 отдельных процесса через 2 разных ярлыка, но для этого в свойствах ярлыка надо прописывать то что на скрине. Как это сделать???

boss911 01-05-2009 23:08 1108874

tem000

Код:

[Icons]
Name: {userdesktop}\IrfanView 3.95; Filename: {app}\i_view32.exe; Parameters: /thumba; WorkingDir: {app}; Comment: IrfanView - Thumbnails

{userdesktop} - путь к папке рабочего стола текущего пользователя.
{userprograms} - путь к папке Программы меню Пуск текущего пользователя.

tem000 02-05-2009 00:22 1108915

boss911, спасибо помогло все работает, но еще вопрос теперь на столе появляются две абсолютно одинаковые иконки, хотя у этих 2 программ они разные, и в .exe файле есть своя иконка для второго приложения. Короче при инсталяции на рабочем столе в свойствах ярлыка приходится менять иконку на другую. Откуда можно выковырять насторйки какой значек отображать на рабочем столе?

Serega 02-05-2009 01:14 1108928

tem000,
Код:

[Icons]
Name: {userdesktop}\IrfanView 3.95; Filename: {app}\i_view32.exe; Parameters: /thumba; WorkingDir: {app}; Comment: IrfanView - Thumbnails; IconFilename: {app}\i_view32.exe; IconIndex: 0

IconFilename - Имя файла иконки (расположенной в системе пользователя). Это может быть изображение с расширением .exe или .dll, содержащее иконки, или файл .ico;
IconIndex - индекс иконки, если не указывать, то по умолчанию 0.

tem000 02-05-2009 01:31 1108936

Serega_, УРА!!! заработало пасибо огромное господа программеры за помощь!!! :laugh:

PS. Мдя, называется век живи - век учись!!!

BlackSelf 02-05-2009 04:09 1108970

Serega_, хотел бы вернуться к своему вопросу по поводу фриарка.
Создается вот такой лог:
Лог

FreeArc 0.50 alpha (June 23 2008) extracting archive: archive.arc
Extracting 28 files, 1.878.921.539 bytes. Processed 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 1.9% 2.5% 3.5% 4.5% 4.8% 5.5% 5.8% 6.1% 6.2% 6.4% 7.0% 7.9% 8.7% 8.9% 9.2% 9.8% 10.2% 10.3% 10.9% 11.6% 12.1% 12.6% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 14.1% 14.3% 15.1% 15.1% 15.5% 15.7% 15.8% 16.5% 17.5% 17.8% 18.4% 18.9% 19.2% 19.6% 20.2% 20.5% 21.6% 21.9% 22.9% 23.3% 23.8% 24.1% 24.2% 24.9% 25.1% 25.8% 26.3% 26.8% 27.2% 27.6% 27.8% 28.4% 28.5% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 30.2% 30.6% 32.5% 33.4% 33.9% 35.0% 35.5% 36.5% 37.1% 37.5% 37.9% 38.6% 38.8% 39.4% 40.1% 40.6% 41.0% 41.6% 42.0% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 43.2% 44.6% 45.3% 46.3% 46.7% 47.3% 48.5% 48.9% 49.6% 50.1% 50.8% 51.3% 51.7% 52.4% 53.3% 53.3% 54.6% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 55.7% 56.9% 58.0% 59.0% 59.6% 60.5% 61.1% 61.3% 61.9% 62.3% 62.9% 63.6% 64.2% 65.1% 65.4% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 67.1% 67.6% 68.5% 68.9% 69.8% 70.3% 71.4% 72.2% 72.6% 73.2% 74.0% 74.6% 75.4% 75.9% 76.8% 77.2% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 78.2% 79.9% 80.0% 80.3% 81.1% 82.3% 83.0% 83.2% 83.4% 83.5% 84.6% 85.4% 86.5% 86.9% 86.9% 87.1% 87.7% 87.9% 88.1% 88.1% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 90.0% 90.6% 90.8% 92.1% 92.9% 93.9% 94.6% 95.5% 96.5% 96.8% 97.4% 97.6% 98.3% 99.5% 99.6% 99.6% 99.6% 99.6% 99.7%

Extracted 28 files, 529.994.251 => 1.878.921.539 bytes. Ratio 28.2%
Extraction time 53.06 secs, speed 35.414 kB/s. Total 160.86 secs
All OK

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

procent$=StrFromFile(file$,1,-1)
position=LEN(procent$)
position$=StrGet(procent$,position)
If (position$='%') Then
procent_bar$=''
position=position-5
procent_bar$=procent_bar$+StrGet(procent$,position)
position=position+1
procent_bar$=procent_bar$+StrGet(procent$,position)
position=position+1
procent_bar$=procent_bar$+StrGet(procent$,position)
position=position+1
procent_bar$=procent_bar$+StrGet(procent$,position)
position=position+1
procent_bar$=procent_bar$+StrGet(procent$,position)
position=position+1
procent_bar$=procent_bar$+StrGet(procent$,position)
newbar=VAL(procent_bar$)
shownprogress=INT(newbar)
newbar=newbar+diskscount
procent$=CHAR(newbar)

Serega 02-05-2009 14:08 1109112

BlackSelf, сразу несколько вопросов.
Вы говорите создаётся лог, когда? В процессе распаковки или вы его распаковываете из инсталлятора во время установки?

Видите ли, если можно было бы определить скорость распаковки архива на машине конкретного пользователя до распаковки основного архива. Скажем во время запуска инсталлятора, запускаем небольшой тестовый архив, с сохранением лога, из которого получаем скорость распаковки архива на данной машине, тогда можно прикинуть приблизительную скорость распаковки основного архива, высчитав пропорцией...
Уже в соответствии с этим двигать прогрессбар…

BlackSelf 02-05-2009 14:15 1109115

Serega_, лог создается в процессе распаковки архива с постоянным обновлением информации о процентах. Поэтому хотелось бы, чтобы инно постоянно обращался к этому файлу и брал оттуда данные о процентах.

Serega 02-05-2009 14:21 1109118

BlackSelf, где создаётся, в {app}, т.е. в папке куда устанавливаем программу?

BlackSelf 02-05-2009 14:25 1109120

Serega_, в принципе, можно и в {app}, можно и в {tmp}. Допустим, что в {app}.

Serega 03-05-2009 08:33 1109491

BlackSelf, напишите пример команд, упаковки и распаковки архива с ведением лога. Скачал FreeArc, а чего-то разобраться не могу, как вызвать сохранение лога...
Наброски по движению прогрессбара есть, нужно протестировать работоспособность кода...

Unsane 03-05-2009 11:38 1109545

Доброе время суток.
В [Components] есть несколько пунктов с флагом exclusive, отвечающих за язык устанавливаемого приложения. Можно ли автоматом отмечать пункт, язык которого совпадает с языком установщика(выбирается при запуске)?

Serega 03-05-2009 12:31 1109567

Цитата:

Цитата Unsane
несколько пунктов с флагом exclusive, отвечающих за язык устанавливаемого приложения. Можно ли автоматом отмечать пункт, язык которого совпадает с языком установщика(выбирается при запуске)? »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
ComponentsListTVStyle=true

[Languages]
Name: eng; MessagesFile: compiler:Languages\English.isl
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: a\a; Description: Руководство пользователя; Types: full
Name: a\a\a; Description: Русский; Languages: rus; Flags: exclusive
Name: a\a\b; Description: English; Languages: eng; Flags: exclusive
Name: a\b; Description: Справка; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\Readme-ru.txt; DestDir: {app}; Components: a\a\a
Source: compiler:Examples\Readme-en.txt; DestDir: {app}; Components: a\a\b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a\b


Unsane 03-05-2009 12:56 1109583

Serega_, это немного не то.. При выборе русского языка, пункт "Руководство пользователя\English" не будет показан пользователю, а надо, чтобы были показаны все языки, но "галка" стояла на том, который выбран как язык инсталлятора..

Serega 03-05-2009 14:41 1109646

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

BlackSelf 04-05-2009 05:30 1110140

Serega_, при создании архива лог не нужен, но всё же:
Упаковка:
arc create archive -mx -ld=192m folder\* >log.txt
Распаковка:
arc x archive.arc -y -s2 -dp >log.txt
Лог будет создаваться рядом с arc.exe

p3rf3ct1c 04-05-2009 19:38 1110649

Здравствуйте! Можете помоч, как сделать вот такое?

Типо это обязательно для установки. Чтобы нельзя было снять галочку.

boss911 04-05-2009 20:35 1110689

Цитата:

Цитата p3rf3ct1c
Чтобы нельзя было снять галочку. »

Код:

[Tasks]
Name: DirectXUpd; Description: Обновить DirectX; GroupDescription: Системные задачи:

[_Code]
procedure CurPageChanged(CurPageID: Integer);
  begin
    if CurPageID = wpSelectTasks then
    WizardForm.TasksList.ItemEnabled[X]:= False;
end;

ItemEnabled[X] - здесь нужно указать цифру (см. ниже), порядковый номер строки на странице выбора задач (TasksList), отсчет идет сверху и начинается с 0 (нуля). Судя, по-вашему скриншоту, порядковый номер чекбокса, который нужно заблокировать, это 4.

p3rf3ct1c 04-05-2009 21:29 1110721

Цитата:

Цитата boss911
Код:
[Tasks]
Name: DirectXUpd; Description: Обновить DirectX; GroupDescription: Системные задачи:
[_Code]
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectTasks then
WizardForm.TasksList.ItemEnabled[X]:= False;
end;
ItemEnabled[X] - здесь нужно указать цифру (см. ниже), порядковый номер строки на странице выбора задач (TasksList), отсчет идет сверху и начинается с 0 (нуля). Судя, по-вашему скриншоту, порядковый номер чекбокса, который нужно заблокировать, это 4. »

Спасибо вам! Все получилось.
Можно еще вопрос? Можете подсказать как правильно склеивать коды? Например вот
читать дальше »

Код:

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectTasks then
WizardForm.TasksList.ItemEnabled[X]:= False;
end;


который вы мне написали, и этот
читать дальше »

Код:

var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Ïåðåâîä ÷èñëà â çíà÷åíèå áò/Êá/Ìá/Ãá/Òá (äî 3õ çíàêîâ ïîñëå çàïÿòîé)}
Begin
        if not noMB then Result:= FloatToStr(Int(Bytes)) +' Ìá' else
                if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Áò' else
                        if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Êá' else
                                If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Ìá' else
                                        If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Ãá' else
                                                Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Òá'
        StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Óäàëåíèå íà÷àëüíûõ, êîíå÷íûõ è ïîâòîðíûõ ïðîáåëîâ }
        Begin        while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Îáðåçàòü ñòðîêó äî çàäàííîãî êîë-âà ñèìâîëîâ}
        Begin
                if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
                else Result:= String;
        End;

Procedure GetDiskInfo(Disk: String);
        Begin
                FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
                        GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
                FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='áåç ìåòêè';
        End;

Procedure ListBoxRefresh;        var FreeB, TotalB: Cardinal; Path, String: string; Begin
        ListBox.Items.Clear
for n:= 1 to 31 do        // äèñê 'À' ïðîïóñòèòü
        if (GetLogicalDrives and (1 shl n)) > 0 then
                if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
                        if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
        Path:= Copy(ListBox.Items[n],1,2) +'\'                { åñëè â íàêîïèòåëå íåò äèñêà, ïðîïóñòèòü îáíîâëåíèå }
        if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
                if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
                if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' âñåãî| '+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' âñåãî| '+ String;
        ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% ñâîá|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
        ListBox:        for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
        StartMenuTreeView:        if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
        WizardForm.NoIconsCheck:        begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Function NextButtonClick(CurPageID: Integer): Boolean; Begin
        Result:= True
        if (CurPageID = wpSelectDir) and (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'), 'Óñòàíîâêà â ñèñòåìíóþ ïàïêó', MB_YESNO or $30) = idYes;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
        if CurPageID = wpSelectDir then ListBoxRefresh
End;

Procedure InitializeWizard;
Begin
        ListBox:= TListBox.Create(WizardForm)
                ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
                ListBox.Font.Size:= 9
                ListBox.Font.Style:= [fsBold]
                ListBox.Font.Name:= 'Courier New';
                ListBox.OnClick:= @ObjectOnClick;
                ListBox.Parent:= WizardForm.SelectDirPage;
        WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1, WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height)
                WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick
                WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage
                WizardForm.NoIconsCheck.Show
        StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm)
                StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
                StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height)
                StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage
                StartMenuTreeView.Cursor:= crHand
                StartMenuTreeView.OnChange:=@ObjectOnClick
End;


А то у меня выдает ошибку - Duplicate identifer 'CURPAGECHANGED' или когда пытаюсь склеить другие коды, ошибка Duplicate identifer 'InitializeWizard' или другие ошибки.

Serega 04-05-2009 21:30 1110723

Скрипт для отображения процесса распаковки внешних FreeArc архивов во втором прогрессбаре, необходима расширенная версия от Restools:
читать дальше »
Код:

; Скрипт для отображения процесса распаковки внешних FreeArc архивов во втором прогрессбаре
; Рядом с архивом необходимо расположить архивы и Arc.exe
; Для нормальной работы необходима расширенная версия Inno Setup от Restools http://restools.hanzify.org/
; Отдельное спасибо BlackSelf, http://www.forum.oszone.ru/member.php?userid=147308, за подсказанную идею... :)
; Автор скрипта: Serega, http://forum.oszone.net/member.php?userid=88670

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[UninstallDelete]
Name: {app}; Type: filesandordirs

[code]
var
  ProgressLabel: TLabel;
  ProgressBar: TNewProgressBar;

procedure ParserLog;
var
  in_File, out_File, S, S1, S2: string;
  i, j, n: Integer;
begin
  n:= 0;
  in_File := ExpandConstant('{tmp}\in_log');
  out_File := ExpandConstant('{tmp}\out_log');
  ProgressBar.Position:= 0;
  ProgressBar.Show;
  ProgressLabel.Show;
  // если файла нет, то подождём... ;)
  if FileExists(in_File) = False then
    repeat
      Application.ProcessMessages; // необходима расширенная версия от Restools
      n:= n + 1;
      Sleep(500); // ждём полсекунды и повторяем цикл
    until (FileExists(in_File) = True) or (n = 10); // максимально повторяем цикл 10 раз, что составит 5 секунд...
  // если всё же файла нет, то выходим
  if FileExists(in_File) = False then Exit;
  // если файл существует, то обрабатываем его
  repeat
    FileCopy(in_File, out_File, False); // копируем файл, чтоб можно было открыть out_File для чтения
    LoadStringFromFile(out_File, S); // если попытаться загрузить in_File, то ничего не выйдет, пока в него пишет Arc.exe...
    Application.ProcessMessages; // необходима расширенная версия от Restools
    if Pos('%', S) > 0 then begin
      S1:= Copy(S, Length(S) - 4, (Length(S) - 2) - (Length(S) - 4));
      S2:= Copy(S, Length(S) - 4, Length(S) - (Length(S) - 5));
      StringChange(S1, ' ', ''); // удаляем пробелы
      for i:= 0 to 100 do if S1 = IntToStr(i) then begin
        j:= StrToInt(S1);
        ProgressBar.Position := j;
        StringChange(S2, ' ', '');
        ProgressLabel.Caption:= S2;
        Application.ProcessMessages; // необходима расширенная версия от Restools
      end;
    end;
  until (Pos('Extracted', S) or Pos('ERROR', S)) > 0;
  ProgressBar.Position:= 100;
end;

procedure UnpackArc(archive_Name, archive_Path: string);
var
  res: Integer;
begin
  if FileExists(ExpandConstant('{tmp}\in_log')) then DelayDeleteFile(ExpandConstant('{tmp}\in_log'),8);
// запускаем Arc.exe... ;)
  Exec('cmd.exe', '/C arc.exe x ' + archive_Name + ' -y -dp' + archive_Path + ' >' +
      AddQuotes(ExpandConstant('{tmp}\in_log')), ExpandConstant('{src}'), SW_HIDE, ewNoWait, res);
  WizardForm.StatusLabel.Caption:= 'Распаковка архива ' + ExtractFileName(archive_Name) + ', ждите...';
  ParserLog; // обрабатываем лог файл
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then begin
    WizardForm.CancelButton.Enabled:= False; // отключаем кнопку 'Отмена'
  // AddQuotes - добавляет двойные кавычки в начало и конец строки...
    UnpackArc(AddQuotes(ExpandConstant('{src}\Project.arc')), // расположение 1-го архива
      AddQuotes(ExpandConstant('{app}\Archive1'))); // место распаковки 1-го архива
    UnpackArc(AddQuotes(ExpandConstant('{src}\Project.arc')), // расположение 2-го архива
      AddQuotes(ExpandConstant('{app}\Archive2'))); // место распаковки 2-го архива
    WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
  end;
end;

procedure InitializeWizard;
begin
  // второй прогрессбар
  ProgressBar := TNewProgressBar.Create(WizardForm);
  with ProgressBar do begin
    Left := WizardForm.ProgressGauge.Left;
    Top := WizardForm.ProgressGauge.Top + ScaleX(30);
    Width := WizardForm.ProgressGauge.Width;
    Height := WizardForm.ProgressGauge.Height;
    Parent := WizardForm.InstallingPage;
    Hide;
  end;
  // создаём Label для отображения процентов
  ProgressLabel := TLabel.Create(WizardForm);
  with ProgressLabel do begin
    Left := ProgressBar.Left;
    Top := ProgressBar.Top + ProgressBar.Height + ScaleX(5);
    AutoSize:= True;
    Caption:= '0%';
    Parent := WizardForm.InstallingPage;
    Transparent:= True;
    Font.Color:= clDefault;
    Hide;
  end;
end;



Вопросы

1. Как сделать чтоб во время установки, архив копировался во временную папку %temp% и от туда распаковывался, т.е. использовать не внешний архив, а упакованный внутри инсталлятора?
Нужно добавить в скрипт секцию [Files] и исправить процедуру CurStepChanged:
Пример
Код:

..........................
[Files]
Source: Arc.exe; Flags: dontcopy
Source: Project.arc; Flags: dontcopy
..........................
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then begin
    ExtractTemporaryFile('Arc.exe'); // извлекаем в {tmp} Arc.exe
    WizardForm.StatusLabel.Caption:= 'Извлечение архива, ждите...';
    ExtractTemporaryFile('Project.arc'); // извлекаем в {tmp} Project.arc

    patch_Arc:= AddQuotes(ExpandConstant('{tmp}\Arc.exe')); // расположение Arc.exe
    UnpackArc(AddQuotes(ExpandConstant('{tmp}\Project.arc')), // расположение архива
      AddQuotes(ExpandConstant('{app}'))); // место распаковки архива
  // AddQuotes - добавляет двойные кавычки в начало и конец строки...
  end;
end;
..........................



p3rf3ct1c 04-05-2009 21:51 1110733

Serega_,
Исправил.

Serega 04-05-2009 21:57 1110740

p3rf3ct1c,
читать дальше »
Код:

var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Ia?aaia ?enea a cia?aiea ao/Ea/Ia/Aa/Oa (ai 3o ciaeia iinea caiyoie)}
Begin
        if not noMB then Result:= FloatToStr(Int(Bytes)) +' Ia' else
                if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Ao' else
                        if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Ea' else
                                If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Ia' else
                                        If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Aa' else
                                                Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Oa'
        StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Oaaeaiea ia?aeuiuo, eiia?iuo e iiaoi?iuo i?iaaeia }
        Begin        while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Ia?acaou no?ieo ai caaaiiiai eie-aa neiaieia}
        Begin
                if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
                else Result:= String;
        End;

Procedure GetDiskInfo(Disk: String);
        Begin
                FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
                        GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
                FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='aac iaoee';
        End;

Procedure ListBoxRefresh;        var FreeB, TotalB: Cardinal; Path, String: string; Begin
        ListBox.Items.Clear
for n:= 1 to 31 do        // aene 'A' i?iionoeou
        if (GetLogicalDrives and (1 shl n)) > 0 then
                if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
                        if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
        Path:= Copy(ListBox.Items[n],1,2) +'\'                { anee a iaeiieoaea iao aenea, i?iionoeou iaiiaeaiea }
        if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
                if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
                if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' anaai| '+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' anaai| '+ String;
        ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% naia|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
        ListBox:        for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
        StartMenuTreeView:        if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
        WizardForm.NoIconsCheck:        begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Function NextButtonClick(CurPageID: Integer): Boolean;
Begin
        Result:= True
        if (CurPageID = wpSelectDir) and (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'), 'Onoaiiaea a nenoaiio? iaieo', MB_YESNO or $30) = idYes;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
        if CurPageID = wpSelectDir then ListBoxRefresh;
        if CurPageID = wpSelectTasks then WizardForm.TasksList.ItemEnabled[X]:= False;
End;

Procedure InitializeWizard;
Begin
        ListBox:= TListBox.Create(WizardForm)
                ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
                ListBox.Font.Size:= 9
                ListBox.Font.Style:= [fsBold]
                ListBox.Font.Name:= 'Courier New';
                ListBox.OnClick:= @ObjectOnClick;
                ListBox.Parent:= WizardForm.SelectDirPage;
        WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1, WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height)
                WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick
                WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage
                WizardForm.NoIconsCheck.Show
        StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm)
                StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
                StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height)
                StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage
                StartMenuTreeView.Cursor:= crHand
                StartMenuTreeView.OnChange:=@ObjectOnClick
End;


p3rf3ct1c 04-05-2009 22:07 1110745

Serega_,
Спасибо!

Raf-9600 05-05-2009 00:05 1110829

Ктониь можеть объединить эти коды?
Список винчестеров
[code]
var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Function NextButtonClick(CurPageID: Integer): Boolean; Begin
Result:= True
if (CurPageID = wpSelectDir) and (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'), 'Установка в системную папку', MB_YESNO or $30) = idYes;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpSelectDir then ListBoxRefresh
End;

Procedure InitializeWizard;
Begin
ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
ListBox.Font.Size:= 9
ListBox.Font.Style:= []
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;
WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1, WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height)
WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick
WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage
WizardForm.NoIconsCheck.Show
StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm)
StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height)
StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage
StartMenuTreeView.Cursor:= crHand
StartMenuTreeView.OnChange:=@ObjectOnClick
End;
+
Боковушка с описанием компонентов
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';

function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

var
Info: TNewStaticText;
InfoCaption: TNewStaticText;
InfoPanel: TPanel;

procedure DeinitializeSetup();
begin
disabledesc();
end;

procedure InitializeWizard();
begin
WizardForm.TYPESCOMBO.Visible:= false;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Width := ScaleX(200);
InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;
InfoPanel.Left := ScaleX(216);
InfoPanel.Width := ScaleX(200);
InfoPanel.Height := WizardForm.ComponentsList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := 'ГиКц';
InfoCaption.Left := ScaleX(224);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;
Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188);
Info.Top := ScaleY(12);
Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
Info.Caption := 'ТЖ¶ЇДгµДКу±кЦёХлµЅЧйјюЦ®ЙПЈ¬±гїЙјыµЅЛьµДГиКцЎЈ';
Info.WordWrap := true;
enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
'іМРтОДјюГиКц;'+
'°пЦъОДјюГиКц;'+
'ЧФКцОДјюГиКц;'+
'УўОДГиКц;'+
'µВОДГиКц;'+
'ЦРОДГиКц;'+
'¶нОДГиКцІвКФ#3B#3B°ьє¬#3BУўОД·ЦєЕ;'+
'ІвКФГиКц;'+
'ІвКФ1ГиКц;'+
'ІвКФ2ГиКц;'+
'ІвКФ3ГиКц;'+
'ІвКФ4ГиКц;'+
'ІвКФ5ГиКц;'+
'ІвКФ6ГиКц;'
);
end;
+
Деинсталлятор UninsHs
function ShouldSkipPage(CurPage: Integer): Boolean;
begin
if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
case CurPage of
wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
wpSelectDir, wpSelectProgramGroup, wpInfoAfter:
Result := True;
end;
end;
const
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;

procedure InitializeWizard();
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then
begin
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
(CurPageID = wpSelectComponents) then
WizardForm.BackButton.Visible := False;
end;
+
Проверка присудствия папок, после деинсталяции
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Res: Integer;
begin
case CurUninstallStep of
usPostUninstall:
begin
//Проверяем присутствие папки после удаления
If DirExists(ExpandConstant('{app}')+'')
then
//Создаем диалог с тремя кнопками
case MsgBox('Папка "'+ExpandConstant('{app}')+'" не пуста.'#13#13 +
'"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
'"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
'"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL)
of IDYES:
begin
if not DelTree(ExpandConstant('{app}')+'', True, True, True)
then
MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);
end
IDNO:
begin
if not ShellExec('open', ExpandConstant('{app}')+'', '', '', SW_SHOWMAXIMIZED, ewNoWait, Res)
then
MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);
end
IDCANCEL:
begin
end;
end;
end;
end;
end;

//Будьте очень осторожны в таких случаях! Не позволим пользователю установить программу в уже существующую папку:
function NextButtonClick(CurPage: Integer): Boolean;
var
s, s2:string;
begin
Result:=True;
If CurPage=wpSelectDir
then
begin
s2:=ExpandConstant('{app}')+'';
If DirExists(s2)
then
begin
s:='Установка в существующую папку в целях безопасности невозможна!';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end;
end;
end;

Serega 05-05-2009 01:05 1110863

Raf-9600,
читать дальше »
Код:

var
  n: Integer;
  FreeMB, TotalMB: Cardinal;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;
  Info, InfoCaption: TNewStaticText;
  InfoPanel: TPanel;

const
  oneMB= 1024*1024;
  WM_LBUTTONDOWN = 513;
  WM_LBUTTONUP = 514;

function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
begin
  if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
  if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
  if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
  If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
  If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
  Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
  StringChange(Result, ',', '.')
end;

function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
begin
  while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
  Result:= Trim(String);
end;

function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
begin
  if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
  else Result:= String;
end;

procedure GetDiskInfo(Disk: String);
begin
  FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
  GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
  FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
end;

procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string;
begin
  ListBox.Items.Clear
  for n:= 1 to 31 do // диск 'А' пропустить
  if (GetLogicalDrives and (1 shl n)) > 0 then
  if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
  if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
  for n:= 0 to ListBox.Items.Count -1 do begin
    Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
    if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin
      GetDiskInfo(Path);
      if FreeB >= $7FFFFFFF then
      String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
      if TotalB >= $7FFFFFFF then begin
        TotalB:= TotalMB; FreeB:= FreeMB;
        String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String
      end else
        String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
      ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+
        PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9);
    end;
  end;
end;

procedure ObjectOnClick(Sender: TObject);
begin
  Case TObject(Sender) of

  ListBox:
    for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then
    WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))

  StartMenuTreeView:
    if StartMenuTreeView.Directory <> '' then
      WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory
    else
      WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'

  WizardForm.NoIconsCheck:
    begin
      WizardForm.GroupEdit.Enabled:= not (WizardForm.GroupEdit.Enabled);
      StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled;
      WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled
    end;
  end;
end;

function ShouldSkipPage(CurPage: Integer): Boolean;
begin
  if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
  case CurPage of
    wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
    wpSelectDir, wpSelectProgramGroup, wpInfoAfter: Result := True;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
    (CurPageID = wpSelectComponents) then
  WizardForm.BackButton.Visible := False;
  if CurPageID = wpSelectDir then ListBoxRefresh;
end;

//Будьте очень осторожны в таких случаях! Не позволим пользователю установить программу в уже существующую папку:
function NextButtonClick(CurPage: Integer): Boolean;
var
  s, s2:string;
begin
  Result:= True;
  if CurPageID = wpSelectDir and
    (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then
  Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'),
    'Установка в системную папку', MB_YESNO or $30) = idYes;

  If CurPage = wpSelectDir then begin
    s2:=ExpandConstant('{app}')+'';
    If DirExists(s2) then begin
      s:= 'Установка в существующую папку в целях безопасности невозможна!';
      MsgBox(s, mbError, mb_Ok);
      Result:=False;
    end;
  end;
end;

procedure InitializeWizard;
begin
  if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then begin
    PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONDOWN, 0, 0);
    PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONUP, 0, 0);
  end;

  WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1,
    WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height);
  WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick;
  WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage;
  WizardForm.NoIconsCheck.Show;

  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8,
    WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left,
      WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12));
  ListBox.Font.Size:= 9;
  ListBox.Font.Style:= [];
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;

  StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm);
  StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'),
    ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
  StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height);
  StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage;
  StartMenuTreeView.Cursor:= crHand;
  StartMenuTreeView.OnChange:=@ObjectOnClick;

  WizardForm.TYPESCOMBO.Visible:= false;

  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);

  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;
  InfoPanel.Left := ScaleX(216);
  InfoPanel.Width := ScaleX(200);
  InfoPanel.Height := WizardForm.ComponentsList.Height;
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;

  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := 'ГиКц';
  InfoCaption.Left := ScaleX(224);
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);
  InfoCaption.Font.Color := clActiveCaption;

  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188);
  Info.Top := ScaleY(12);
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
  Info.Caption := 'ТЖ¶ЇДгµДКу±кЦёХлµЅЧйјюЦ®ЙПЈ¬±гїЙјыµЅЛьµДГиКцЎЈ';
  Info.WordWrap := true;

  enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
    'іМРтОДјюГиКц;'+
    '°пЦъОДјюГиКц;'+
    'ЧФКцОДјюГиКц;'+
    'УўОДГиКц;'+
    'µВОДГиКц;'+
    'ЦРОДГиКц;'+
    '¶нОДГиКцІвКФ#3B#3B°ьє¬#3BУўОД·ЦєЕ;'+
    'ІвКФГиКц;'+
    'ІвКФ1ГиКц;'+
    'ІвКФ2ГиКц;'+
    'ІвКФ3ГиКц;'+
    'ІвКФ4ГиКц;'+
    'ІвКФ5ГиКц;'+
    'ІвКФ6ГиКц;'
    );
end;

procedure DeinitializeSetup();
begin
  disabledesc();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  Res: Integer;
begin
  case CurUninstallStep of
    usPostUninstall:
    begin
      //Проверяем присутствие папки после удаления
      If DirExists(ExpandConstant('{app}')+'') then
      //Создаем диалог с тремя кнопками
      case MsgBox('Папка "'+ExpandConstant('{app}')+'" не пуста.'#13#13 +
          '"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
          '"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
          '"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of
      IDYES:
        begin
          if not DelTree(ExpandConstant('{app}')+'', True, True, True) then
          MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);
        end;
      IDNO:
        begin
          if not ShellExec('open', ExpandConstant('{app}')+'', '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
          MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);
        end;
      IDCANCEL:
        begin
        end;
      end;
    end;
  end;
end;


BlackSelf 05-05-2009 02:27 1110905

Serega_, огромное тебе спасибо за твои труды)

Raf-9600 05-05-2009 11:57 1111122

Serega_, выделяет красным "if CurPageID = wpSelectDir and" и пишет ошибку "Unknown identifer "CurPageID"" :(
Кстати, на всяк: для работоспособности всего что в результате должно получиться, в инсталле должна быть библиотека http://narod.ru/disk/8343782000/descctrl.dll.html Ну и для UninsHs скрипт должен выглядеть типо так:
читать дальше »

[Setup]
AppName=Earth 2140
AppVerName=Earth 2140
AppModifyPath="{app}\UninsHs.exe" /m0=Earth 2140

[Files]
Source: "D:\Документы\PSLan\Скачяно\Inno\UninsHs\UninsHs.exe"; DestDir: "{app}"; Flags: restartreplace

[Run]
Filename: {app}\UninsHs.exe; Parameters: /r0=Earth 2140,{language},{srcexe}; Flags: runminimized
Сам UninsHs можно скачать тут http://www.han-soft.com/uninshs.php

Serega 05-05-2009 13:29 1111197

Raf-9600,
читать дальше »
Код:

var
  n: Integer;
  FreeMB, TotalMB: Cardinal;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;
  Info, InfoCaption: TNewStaticText;
  InfoPanel: TPanel;

const
  oneMB= 1024*1024;
  WM_LBUTTONDOWN = 513;
  WM_LBUTTONUP = 514;

function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
begin
  if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
  if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
  if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
  If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
  If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
  Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
  StringChange(Result, ',', '.')
end;

function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
begin
  while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
  Result:= Trim(String);
end;

function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
begin
  if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
  else Result:= String;
end;

procedure GetDiskInfo(Disk: String);
begin
  FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
  GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
  FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
end;

procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string;
begin
  ListBox.Items.Clear
  for n:= 1 to 31 do // диск 'А' пропустить
  if (GetLogicalDrives and (1 shl n)) > 0 then
  if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
  if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
  for n:= 0 to ListBox.Items.Count -1 do begin
    Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
    if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin
      GetDiskInfo(Path);
      if FreeB >= $7FFFFFFF then
      String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
      if TotalB >= $7FFFFFFF then begin
        TotalB:= TotalMB; FreeB:= FreeMB;
        String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String
      end else
        String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
      ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+
        PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9);
    end;
  end;
end;

procedure ObjectOnClick(Sender: TObject);
begin
  Case TObject(Sender) of

  ListBox:
    for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then
    WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))

  StartMenuTreeView:
    if StartMenuTreeView.Directory <> '' then
      WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory
    else
      WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'

  WizardForm.NoIconsCheck:
    begin
      WizardForm.GroupEdit.Enabled:= not (WizardForm.GroupEdit.Enabled);
      StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled;
      WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled
    end;
  end;
end;

function ShouldSkipPage(CurPage: Integer): Boolean;
begin
  if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
  case CurPage of
    wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
    wpSelectDir, wpSelectProgramGroup, wpInfoAfter: Result := True;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
    (CurPageID = wpSelectComponents) then
  WizardForm.BackButton.Visible := False;
  if CurPageID = wpSelectDir then ListBoxRefresh;
end;

//Будьте очень осторожны в таких случаях! Не позволим пользователю установить программу в уже существующую папку:
function NextButtonClick(CurPage: Integer): Boolean;
var
  s, s2:string;
begin
  Result:= True;

  if (CurPage = wpSelectDir) and
    (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then
  Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'),
    'Установка в системную папку', MB_YESNO or $30) = idYes;

  If CurPage = wpSelectDir then begin
    s2:=ExpandConstant('{app}')+'';
    If DirExists(s2) then begin
      s:= 'Установка в существующую папку в целях безопасности невозможна!';
      MsgBox(s, mbError, mb_Ok);
      Result:=False;
    end;
  end;
end;

procedure InitializeWizard;
begin
  if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then begin
    PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONDOWN, 0, 0);
    PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONUP, 0, 0);
  end;

  WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1,
    WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height);
  WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick;
  WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage;
  WizardForm.NoIconsCheck.Show;

  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8,
    WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left,
      WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12));
  ListBox.Font.Size:= 9;
  ListBox.Font.Style:= [];
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;

  StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm);
  StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'),
    ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
  StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height);
  StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage;
  StartMenuTreeView.Cursor:= crHand;
  StartMenuTreeView.OnChange:=@ObjectOnClick;

  WizardForm.TYPESCOMBO.Visible:= false;

  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);

  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;
  InfoPanel.Left := ScaleX(216);
  InfoPanel.Width := ScaleX(200);
  InfoPanel.Height := WizardForm.ComponentsList.Height;
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;

  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := 'ГиКц';
  InfoCaption.Left := ScaleX(224);
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);
  InfoCaption.Font.Color := clActiveCaption;

  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188);
  Info.Top := ScaleY(12);
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
  Info.Caption := 'ТЖ¶ЇДгµДКу±кЦёХлµЅЧйјюЦ®ЙПЈ¬±гїЙјыµЅЛьµДГиКцЎЈ';
  Info.WordWrap := true;

  enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
    'іМРтОДјюГиКц;'+
    '°пЦъОДјюГиКц;'+
    'ЧФКцОДјюГиКц;'+
    'УўОДГиКц;'+
    'µВОДГиКц;'+
    'ЦРОДГиКц;'+
    '¶нОДГиКцІвКФ#3B#3B°ьє¬#3BУўОД·ЦєЕ;'+
    'ІвКФГиКц;'+
    'ІвКФ1ГиКц;'+
    'ІвКФ2ГиКц;'+
    'ІвКФ3ГиКц;'+
    'ІвКФ4ГиКц;'+
    'ІвКФ5ГиКц;'+
    'ІвКФ6ГиКц;'
    );
end;

procedure DeinitializeSetup();
begin
  disabledesc();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  Res: Integer;
begin
  case CurUninstallStep of
    usPostUninstall:
    begin
      //Проверяем присутствие папки после удаления
      If DirExists(ExpandConstant('{app}')+'') then
      //Создаем диалог с тремя кнопками
      case MsgBox('Папка "'+ExpandConstant('{app}')+'" не пуста.'#13#13 +
          '"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
          '"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
          '"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of
      IDYES:
        begin
          if not DelTree(ExpandConstant('{app}')+'', True, True, True) then
          MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);
        end;
      IDNO:
        begin
          if not ShellExec('open', ExpandConstant('{app}')+'', '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
          MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);
        end;
      IDCANCEL:
        begin
        end;
      end;
    end;
  end;
end;


Raf-9600 05-05-2009 13:35 1111202

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


Serega 05-05-2009 13:49 1111209

Raf-9600, не совсем понял суть вопроса, если вы имеете ввиду почему у вас окно без рамки?
Отношение к скрипту которой я вам правил, это не имеет никого отношения, скажу только, что вы что-то добавили в секцию код.

Raf-9600 05-05-2009 17:05 1111351

Serega_, та это я так скриншот сделал :) Я имел введу что под строкой указывающей выбор папки в меню Пуск, ничего не должно быть! В том числе и "Don't create Start Menu floder".

Serega 05-05-2009 17:33 1111375

Raf-9600, я закоментировал в скрипте строки где это создаётся
читать дальше »
Код:

var
  n: Integer;
  FreeMB, TotalMB: Cardinal;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;
  Info, InfoCaption: TNewStaticText;
  InfoPanel: TPanel;

const
  oneMB= 1024*1024;
  WM_LBUTTONDOWN = 513;
  WM_LBUTTONUP = 514;

function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
begin
  if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
  if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
  if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
  If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
  If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
  Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
  StringChange(Result, ',', '.')
end;

function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
begin
  while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
  Result:= Trim(String);
end;

function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
begin
  if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
  else Result:= String;
end;

procedure GetDiskInfo(Disk: String);
begin
  FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
  GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
  FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
end;

procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string;
begin
  ListBox.Items.Clear
  for n:= 1 to 31 do // диск 'А' пропустить
  if (GetLogicalDrives and (1 shl n)) > 0 then
  if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
  if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
  for n:= 0 to ListBox.Items.Count -1 do begin
    Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
    if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin
      GetDiskInfo(Path);
      if FreeB >= $7FFFFFFF then
      String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
      if TotalB >= $7FFFFFFF then begin
        TotalB:= TotalMB; FreeB:= FreeMB;
        String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String
      end else
        String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
      ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+
        PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9);
    end;
  end;
end;

procedure ObjectOnClick(Sender: TObject);
begin
  Case TObject(Sender) of

  ListBox:
    for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then
    WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))

  StartMenuTreeView:
    if StartMenuTreeView.Directory <> '' then
      WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory
    else
      WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'

  WizardForm.NoIconsCheck:
    begin
      WizardForm.GroupEdit.Enabled:= not (WizardForm.GroupEdit.Enabled);
      StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled;
      WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled
    end;
  end;
end;

function ShouldSkipPage(CurPage: Integer): Boolean;
begin
  if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
  case CurPage of
    wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
    wpSelectDir, wpSelectProgramGroup, wpInfoAfter: Result := True;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
    (CurPageID = wpSelectComponents) then
  WizardForm.BackButton.Visible := False;
  if CurPageID = wpSelectDir then ListBoxRefresh;
end;

//Будьте очень осторожны в таких случаях! Не позволим пользователю установить программу в уже существующую папку:
function NextButtonClick(CurPage: Integer): Boolean;
var
  s, s2:string;
begin
  Result:= True;

  if (CurPage = wpSelectDir) and
    (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then
  Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'),
    'Установка в системную папку', MB_YESNO or $30) = idYes;

  If CurPage = wpSelectDir then begin
    s2:=ExpandConstant('{app}')+'';
    If DirExists(s2) then begin
      s:= 'Установка в существующую папку в целях безопасности невозможна!';
      MsgBox(s, mbError, mb_Ok);
      Result:=False;
    end;
  end;
end;

procedure InitializeWizard;
begin
  if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then begin
    PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONDOWN, 0, 0);
    PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONUP, 0, 0);
  end;

//  WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1,
//    WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height);
//  WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick;
//  WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage;
//  WizardForm.NoIconsCheck.Show;

  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8,
    WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left,
      WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12));
  ListBox.Font.Size:= 9;
  ListBox.Font.Style:= [];
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;

//  StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm);
//  StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'),
//    ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
//  StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height);
//  StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage;
//  StartMenuTreeView.Cursor:= crHand;
//  StartMenuTreeView.OnChange:=@ObjectOnClick;

  WizardForm.TYPESCOMBO.Visible:= false;

  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);

  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;
  InfoPanel.Left := ScaleX(216);
  InfoPanel.Width := ScaleX(200);
  InfoPanel.Height := WizardForm.ComponentsList.Height;
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;

  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := 'ГиКц';
  InfoCaption.Left := ScaleX(224);
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);
  InfoCaption.Font.Color := clActiveCaption;

  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188);
  Info.Top := ScaleY(12);
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
  Info.Caption := 'ТЖ¶ЇДгµДКу±кЦёХлµЅЧйјюЦ®ЙПЈ¬±гїЙјыµЅЛьµДГиКцЎЈ';
  Info.WordWrap := true;

  enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
    'іМРтОДјюГиКц;'+
    '°пЦъОДјюГиКц;'+
    'ЧФКцОДјюГиКц;'+
    'УўОДГиКц;'+
    'µВОДГиКц;'+
    'ЦРОДГиКц;'+
    '¶нОДГиКцІвКФ#3B#3B°ьє¬#3BУўОД·ЦєЕ;'+
    'ІвКФГиКц;'+
    'ІвКФ1ГиКц;'+
    'ІвКФ2ГиКц;'+
    'ІвКФ3ГиКц;'+
    'ІвКФ4ГиКц;'+
    'ІвКФ5ГиКц;'+
    'ІвКФ6ГиКц;'
    );
end;

procedure DeinitializeSetup();
begin
  disabledesc();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  Res: Integer;
begin
  case CurUninstallStep of
    usPostUninstall:
    begin
      //Проверяем присутствие папки после удаления
      If DirExists(ExpandConstant('{app}')+'') then
      //Создаем диалог с тремя кнопками
      case MsgBox('Папка "'+ExpandConstant('{app}')+'" не пуста.'#13#13 +
          '"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
          '"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
          '"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of
      IDYES:
        begin
          if not DelTree(ExpandConstant('{app}')+'', True, True, True) then
          MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);
        end;
      IDNO:
        begin
          if not ShellExec('open', ExpandConstant('{app}')+'', '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
          MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);
        end;
      IDCANCEL:
        begin
        end;
      end;
    end;
  end;
end;



P.S.
Вообще я только объединил, по вашей просьбе несколько кодов, а это было прописано в одном из предложенных вами вариантов... т.е. от себя, я ничего не добавлял…

Raf-9600 05-05-2009 17:41 1111383

Serega_, проблема в том, что если эти скрипты юзать по отдельности, то ничего аномального (как на скрине) не создается...
А Вы можете чёнить дописать, чтобы и функции прежние остались, и все нормально работало? :)

Serega 05-05-2009 17:54 1111392

Цитата:

Цитата Raf-9600
А Вы можете чёнить дописать, чтобы и функции прежние остались, и все нормально работало? »

Чего-нибудь дописать... хммм... конечно могу, если только чего-нибудь... :)
Вы объясните нормально, что конкретно хотите и что конкретно не работает?

Raf-9600 05-05-2009 18:21 1111403

Цитата:

Цитата Serega_
Что в вашем понимании слово - корректно? »

Чтоб все работало и без побочных эффектов :)

Цитата:

Цитата Serega_
Вы объясните нормально, что конкретно хотите и что конкретно не работает? »

Ну что не работает я уже на срине показал. Т.е. окно выбора папки в меню Пуск должно быть стандартным, т.е. вот таким:



А что должно работать, это долгий вопрос :) Ну с кодом отображающим список винчестеров, под "полоской" выбора папки установки думаю и так понятно. Его можно просто скомпилить отдельно, и увидете как он должен работать :)
Потом, Боковушка с описанием компонентов - там тоже все предельно ясно.
Одно из действий кода деинсталлятора UninsHs, это удаление вступительной странички, в случае когда он будет запускать инсталлятор (ну типа чтоб компоненты изменить). Второе, это когда в UninsHs нажать на кнопку "Восстановить", тогда он должен запускать инсталлятор так, чтобы пропустить все страницы его диалогов, и запустить процесс переустановки, с сохранением всех компонентов, ктороие были выбраны в инсталлятре при установке. Ну и третя функция, это запустить стандартный деинсталлятор, но так чтобы тот не спрашивал ли уверен юзер что хочет удалить прогу, а сразу начинал бы деинсталляцию.
Код проверки присудствия папок, после деинсталяции, говорит сам за себя, тоесть после завершения удаления всех файлов, деинсталлятор должен проверять, не осталось ли что-то в папке {app}, и если находит, то выводил бы диалоговое окно, с вариантами "Удалить", "Открыть в проводнике" и "Отменить" (типа так :)). Ну и + он должен запрещять установку в существующую папку (в целях безопасности). Т.е. если юзер повытаеться в путе установки, указать существующую папку, то после клика "Далее" инсталлятор должен вывести сообщение что установка в существующую папку невозможна.


P.S.
Это Вы на ru-board'е под ником "DeKaNszn"? :)

Serega 05-05-2009 18:38 1111413

Raf-9600, мне интересно, а вы вообще пробовали скомпилировать скрипт?
Не проверял UninsHs, но остальное, о чём вы пишите, всё работает или я не прав?

Raf-9600 05-05-2009 18:49 1111421

Serega_, та работает (вроде :)) но меня спущяют побочные эффекты такой работы:

Serega 05-05-2009 18:56 1111428

Raf-9600, я же у вас на русском языке спрашиваю: вы пробовали скомпилировать скрипт? Пост № 688, на предыдущей странице? Я там закомментировал, где создаются эти объекты и на работоспособность инсталлятора, то, что я закомментировал, никак не влияет...

Raf-9600 05-05-2009 19:19 1111447

Serega_, аа, вы про этот скрит?
Вы то по-русски сказали, но я ж не знал что то что вы закоментили, не влияет на функционал
Реально все пашет, и все деинсталляторы тоже корректно работают. Есть только одна маленькая мелочь, при отмене инсталляции, инсталлятор почему-то долго закрывается. В принципе пережить можно, но если знаете как исправить, буду благодарен

Serega 05-05-2009 21:27 1111560

Raf-9600, теоретически, это может происходить из-за descctrl.dll, т.е. инсталлятор пытается закрыться и удалить временные файлы, а descctrl.dll работает. Попробуйте добавить в скрипт процедуру CancelButtonClick:
Код:

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  disabledesc();
end;


Raf-9600 05-05-2009 21:38 1111577

Serega_, Респект и Уважуха!

P.S.
Но это врятли иза descctrl.dll, ибо если попробовать скомпилить только код боковушки (с этой dll'кой) то закрытие происходит нормально.

Serega 05-05-2009 22:01 1111605

Цитата:

Цитата Raf-9600
Но это врятли иза descctrl.dll, ибо если попробовать скомпилить только код боковушки (с этой dll'кой) то закрытие происходит нормально. »

Если вы добавили процедуру CancelButtonClick и у вас стал закрываться инсталлятор быстрее, то это было именно из-за dll'ки...

P.S.
Хотя у меня и при старом варианте закрывался быстро...

RedBishep 06-05-2009 19:05 1112218

Привет Всем!!!
У меня вот такая проблема,точнее говоря вопрос!!
Извиняюсь если есть где-то такая тема,не хватило терпения всё прочитать и т.д ))
Короче...
Я создаю Инсталлер игры,Всё нормально устанавливается и т.д всё работает
Но мне хотелось бы узнать как сделать...
Я вот пробовал создать Инсталлер игры (Call of Duty 4)
Всё шло отлично а вот посредине Запаковки вышла ошибка ( что setup не может быть больше 2,1гб )
Подскажите что или как можно сделать так что бы он был больше чем 2,1 гб
И ещё вот такой вопрос!!
Я во многих играх видел что посредине установке игры идёт распаковка(Extracting)
Как мне такое сделать ??
Если можно со скринами и подробной инфой...
Буду Очень Благодарен!!!

Drongo 06-05-2009 20:04 1112258

Цитата:

Цитата RedBishep
Подскажите что или как можно сделать так что бы он был больше чем 2,1 гб »

Одним сплошным файлом это сделать не получится, придётся только "бить" на части .bin. В секцию Setup добавь строки, которые выделены зелёным цветом
Код:

[Setup]
...
DiskSpanning=yes
SlicesPerDisk=1
DiskSliceSize=2100000000
DiskClusterSize=4096
ReserveBytes=0


Compression=lzma/ultra
SolidCompression=yes

Цитата:

Цитата RedBishep
Я во многих играх видел что посредине установке игры идёт распаковка(Extracting)
Как мне такое сделать ?? »

Архиватор как сжимать ??? -> Комментарий 10 и дальше по тексту вниз. А вот как? Это хороший вопрос. :) Я бы тоже не отказался узнать на него ответ. ;)

RedBishep 06-05-2009 23:54 1112431

Цитата:

Цитата Drongo
Я бы тоже не отказался узнать на него ответ. »

\

Спасибо Большое ))

Serega 07-05-2009 01:07 1112474

Цитата:

Цитата RedBishep
посредине установке игры идёт распаковка(Extracting) »

Цитата:

Цитата Drongo
Я бы тоже не отказался узнать на него ответ. »

Пример со вторым прогрессбаром
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
; 7z SFX архивы
Source: Project1.exe; DestDir: {app}; AfterInstall: Unpack(ExpandConstant('{app}\Project1.exe')); Flags: ignoreversion
Source: Project2.exe; DestDir: {app}; AfterInstall: Unpack(ExpandConstant('{app}\Project2.exe')); Flags: ignoreversion

[_Code]
var
  ProgressBar: TNewProgressBar;

procedure InitializeWizard();
begin
  // создаём второй прогрессбар
  ProgressBar := TNewProgressBar.Create(WizardForm);
  with ProgressBar do begin
    Parent := WizardForm.InstallingPage;
    Left := WizardForm.ProgressGauge.Left;
    Top := WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + 15;
    Width := WizardForm.ProgressGauge.Width;
    Height := WizardForm.ProgressGauge.Height;
{ указываем на сколько секций разбить прогрессбар, в данном случае у нас 2 архива, вот и делим его на 2 части }
    Max := 2; //задается по количеству файлов имеющих AfterInstall: Unpack(... )
  end;
end;

procedure Unpack(Name: string);
var
  res: Integer;
begin
  WizardForm.StatusLabel.Caption:= 'Распаковка архива, ждите...';
  Exec(Name, ' -y', '', SW_HIDE, ewWaitUntilTerminated, res);
  DeleteFile(Name); // удаляем архив
  WizardForm.ProgressGauge.Position:= WizardForm.ProgressGauge.Position + 1; // двигаем второй прогрессбар
  ProgressBar.Position := ProgressBar.Position + 1; // двигаем родной прогрессбар
  WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
end;


Пример с диалоговым окном Extracting

Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
; 7z SFX архивы
Source: Project1.exe; DestDir: {app}; AfterInstall: Unpack(ExpandConstant('{app}\Project1.exe')); Flags: ignoreversion
Source: Project2.exe; DestDir: {app}; AfterInstall: Unpack(ExpandConstant('{app}\Project2.exe')); Flags: ignoreversion

[_Code]
procedure Unpack(Name: string);
var
  res: Integer;
begin
  Exec(Name, ' -y', '', SW_SHOWNORMAL, ewWaitUntilTerminated, res);
  DeleteFile(Name); // удаляем архив
end;


RedBishep 08-05-2009 15:14 1113777

Цитата:

Цитата Drongo
Одним сплошным файлом это сделать не получится, придётся только "бить" на части .bin. В секцию Setup добавь строки, которые выделены зелёным цветом »

Я сделал как ты сказал всё получилось,но есть одна маленькая проблема )
Когда я сделал Инсталлер он почему-то весил 5гб, хотя сама игра распакованная весила тоже 5гб
В чём может быть причина ?

Вот код может я что-то не то намудрил )))


Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
DiskSpanning=yes
SlicesPerDisk=1
DiskSliceSize=2100000000
DiskClusterSize=4096
ReserveBytes=0
AppId={{005F1D67-F860-4CEE-A7C5-020BB495A8B1}
AppName=Call Of Duty 4
AppVerName=Call Of Duty 4 MW
AppPublisher=RedBishep
DefaultDirName={pf}\Call Of Duty 4
DefaultGroupName=Call Of Duty 4
AllowNoIcons=yes
OutputDir=C:\Documents and Settings\Кнопка\Рабочий стол
OutputBaseFilename=setup
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "D:\Games\COD4\Call Of Duty SP.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Games\COD4\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\Call Of Duty 4"; Filename: "{app}\Call Of Duty SP.exe"
Name: "{group}\{cm:UninstallProgram,Call Of Duty 4}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Call Of Duty 4"; Filename: "{app}\Call Of Duty SP.exe"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Call Of Duty 4"; Filename: "{app}\Call Of Duty SP.exe"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\Call Of Duty SP.exe"; Description: "{cm:LaunchProgram,Call Of Duty 4}"; Flags: nowait postinstall skipifsilent


Drongo 08-05-2009 16:40 1113818

Думаю, эта строка лишняя
Цитата:

Цитата RedBishep
...
InternalCompressLevel=ultra
...»

Но дождитесь вердикта Serega_. Сам сделал бы так как привык:

Результат

Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{005F1D67-F860-4CEE-A7C5-020BB495A8B1}
AppName=Call Of Duty 4
AppVerName=Call Of Duty 4 MW
AppPublisher=RedBishep
DefaultDirName={pf}\Call Of Duty 4
DefaultGroupName=Call Of Duty 4
AllowNoIcons=yes
OutputDir=C:\Documents and Settings\Кнопка\Рабочий стол
OutputBaseFilename=Call of Duty IV
Compression=lzma/ultra
DiskSpanning=yes
SlicesPerDisk=1
DiskSliceSize=2100000000
DiskClusterSize=4096
ReserveBytes=0
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "D:\Games\COD4\Call Of Duty SP.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Games\COD4\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\Call Of Duty 4"; Filename: "{app}\Call Of Duty SP.exe"
Name: "{group}\{cm:UninstallProgram,Call Of Duty 4}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Call Of Duty 4"; Filename: "{app}\Call Of Duty SP.exe"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Call Of Duty 4"; Filename: "{app}\Call Of Duty SP.exe"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\Call Of Duty SP.exe"; Description: "{cm:LaunchProgram,Call Of Duty 4}"; Flags: nowait postinstall skipifsilent


Отличий нет, но я не думаю, что игра может быть сжата лучше и меньше 5 ГБ. У неё трудносжимаемые файлы. 5 ГБ это хорошо, хотя если бы сжалось на 600-700 МБ можно было бы втулить на один DVD диск 4.5. Здесь - Комментарий 10 я подсчитывал на сколько запакованных ГБ идёт выигрыш...
Цитата:

Цитата Drongo
Выигрыш составил на запакованные 2 ГБ -> 80 МБ »

В вашем случае, выигрыш должен быть, видимо около 200 МБ.

BlackSelf 08-05-2009 16:43 1113819

RedBishep, попробуйте заменить соответствующие строки на эти:
Compression=lzma/ultra64
InternalCompressLevel=ultra64

Drongo 08-05-2009 17:59 1113859

Цитата:

Цитата BlackSelf
попробуйте заменить соответствующие строки на эти:
Код:

Compression=lzma/ultra64
InternalCompressLevel=ultra64

»

Не думаю, что это даст ощутимый прирост.

BlackSelf 08-05-2009 18:31 1113884

Drongo, просто предложил.
RedBishep, если прироста нет, то посмотри, что в игре за файлы. Может тебе понизать битрейт у видео. Или, если там есть паки, распаковать их, сжать фриарком, а во время установки распаковать архивы и засунуть обратно в пак.
В своё время репак на CoD 4 MW делал cdman. Но он там ничего не пережимал (в плане видео и звука), но время установки было больше часа. Обычно он пользуется precomp + freearc. Отталкивайся от этого.

Serega 08-05-2009 20:24 1113923

Цитата:

Цитата RedBishep
Когда я сделал Инсталлер он почему-то весил 5гб, хотя сама игра распакованная весила тоже 5гб »

Исходя из вашего скрипта, такого не может быть... В вашем скрипте есть главные строки, указывающие на сжатие:
Код:

................
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
...............

Как говорят - Неверю... ;)
Цитата:

Цитата Drongo
Думаю, эта строка лишняя »

Это нужная строчка... т.е. значение по умолчанию - normal. Хотя в справке:
Цитата:

Цитата из Справки
Здесь указывается уровень LZMA сжатия. Нет смысла менять его со значения по умолчанию.

Здесь мы задаём сжатие не normal, а ultra, что жмёт гороздо лучше... ;)
Цитата:

Цитата BlackSelf
попробуйте заменить соответствующие строки на эти: »

Всё правильно, сжатие лучше, но и памяти ест больше... у меня при больших сборках выскакивает ошибка, что не хватает памяти, а у меня компьютер не такой уж и слабый... :)

Drongo 08-05-2009 20:52 1113938

Код:

...
Compression=lzma/ultra
...

Тоесть если мой скрипт будет содержать только одну строку вместо
Код:

Compression=lzma/ultra
InternalCompressLevel=ultra

То формально получается так:
Код:

Compression=lzma/ultra
InternalCompressLevel=normal

Так?

Serega 08-05-2009 21:55 1113984

Drongo, прежде всего извиняюсь, за не совсем исчерпывающий и не точный ответ...
InternalCompressLevel - мы задаём уровень сжатия, т.е. если указано просто:
Код:

Compression=lzma
если не указать InternalCompressLevel=ultra, то по умолчанию, будет InternalCompressLevel=normal
Это всё можно указать и в одной строке, т.е.:
Код:

Compression=lzma/ultra
мы сразу указываем сжатие и уровень его, хотя использование при этом строки InternalCompressLevel, не является ошибкой, а получается своего рода дубль...

P.S.
Всё выше сказанное, это теория, хотя в сборках, я всегда использую связку:
Код:

................
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
...............

и обратил внимание, что при использовании дополнительной строки InternalCompressLevel=ultra, не просто дублирует, а улучшает сжатие, т.е. размер получается немного меньше... из-за чего, не знаю...

Drongo 08-05-2009 22:14 1114008

Цитата:

Цитата Serega_
при использовании дополнительной строки InternalCompressLevel=ultra, не просто дублирует, а улучшает сжатие, т.е. размер получается немного меньше... »

Понял, спасибо за детальный ответ, я раньше использовал одну строку. Учту на будущее совет. :)

Serega 08-05-2009 22:54 1114040

Drongo, я забыл добавить ИМХО, т.е. это не является руководством, так сказать к употреблению. Это только мои выводы... ;)

nickgsm 09-05-2009 01:07 1114110

Код:

................
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
...............

При таком раскладе, не только лутше зжимает, но и сокращается время компиляции дистрибутива, и установки.

tem000 09-05-2009 12:50 1114291

Кстати у себя в разных скриптах нашел что функция SolidCompression может иметь значения
Код:

............................
SolidCompression=yes
SolidCompression=no
SolidCompression=true
SolidCompression=false
............................

кто знает в чем разница в справке про эти значения ваще ни слова не сказано?

Serega 09-05-2009 13:12 1114305

Цитата:

Цитата tem000
Кстати у себя в разных скриптах нашел что функция SolidCompression может иметь значения »

Прежде всего:
Цитата из Справки
Код:

Возможные значения:yes or no

Значение по умолчанию:no

Описание:

При значении yes включается уплотненное сжатие. Результат такого сжатия будет лучше, особенно если инсталлятор содержит файлы одного типа и эти файлы сгруппированы в секции [Files]. Убедитесь, что Compression=lzma или Compression=bzip, т.к. берущийся по умолчанию zip не позволяет выгодно использовать уплотненное сжатие (потому что работает с меньшими блоками).

Неудобство использования уплотненного сжатия в том, что так как все файлы сжаты единым потоком, инсталлятор не может беспорядочно обращаться к любому из файлов. Это может тормозить работу. Если определенный файл не будет устанавливаться в систему пользователя, данные все равно придется декомпрессировать (в память) для того, чтобы инсталлятор получил доступ к следующему файлу. И если, допустим, в процессе декомпрессии возникнет ошибка и пользователь нажмет Retry, инсталлятор не сможет обратиться в файлу, в котором возникла ошибка, потому что все файлы сжаты в один файл, и придется производить повторную попытку с нуля. Если включено разбиение на диски, пользователь должен будет снова ставить первый диск.

В общем, уплотненное сжатие не рекомендуется применять к большим по размеру инсталляторам (скажем, больше 100 MB) или если используется разбиение на диски. Эта директива служит для того, чтобы при скачивании из Internet маленьких приложений экономилось время.


Из этого понятно, что SolidCompression=yes/no - противоречит изначально само себе, т.е. это из разряда нельзя казнить помиловать... Человеку свойственно ошибаться, а компьютер помогает ему это делать ещё быстрее... Это строка ошибочна, т.е. скорей всего срабатывает последний ключ no...
SolidCompression=true - это то же самое, что SolidCompression=yes;
SolidCompression=false - это то же самое, что SolidCompression=no...

tem000 09-05-2009 13:26 1114314

Цитата:

Цитата Serega_
Это строка котигорически не правильная, т.е. скорей всего сробатывает последний ключь no... »

Serega_, я просто так написал, знаю что может быть только yes или no. Просто хотелось узнать для чего нужны другие параметры, в принципе я так и думал что это вроде альтернативных вариантов, и изменений никаких не происходит при замене
Код:

SolidCompression=yes  на  SolidCompression=true

SolidCompression=no  на  SolidCompression=false


Serega 09-05-2009 13:48 1114325

tem000, я изначально написал, затем подкорректировал, свою резкость и безграмотность… ;)
Цитата:

Цитата tem000
я просто так написал »

И совершенно правильно сделали :up:, ведь не для всех понятно, как на самом деле правильно должно быть... ;)
А вообще, я обратил внимание на то, что стало появляться всё больше безграмотных скриптов, т.е. кто-то изначально сделал ошибку, а затем как ком всё вокруг нагромоздили и попытались объединить с другим…
Поэтому и необходимо рассказывать, как сделать правильно, указав на возможные ошибки...

Krekerpro 11-05-2009 12:09 1115360

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

[Files]
Source: D:\Games\123\SUPPORT\TOOLS\TOOLS.exe; DestDir: {app}; Flags: ignoreversion external deleteafterinstall
[Run]
Filename: {app}\SUPPORT\TOOLS\TOOLS.exe; WorkingDir: {app}; Parameters: -x archive.7z -y -o; StatusMsg: Идет распаковка архива...


Serega 11-05-2009 12:29 1115373

Цитата:

Цитата Krekerpro
мне надо что бы после разархивирования,архив удалялся автоматически »

Судя по вашему примеру, он у вас удаляется автоматически, о чём свидетельствует флаг deleteafterinstall
Цитата:

Цитата из Спраки
deleteafterinstall

Указывает инсталлятору устанавливать файл как обычно, но удалять его после завершения (или прерывания) установки. Это может быть полезно, когда извлекаемые временные файлы нужны программе для выполнения в секции [Run] скрипта.

Этот флаг не удалит файл, существующий до начала установки, после этой установки.

P.S.
Заметил у вас ошибку:
Вы пишите путь D:\Games\123\SUPPORT\TOOLS\TOOLS.exe, а во флагах пишете external, что говорит инсталлятору о том, что файл внешний, т.е. инсталлятор будет работать, только у вас на компьютере.
Нужно: удалить флаг external или путь написать {src}\TOOLS.exe и положить архив рядом с инсталлятором...

Krekerpro 11-05-2009 18:53 1115617

Serega_,
Что токо не пробовал,всё равно не удаляется :(

BlackSelf 11-05-2009 19:00 1115621

Krekerpro, у вас написано, что TOOLS.exe копируется в {app}. Потом вы даёте команду распаковки по другому пути {app}\SUPPORT\TOOLS\TOOLS.exe
В конце концов можете написать так:
[Run]
Filename: {app}\TOOLS.exe; WorkingDir: {app}; Parameters: -x archive.7z -y -o; StatusMsg: Идет распаковка архива...
Filename: "cmd.exe"; Parameters: "/C del /F /Q TOOLS.exe"; WorkingDir: "{app}";

Serega 11-05-2009 19:55 1115663

Цитата:

Цитата BlackSelf
Krekerpro, у вас написано, что TOOLS.exe копируется в {app}. Потом вы даёте команду распаковки по другому пути {app}\SUPPORT\TOOLS\TOOLS.exe »

BlackSelf, вы совершенно правы, только параметр для SFX архива должен быть просто -y.
можно сделать как вы предлагаете или записать так:
Код:

[Files]
Source: D:\Games\123\SUPPORT\TOOLS\TOOLS.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall
[Run]
Filename: {app}\TOOLS.exe; WorkingDir: {app}; Parameters: -y; StatusMsg: Идет распаковка архива...


Krekerpro 11-05-2009 21:42 1115721

Serega_,
BlackSelf,
Вот так удаляется но,не в ту папку куда надо распаковывается :(

Serega 11-05-2009 23:28 1115842

Цитата:

Цитата Krekerpro
не в ту папку куда надо распаковывается »

Из вашего примера, не понятно куда надо распаковывать архив. Для того, чтоб задать каталог распаковки используйте ключ -o, т.е.:
Код:

[Run]
Filename: {app}\TOOLS.exe; WorkingDir: {app}; Parameters: -y -o'{app}\TOOLS'; StatusMsg: Идет распаковка архива...


BlackSelf 12-05-2009 00:48 1115912

На фоне уже есть картинка. Нужно сверху неё наложить ещё одну маленькую картинку с прозрачностью. Пробовал через gifctrl.dll, но не получилось.
Подскажите, пожалуйста, как это сделать?

Serega 12-05-2009 09:14 1116016

BlackSelf, покажите скрипт, как вы делаете и если есть скриншот, что хотите в итоге увидеть.

Dukalis 12-05-2009 18:48 1116626

Подскажите пожалуйста как сделать так, чтобы унинсталлер сначала закрывал уже работающую программу и лишь затем начинал её удаление? Что и где в скрипте прописать?

Serega 12-05-2009 19:33 1116658

Dukalis, пример - пост 549.

Dukalis 12-05-2009 20:55 1116729

Serega_, Спасибо за помощь! Компилятор выдаёт ошибку (Column 5:Unknown identifier 'UninstallProgressForm') в этой строчке:
UninstallProgressForm.Visible := False;

Serega 12-05-2009 21:25 1116761

Dukalis, у меня просто раширенная версия от Restools, т.е. у меня ошибок не выдаёт...
Закомментируйте эти две строки в скрипте:
// UninstallProgressForm.Visible := False;
// UninstallProgressForm.Visible := True;

daniil-bond 13-05-2009 11:08 1117167

В инсталяторе запускаю скрипты, который заливают данные в базу. Так вот как можно обрабатывать ошибки если не запущен OracleXE??? Может как нибудь перед запуском скриптов делать проверку запущен ли Oracle???

p3rf3ct1c 13-05-2009 23:45 1117794

Здравствуйте! Можете помоч с сохранениями игры? Как мне сделать чтобы после удаления игры сохранения удалялись через программу killsave которые находятся тут - C:\ProgramData\2DBoy\WorldOfGoo? Или если есть другие способы можете подсказать?

И еще вопрос, можете подсказать как склеивать коды, чтобы не вылезало никаких ошибок?

Serega 15-05-2009 17:24 1119368

Цитата:

Цитата p3rf3ct1c
Как мне сделать чтобы после удаления игры сохранения удалялись »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
SolidCompression=yes

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}

[code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  Res: Integer;
begin
  case CurUninstallStep of
    usPostUninstall:
    begin
      //Проверяем присутствие папки после удаления
      If DirExists(ExpandConstant('{app}')) then
      //Создаем диалог с тремя кнопками
      case MsgBox('Папка "' + ExpandConstant('{app}') + '" не пуста.'#13#13 +
          '"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
          '"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
          '"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of
      IDYES:
        begin
          if not DelTree(ExpandConstant('{app}'), True, True, True) then
          MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);
        end;
      IDNO:
        begin
          if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
          MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);
        end;
      IDCANCEL:
        begin
          Exit;
        end;
      end;
    end;
  end;
end;


Цитата:

Цитата p3rf3ct1c
можете подсказать как склеивать коды, чтобы не вылезало никаких ошибок? »

Если коротко, то - правильно склеивать...
Имена процедур или функций могут быть только в одном экземпляре внутри одного скрипта. После имени процедуры или функции может идти var, где вы задаёте переменные, которые будут использованы только в данной процедуре или функции. Затем всегда идёт begin - начало выполнения, а заканчивается - end;... Я даже не знаю, что можно сказать, всё приходит с пониманием того, что вы делаете...

p3rf3ct1c 15-05-2009 18:45 1119452

Serega_,
Почему то при компиляции выдает ошибку


Serega 15-05-2009 19:15 1119476

p3rf3ct1c, здесь говориться:
Неожиданное исключение класса в препроцессоре.
Нарушение доступа в адресе модуля ISCmplr.dls

Попробуйте переустановить Inno Setup, т.е. эта ошибка не связанна с приведённым мной скриптом.

p3rf3ct1c 15-05-2009 20:22 1119542

Serega_,
Спасибо, переустановил, ошибки нет, но хотелось бы чтобы при удалении удалялись сохранения которые находятся не в папке с игрой а в другом месте, например в моих документах, или appdata или programdata, как прописать путь или чтобы программа сама их нашла и удалила?

Serega 15-05-2009 20:50 1119571

Цитата:

Цитата p3rf3ct1c
например в моих документах, или appdata или programdata, как прописать путь »

Посмотрите внимательно скрипт, там есть строки:
Код:

...........................
      //Проверяем присутствие папки после удаления
      If DirExists(ExpandConstant('{app}')) then
..........................

Допустим, нам надо проверить наличие папки в Моих документах, тогда пишем так:
Код:

...........................
      //Проверяем присутствие папки после удаления
      If DirExists(ExpandConstant('{userdocs}\My Program')) then
..........................


p3rf3ct1c 15-05-2009 21:02 1119580

Serega_,
Цитата:

Цитата Serega_
//Проверяем присутствие папки после удаления
If DirExists(ExpandConstant('{userdocs}\My Program')) then »

А, понятно, извиняюсь что не заметил, я просто новичок в inno.

А как проверить наличие папки в appdata или programdata?

Serega 15-05-2009 21:51 1119623

p3rf3ct1c, почитайте Справку, найдёте много интересного...
Цитата:

Цитата из Справки, раздел Константы
{userappdata} & {commonappdata}

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

а programdata - это какая-то ваша папка? Если у неё путь, который вы указывали ранее C:\ProgramData\2DBoy\WorldOfGoo, то {sd}\ProgramData\2DBoy\WorldOfGoo, где {sd} - системный диск.

p3rf3ct1c 15-05-2009 23:12 1119678

Serega_,
Спасибо вам! Все получилось.

C:\ProgramData\ у меня скрытая папка как и Application Data, в XP вроде нет папки ProgramData (хотя не знаю) , а у мебя сейчас стоит Win7. Эта папка вроде и в Висте есть.

BlackSelf 16-05-2009 05:20 1119790

p3rf3ct1c, путь к ProgramData в Висте и семерке обозначает константа {commonappdata}, то есть в твоем случае лучше написать так:
Код:

...................................
      //Проверяем присутствие папки после удаления
      If DirExists(ExpandConstant('{commonappdata}\2DBoy\WorldOfGoo')) then
...................................


p3rf3ct1c 16-05-2009 12:05 1119909

BlackSelf,
Спасибо.

А вы можете подсказать почему у меня в Unpacker'е кнопки не работают, кроме кнопки "Открыть"?

Unsane 17-05-2009 12:13 1120592

Вешаю обработчик на изменение комбобокса "тип установки":
PHP код:

WizardForm.TypesCombo.OnChange := @TypesComboOnChange

Перестает отрабатываться смена типов (компоненты не изменяются при изменении типа установки). Без обработчика все нормально. Как можно обойти проблему?

Serega 17-05-2009 12:41 1120613

Цитата:

Цитата Unsane
Перестает отрабатываться смена типов (компоненты не изменяются при изменении типа установки). Без обработчика все нормально. »

Приведите пример, как вы делаете. Хотя теоретически, всё правильно, т.е. всё зависит от того, что вы пишите в процедуре TypesComboOnChange.
Задав свою процедуру вы переопределяете стандартную смену ComboBox'а, заданного по умолчанию.

Unsane 17-05-2009 13:01 1120626

От содержимого обработчика вообще ничего не зависит. Повесил пустой обработчик - 0 реакции.
PHP код:

procedure TypesComboOnChangeT(SenderTObject);  begin  end;

procedure InitializeWizard();
begin
  WizardForm
.TypesCombo.OnChange := @TypesComboOnChangeT;
end

Есть ли возможность вызвать эту стандартную процедуру или сделать ее эмуляцию?

з.ы. еще заметил, что из-за этого косяка не отрабатывается установка некоторых компонентов.

Serega 17-05-2009 14:31 1120676

Цитата:

Цитата Unsane
Есть ли возможность вызвать эту стандартную процедуру или сделать ее эмуляцию? »

Вызвать стандартную - нет, придётся прописывать всё в ручную, а это...
Цитата:

Цитата Unsane
заметил, что из-за этого косяка не отрабатывается установка некоторых компонентов. »

такое скорей всего вряд ли, по крайней мере я не думаю, чтоб изменение в стандартной процедуре TypesCombo.OnChange, как-то влияло на саму установку.

А что вы вообще хотите задать в TypesComboOnChangeT, просто может это можно решить стандартными способами? Объясните, что вы хотите увидеть?

Unsane 17-05-2009 15:34 1120713

Итак, некоторое время назад, я писал здесь вопрос по поводу выбора языка.
Я написал функцию, которая при показе формы "wpSelectComponents" перебирает компоненты и "насильно" выделяет "радиобатон" того языка, который был выбран как язык инсталлятора.
Есть в этом подходе косяк - при смене типа установки язык сбрасывается в "первоначальное" (т.е. то, каким бы он был без моего программного вмешательства) положение.
Вот на изменение комбобокса "тип установки" хочу повесить процедура проверки, которая будет возвращать нужный язык.

Serega 17-05-2009 16:29 1120738

Цитата:

Цитата Unsane
Итак, некоторое время назад, я писал здесь вопрос по поводу выбора языка.
Я написал функцию, которая при показе формы "wpSelectComponents" перебирает компоненты и "насильно" выделяет "радиобатон" того языка, который был выбран как язык инсталлятора. »

Да, помню, было такое... Я подумал, что вы уже решили эту задачу...
Попробуйте такой вариант
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
SolidCompression=yes
;ComponentsListTVStyle=true

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Languages\English.isl

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: a\a; Description: Руководство пользователя; Types: full
Name: a\a\a; Description: Русский; Flags: exclusive
Name: a\a\b; Description: English; Flags: exclusive
Name: a\b; Description: Справка; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\Readme-ru.txt; DestDir: {app}; Components: a\a\a
Source: compiler:Examples\Readme-en.txt; DestDir: {app}; Components: a\a\b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a\b

[_Code]
procedure InitializeWizard;
begin
  if ActiveLanguage = 'rus' then
  WizardForm.ComponentsList.Checked[2]:= True else
  WizardForm.ComponentsList.Checked[3]:= True;
end;


Unsane 17-05-2009 18:22 1120791

Интегрировал Ваш пример в скрипт - не работает. Запустил в новом - работает.
Начал разбираться и нашел корень ошибки - невнимательность.
Выделение прыгало из-за следующего:
Код:

Name: language\english; Description: {cm:EnglishLanguage}; Types: type1 type2 type3; Flags: exclusive 
Name: language\russian; Description: {cm:RussianLanguage}; Types: type1 type2 type3; Flags: exclusive

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

Спасибо :clapping:

Potursak 18-05-2009 15:19 1121532

Какой камандой можно автоматически запустить файл после его установки?

Serega 18-05-2009 16:48 1121627

Цитата:

Цитата Potursak
Какой камандой можно автоматически запустить файл после его установки? »

Код:

[Run]
Filename: {app}\MyProg.exe; Description: Запустить программу MyProg?; Flags: postinstall nowait skipifsilent


Potursak 18-05-2009 17:31 1121652

Serega_, а как сделать вот такие кнопочки у меня вот такие

Отличие одних от других думаю вы знаете-по статусу положенно.Я нашел решение как открыть приложенеи после его установки сам:
Код:

[Run]
Filename: {win}\Musik.exe;

Тодга не будет создаватся такой диалог
Приложение просто запускается-проще!

boss911 18-05-2009 18:03 1121668

Цитата:

Цитата Potursak
а как сделать вот такие кнопочки»

На каждом компоненте либо задаче, в зависимости, где вам нужно, укажите флаг exclusive, например:
Код:

[Components]
Name: MyName; Description: Компонент #1; Flags: exclusive
либо
[Tasks]
Name: MyName; Description: Задача #1; Flags: exclusive


Potursak 18-05-2009 18:25 1121682

boss911, это конечно я уверен правильно но почему у меня вот такая ошибка

boss911 18-05-2009 18:33 1121689

Potursak, приведите пример, кусок скрипта (всех строк компонентов или задач). В этот флаг указали только в секции Components, либо в Tasks, или еще где-то?

Serega 18-05-2009 18:48 1121701

Potursak, ошибка говорит о том, что параметр флага, включает неизвестный флаг, т.е. вы просто записали не правильно слово exclusive или там присутствует ещё какой-то флаг...
boss911, правильно сказал, привидите пример своего скрипта.

Potursak 18-05-2009 18:52 1121707

boss911,

Вот кусочек

Код:

[Types]
Name: "custom"; Description: "Выборочная установка"; Flags: exclusive
[Files]
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\1.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com1";  DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\2.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com2";  DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\3.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com3";    DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\4.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com4";    DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\5.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com5";    DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\6.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com6";    DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\7.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com7";    DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\8.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com8";    DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\9.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com9";    DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\10.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com10";  DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\11.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com11";  DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\12.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com12";  DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\13.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com13";  DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\14.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com14";  DestName: "ViOrb.exe";
Source: "C:\Documents and Settings\Администратор\Рабочий стол\Новая папка\{sys}\15.exe"; DestDir: "{win}"; Flags: deleteafterinstall ignoreversion ; Components: "Com15";  DestName: "ViOrb.exe";


Serega 18-05-2009 19:11 1121727

Potursak, прочитайте внимательно, что вам говорил boss911,
Цитата:

Цитата boss911
Код:

[Components]
Name: MyName; Description: Компонент #1; Flags: exclusive
либо
[Tasks]
Name: MyName; Description: Задача #1; Flags: exclusive

»

этот флаг используется только в этих секциях... зачем его записывать в секцию [Types]? У вас используется секция [Components], туда и записываете этот флаг, у тех компонентов, которые должны иметь RadioButton.

Potursak 18-05-2009 21:55 1121835

Очень хочется разобратся как Проказзза в этой теме сделал тихий инсталятор использующий INF файл для выбора памятки и сам файл установки Run.exe.
Цитата:

Цитата prokazzza
Для интеграции нужной памятки в дистрибутив, занесите нужную памятку в файл Run.inf
Components=com1 »

Как мне кажется там ссылка на файл идет с определенным параметром.

Serega 18-05-2009 22:26 1121860

Potursak, в этом inf файле указывается, какой из компонентов устанавливать. Почитайте Справку: Параметры командной строки инсталлятора, ключи /SAVEINF и /LOADINF.
Или можете посмотреть у меня в подписи, нажмите на Inno Setup и там есть ссылка на Параметры командной строки инсталлятора.

HeIsTheHighlander 22-05-2009 00:28 1124570

Просьба подсказать по автоустановке BDE (Borland Database Engine). Сделан инсталлятор в Inno версии 1.2.9. Ключи
/VERYSILENT и /saveinf не работают. Кто скажет, что с ней делать? Я вижу два варианта:

1) Разбирать на файлы/скрипт и собирать самому - не хочется т.к. опыта нет, мне крайне важно чтобы не было никаких побочных действий;
2) Писать программу, которая отыщет окошко и сама понажимает кнопки - хочется чего-то более простого и изящного.

Вроде более новой BDE не видал нигде - да и помню, что Борланд отказалась от этой технологии.

Может, кто-нибудь что-нибудь еще подскажет?

Ссылка на мой инсталлер: http://ifolder.ru/12238956

P.S. Прикрепить не смог, пишет, что я квоту на 1.67Мб превысил (файл около 2.61Мб), хотя у меня вообще нет других аттачей.

boss911 22-05-2009 06:48 1124665

Цитата:

Цитата HeIsTheHighlander
Разбирать на файлы/скрипт и собирать самому - не хочется »

А чем вы ее распакуете (файлы/скрипт)? Анпакером точно не получится, поддержка распаковки начинается от версии 2.0.18, по заявлению автора. Пощупав инсталлятор, я даже не понял, чем он скомпилен, если честно.

HeIsTheHighlander 22-05-2009 11:54 1124816

Uniextract последний распаковывает. Получаются файлы:
bantam.dll
flist.bin
install.exe
script.bin
setup.msg
uninst.exe

и папка, содержащая, судя по всему, союственно файлы BDE:
{app}

Drongo 22-05-2009 12:47 1124856

Цитата:

Цитата boss911
Пощупав инсталлятор, я даже не понял, чем он скомпилен, если честно. »

Я тоже пощупал, правда не понял что это такое:
Код:

Inno Setup Module Heuristic Mode [Overlay]

Serega 22-05-2009 20:13 1125203

Цитата:

Цитата HeIsTheHighlander
Просьба подсказать по автоустановке BDE (Borland Database Engine). »

тогда, вам сюда.
Интересная получается штука, инсталлятор, про который вы говорите, действительно собран в Inno Setup версии 1.2.9, но в теме автоустановки говорят, что инсталлятор собран в InstallShield.
Вывод, значит это пересобранный инсталлятор и причём программа какая-то урезанная. Сделал такой вывод из-за того, что нашёл так же пересобранный инсталлятор, но собранный в Wise, так он размером 4,76Мб и он более похож на нормальный, т.е. в нём присутствуют помимо тех, которые есть в вашем инсталляторе ещё дополнительные файлы:
читать дальше »

BDE32.CNT
BDE32.HLP
BDEADMIN.CNT
BDEADMIN.CPL
BDEADMIN.HLP
CEEUROPE.BTL
DATAPUMP.CNT
DATAPUMP.EXE
DATAPUMP.HLP
EUROPE.BTL
FAREAST.BTL
IDAPI32.CFG
JAPAN.BTL
LOCALSQL.CNT
LOCALSQL.HLP
USA.BTL

а так же в момент установки происходит регистрация библиотек в системе, что кстати ваш инсталлятор не делает...

Попробуйте найти оригинальный инсталлятор BDE.

P.S.
Если всё же этот инсталлятор вас устраивает, то чтоб установить его тихо, его нужно пересобрать, т.к. ключ /verysilent он не поддерживает...

HeIsTheHighlander 23-05-2009 09:30 1125497

Спасибо большое!

tem000 23-05-2009 18:17 1125796

Ребят, у меня вопрос при распаковке некоторых инсталяторов исполняемые файлы программы имеют вид например:

Music Downloader,1.exe
Music Downloader,2.exe

хотя оба файла имеют абсолютно одинаковый размер и прога запускается как с одного так и с другого файла, а при установке приложения они объединяются в один файл. В чем смысл кто в курсе???

HeIsTheHighlander 23-05-2009 18:52 1125821

сделайте двоичное сравнение файлов (в том же Тотал Коммандере), либо выложите оба файла (по возможности со всеми остальными).

Serega 23-05-2009 21:09 1125898

Цитата:

Цитата tem000
у меня вопрос при распаковке некоторых инсталяторов исполняемые файлы программы имеют вид например:

Music Downloader,1.exe
Music Downloader,2.exe

хотя оба файла имеют абсолютно одинаковый размер и прога запускается как с одного так и с другого файла, а при установке приложения они объединяются в один файл. В чем смысл »

Прежде всего, инсталляторы делают люди... :) Это получается, если при сборке инсталлятора, два раза указать один и тот же файл, т.е. все хоть раз пользовались мастером при создании скрипта для своего инсталлятора.
Если вы скомпилируете инсталлятор из данного скрипта:
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}
Source: compiler:Examples\*; DestDir: {app}


то после распаковки данного инсталлятора, у вас будут помимо других, два одинаковых файла, но с разными именами:
MyProg,1.exe
MyProg,2.exe
Это как раз говорит о том, что мы два раза указываем файл MyProg.exe, в секции [Files], а инсталлятор автоматом их переименовывает.
В итоге после установки мы получим один файл MyProg.exe, просто один перезапишет другой...
Как таковой, ошибки тут нет, просто человеческий фактор... :)

BlackSelf 24-05-2009 19:59 1126506

Подскажите, как сделать проверку на кириллицу в пути установки, чтобы, если содержались русские буквы, то выводилось соответствующее сообщение и просьба об изменении директории?

Serega 24-05-2009 20:09 1126515

BlackSelf, теоретически, сделать можно, а какая преследуется цель?
Вы расскажите поподробней, что вы хотите сделать и почему нежелательны русские буквы?

BlackSelf 24-05-2009 20:23 1126529

Если есть кириллица, при нажатии на кнопку "далее" появляется messagebox с текстом.
Делаю это из-за того, что зачастую в батнике при распаковке архива появляются крякозябры. И, естественно, архивы распаковываются не в нужную директорию.

Serega 24-05-2009 23:17 1126700

BlackSelf,
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={userdocs}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[_Code]
var
  i: Integer;
  path: string;

function CheckWay(s: string):Boolean;
begin
  i:= 1;
  Result:= False;
  repeat
    if Pos(Chr(Ord('А')+i-1), s) > 0 then
    Result:= True;
    i:= i + 1;
  until (Result = True) or (i = 64);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result:= True;
  if CurPageID = wpSelectDir then begin
    path:= WizardForm.DirEdit.Text;
    if path <> '' then
    if CheckWay(path) = True then begin
      MsgBox('Выберете другую папку, чего-то она не такая... ой, так там же русские буквы... :) ', mbInformation, MB_OK);
      Result:= False;
    end;
  end;
end;


BlackSelf 24-05-2009 23:32 1126718

Serega_, мерси.

grinda 26-05-2009 13:53 1127908

Напишите плиз поподробнее как пользоваться анпакером?

Serega 26-05-2009 15:29 1127972

Цитата:

Цитата grinda
Напишите плиз поподробнее как пользоваться анпакером? »

Насколько я помню, там вместе с анпакером идёт справка, какие ключи использовать...
Есть и обновление:

Inno Setup Unpacker (innounp plus) - расширенная версия распаковщика инсталляторов Inno Setup начиная с версии 2.0.8 по 5.3.0 Beta. Поддерживаются версии Unicode. Русифицирована.
Последний релиз: 0.24 [23.05.2009] - Скачать 0.24 | Зеркало 1 | Зеркало 2

P.S.
Справка по использованию на русском.

volk1234 26-05-2009 17:29 1128041

Поднял ссылки в шапку, чуток ее скоректировал.
А скажите ссылки на Unpaker 2.0 и Unpaker 0.23, можно удалить тогда?

Serega 26-05-2009 17:47 1128054

Цитата:

Цитата volk1234
ссылки на Unpaker 2.0 и Unpaker 0.23, можно удалить тогда? »

Я думаю лучше Unpaker 0.23 оставить и добавить в строчку с Unpaker 0.24, т.к. это от одного производителя - расширенная китайская версия (модификация), а версию Unpaker 2.0, нужно заменить на более новую, стандартную версию:

Unpaker 2.1 от [21.04.2009] - распаковывает инсталляторы, созданные с помощью Inno Setup, начиная с версии 2.0.18 по 5.2.4.

p3rf3ct1c 28-05-2009 11:12 1129320

Здравствуйте всем. Кто нибудь пожалуйста помогите склеить эти коды -
читать дальше »
Цитата:

type
PDisplay_Device = record
cb: DWord;
DeviceName: array [0..31] of char;
DeviceString: array [0..127] of char;
StateFlags: DWord;
DeviceID, DeviceKey: array [0..127] of char;
end;

TMixerCaps = record
vPid, vDriverVersion: DWord;
sName: array [0..31] of char;
Support, cDestinations: DWord;
end;

// Ïðîâåðêà âåðñèè Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
{Win9x}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
{WinNT}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
oneMB = 1024*1024;
NeedMHz = 1800;
NeedVideoRAM = 128;
NeedSoundCard = 'Creative X-Fi';
NeedMB = 512;
NeedPageFile = 1024;

var
InfoPage: TWizardPage;
TopText, BottomText: TNewStaticText;
ChangeText: Boolean;
SystemPanel, ProcessorPanel, VideoPanel,
AudioPanel, RAMPanel, PageFilePanel: TMemo;
SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
lpCaps: TMixerCaps;
Version: TWindowsVersion;
MemoryEx: TMemoryStatusEx;
n, errCode: Integer;
Keys: TArrayOfString;
DeviceValue: Cardinal;
lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
external 'GetSystemMetrics@user32.dll stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
external 'GetDeviceCaps@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
external 'CreateDCA@GDI32 stdcall';

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
external 'EnumDisplayDevicesA@user32.dll stdcall';

function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
external 'mixerGetDevCapsA@winmm.dll stdcall';

function mixerGetNumDevs: Integer;
external 'mixerGetNumDevs@winmm.dll stdcall';

// Äîïîëíèòü ÷èñëî äî êðàòíîãî Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
Result := (Bytes/Multiple + 1)*Multiple
else
Result := Bytes
end;

// Ïåðåâîä ÷èñëà â çíà÷åíèå Áò/Êá/Ìá/Ãá/Òá (äî 3õ çíàêîâ ïîñëå çàïÿòîé)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
if not noMB then
Result := FloatToStr(Int(Bytes)) + ' Ìá'
else
if Bytes < 1024 then
Result := FloatToStr(Int(Bytes)) + ' Áò'
else
if Bytes/1024 < 1024 then
Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Êá'
else
if Bytes/oneMB < 1024 then
Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Ìá'
else
if Bytes/oneMB/1000 < 1024 then
Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Ãá'
else
Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Òá'
StringChange(Result, ',', '.')
end;

// Óäàëåíèå íà÷àëüíûõ, êîíå÷íûõ è ïîâòîðíûõ ïðîáåëîâ
function DelSp(String: String): String;
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1)
Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2
for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

function CheckCPU(NeedMHz: Integer): Boolean;
var
String: String;
begin
String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys) // Êîëè÷åñòâî ÿäåð
for n := 0 to GetArrayLength(Keys)-1 do
RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
Exit
else
Result := True
end;

function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
MemoryEx.dwLength := SizeOf(MemoryEx)
if not GlobalMemoryStatusEx(MemoryEx) then
MsgBox('Îøèáêà ôóíêöèè:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
else
if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
Exit
else
Result := True
end;

procedure CreateCheckForm();
begin

TopText := TNewStaticText.Create(InfoPage)
with TopText do
begin
Parent := InfoPage.Surface
Left := 0
AutoSize := True
end

BottomText := TNewStaticText.Create(InfoPage)
with BottomText do
begin
Parent := InfoPage.Surface
Caption := 'Êîãäà Âû áóäåòå ãîòîâû ïðîäîëæèòü óñòàíîâêó, íàæìèòå «Äàëåå».'
Font.Color := clBlack
Left := 0
Top := 200
AutoSize := True
end

SystemPanel := TMemo.Create(InfoPage)
with SystemPanel do
begin
Text := 'Ñèñòåìà'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ScaleY(33)
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

SystemVersionPanel := TMemo.Create(InfoPage)
with SystemVersionPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := SystemPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

ProcessorPanel := TMemo.Create(InfoPage)
with ProcessorPanel do
begin
Text := 'Ïðîöåññîð'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := SystemPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

ProcessorMHzPanel := TMemo.Create(InfoPage)
with ProcessorMHzPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := ProcessorPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

VideoPanel := TMemo.Create(InfoPage)
with VideoPanel do
begin
Text := 'Âèäåîàäàïòåð'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ProcessorPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

VideoRAMPanel := TMemo.Create(InfoPage)
with VideoRAMPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := VideoPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

AudioPanel := TMemo.Create(InfoPage)
with AudioPanel do
begin
Text := 'Çâóêîâàÿ êàðòà'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := VideoPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

AudioNamePanel := TMemo.Create(InfoPage)
with AudioNamePanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := AudioPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

RAMPanel := TMemo.Create(InfoPage)
with RAMPanel do
begin
Text := 'Îáú¸ì ïàìÿòè'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := AudioPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

RAMTotalPanel := TMemo.Create(InfoPage)
with RAMTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := RAMPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

PageFilePanel := TMemo.Create(InfoPage)
with PageFilePanel do
begin
Text := 'Ôàéë ïîäêà÷êè'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := RAMPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;

PageFileTotalPanel := TMemo.Create(InfoPage)
with PageFileTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := PageFilePanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

end;

procedure UpdateInfo();
var
DeviceName, DeviceKey: String;
begin
ChangeText := False

GetWindowsVersionEx(Version)

// Îïåðàöèîííàÿ ñèñòåìà:
SystemVersionPanel.Color := $CCFFCC

DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
DeviceName := DeviceName + ' ' + DeviceKey
StringChange(DeviceName, 'Microsoft ', '')
SystemVersionPanel.Text := ' ' + DeviceName + ' ñáîðêà ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
'.' + IntToStr(Version.Build)

if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and // Windows 2000 SP4
(Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and // Windows XP SP2
(Pos('Vista', SystemVersionPanel.Text) = 0) then // Windows Vista (c ëþáûì SP èëè áåç íåãî)
begin
SystemVersionPanel.Color := $CCCCFF
ChangeText := True
end

// Ïðîöåññîð:
ProcessorMHzPanel.Color := $CCFFCC

if not CheckCPU(NeedMHz) then
begin
ProcessorMHzPanel.Color := $CCCCFF
ChangeText := True
end

ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
if GetArrayLength(Keys) > 1 then
ProcessorPanel.Text := 'Ïðîöåññîðû' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

// Âèäåîêàðòà:
VideoRAMPanel.Color := $CCFFCC

lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
DeviceKey := ''
n := 0
while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
(lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127) // Êëþ÷ äðàéâåðà ïîëó÷àåì èç API
StringChange(DeviceKey, '\Registry\Machine\', '')
errCode := 1
DeviceValue := 0
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
for n := 1 to Length(DeviceName) do
begin
DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
errCode := errCode*$100
end
else
if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
else
RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
DeviceName := ''
for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

if DeviceName <> '' then
if DeviceValue > 0 then
VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
else
VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
else
begin
VideoRAMPanel.Text := ' Äðàéâåð óñòðîéñòâà íå îáíàðóæåí'
VideoRAMPanel.Color := $CCCCFF
ChangeText := True
end
if (DeviceValue/oneMB < NeedVideoRAM) then
begin
VideoRAMPanel.Color := $CCCCFF
ChangeText := True
end
VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

// Çâóêîâàÿ êàðòà:
AudioNamePanel.Color := $CCFFCC

// for errCode := 0 to 1 do // Âûâîä îñíîâíîãî çâóêîâîãî óñòðîéñòâà
for errCode := 0 to mixerGetNumDevs do
begin
mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
DeviceName := ' '
for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
Delete(DeviceName, Pos(' [', DeviceName), 31)
StringChange(DeviceName, 'SB ', 'Creative ')
Delete(DeviceName, Pos(' Audio', DeviceName), 31)
SetArrayLength(Keys, errCode)
if errCode > 0 then Keys[errCode-1] := DeviceName
end

if GetArrayLength(Keys) > 1 then
begin
AudioPanel.Text := 'Çâóêîâûå êàðòû'
// AudioPanel.Text := 'Çâóêîâûå êàðòû (' + IntToStr(GetArrayLength(Keys)) +')'
AudioNamePanel.Text := ''
for n := 1 to GetArrayLength(Keys) do
AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1] // + '(' + IntToStr(n) + ')'
end
else
if GetArrayLength(Keys) = 0 then
begin
AudioNamePanel.Text := ' Äðàéâåð óñòðîéñòâà íå îáíàðóæåí'
AudioNamePanel.Color := $CCCCFF
ChangeText := True
end
else
AudioNamePanel.Text := Keys[0]
if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
AudioNamePanel.Text := AudioNamePanel.Text + ' (ðåêîìåíäóåòñÿ ' + NeedSoundCard + ')'

// Îáú¸ì ïàìÿòè:
RAMTotalPanel.Color := $CCFFCC
if not CheckMemorySize(NeedMB) then
begin
RAMTotalPanel.Color := $CCCCFF
ChangeText := True
end
RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' âñåãî, ' +
ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' èñïîëüçóåòñÿ, ' +
ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' ñâîáîäíî'

// Âèðòóàëüíàÿ ïàìÿòü:
PageFileTotalPanel.Color := $CCFFCC
PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' âñåãî, ' +
ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' çàíÿòî ñèñòåìíûì êýøåì'
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
begin
PageFileTotalPanel.Color := $CCCCFF
ChangeText := True
end

if ChangeText = True then
begin
TopText.Top := 0
TopText.Caption := 'Íå âñå êîìïîíåíòû óäîâëåòâîðÿþò ìèíèìàëüíûì òðåáîâàíèÿì èãðû.' #13
'Ïîæàëóéñòà, ïðîâåðüòå ïîçèöèè, âûäåëåííûå êðàñíûì öâåòîì.'
TopText.Font.Color := clRed
WizardForm.NextButton.Enabled := False
end
else
begin
TopText.Caption := 'Âñå êîìïîíåíòû ñîîòâåòñòâóþò ìèíèìàëüíûì òðåáîâàíèÿì èãðû.'
TopText.Font.Color := clGreen
TopText.Top := 8
WizardForm.NextButton.Enabled := True
end
end;

procedure InitializeWizard();
begin
InfoPage := CreateCustomPage(wpLicense, 'Àïïàðàòíîå è ïðîãðàììíîå îáåñïå÷åíèå',
'Ïðîãðàììà óñòàíîâêè îáíàðóæèëà ñëåäóþùèå íàîáõîäèìûå êîìïîíåíòû.')
CreateCheckForm() // Ñîçäàíèå îáúåêòîâ TMemo, â êîòîðûõ áóäåò âûâîäèòñÿ èíôîðìàöèÿ î ñèñòåìå
UpdateInfo() // Îáíîâëåíèå èíôîðìàöèè î ñèñòåìå
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = InfoPage.ID then UpdateInfo() // Îáíîâëåíèå èíôîðìàöèè î ñèñòåìå
end;
и
читать дальше »
Цитата:

var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Ïåðåâîä ÷èñëà â çíà÷åíèå áò/Êá/Ìá/Ãá/Òá (äî 3õ çíàêîâ ïîñëå çàïÿòîé)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Ìá' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Áò' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Êá' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Ìá' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Ãá' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Òá'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Óäàëåíèå íà÷àëüíûõ, êîíå÷íûõ è ïîâòîðíûõ ïðîáåëîâ }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Îáðåçàòü ñòðîêó äî çàäàííîãî êîë-âà ñèìâîëîâ}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='áåç ìåòêè';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // äèñê 'À' ïðîïóñòèòü
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { åñëè â íàêîïèòåëå íåò äèñêà, ïðîïóñòèòü îáíîâëåíèå }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' âñåãî| '+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' âñåãî| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% ñâîá|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Function NextButtonClick(CurPageID: Integer): Boolean; Begin
Result:= True
if (CurPageID = wpSelectDir) and (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'), 'Óñòàíîâêà â ñèñòåìíóþ ïàïêó', MB_YESNO or $30) = idYes;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpSelectDir then ListBoxRefresh
End;

Procedure InitializeWizard;
Begin
ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
ListBox.Font.Size:= 9
ListBox.Font.Style:= [fsBold]
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;
WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1, WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height)
WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick
WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage
WizardForm.NoIconsCheck.Show
StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm)
StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height)
StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage
StartMenuTreeView.Cursor:= crHand
StartMenuTreeView.OnChange:=@ObjectOnClick
End;

Drongo 28-05-2009 11:51 1129357

p3rf3ct1c, Небольшое описание для этих частей не помешало бы. Что делает первый скрипт, что второй? И что должно получится?

Serega 28-05-2009 12:10 1129374

p3rf3ct1c,
читать дальше »
Код:

type
  PDisplay_Device = record
  cb: DWord;
  DeviceName: array [0..31] of char;
  DeviceString: array [0..127] of char;
  StateFlags: DWord;
  DeviceID, DeviceKey: array [0..127] of char;
  end;

  TMixerCaps = record
  vPid, vDriverVersion: DWord;
  sName: array [0..31] of char;
  Support, cDestinations: DWord;
end;

// I?iaa?ea aa?nee Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
{Win9x}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
{WinNT}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

const
  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
  oneMB = 1024*1024;
  NeedMHz = 1800;
  NeedVideoRAM = 128;
  NeedSoundCard = 'Creative X-Fi';
  NeedMB = 512;
  NeedPageFile = 1024;

var
  n, errCode: Integer;
  FreeMB, TotalMB: Cardinal;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;

  InfoPage: TWizardPage;
  TopText, BottomText: TNewStaticText;
  ChangeText: Boolean;
  SystemPanel, ProcessorPanel, VideoPanel,
  AudioPanel, RAMPanel, PageFilePanel: TMemo;
  SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
  AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  lpCaps: TMixerCaps;
  Version: TWindowsVersion;
  MemoryEx: TMemoryStatusEx;
  Keys: TArrayOfString;
  DeviceValue: Cardinal;
  lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
external 'GetSystemMetrics@user32.dll stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
external 'GetDeviceCaps@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
external 'CreateDCA@GDI32 stdcall';

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
external 'EnumDisplayDevicesA@user32.dll stdcall';

function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
external 'mixerGetDevCapsA@winmm.dll stdcall';

function mixerGetNumDevs: Integer;
external 'mixerGetNumDevs@winmm.dll stdcall';

// Aiiieieou ?enei ai e?aoiiai Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
Result := (Bytes/Multiple + 1)*Multiple
else
Result := Bytes
end;

// Ia?aaia ?enea a cia?aiea Ao/Ea/Ia/Aa/Oa (ai 3o ciaeia iinea caiyoie)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
  if not noMB then Result := FloatToStr(Int(Bytes)) + ' Ia' else
  if Bytes < 1024 then Result := FloatToStr(Int(Bytes)) + ' Ao' else
  if Bytes/1024 < 1024 then Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Ea' else
  if Bytes/oneMB < 1024 then Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Ia' else
  if Bytes/oneMB/1000 < 1024 then Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Aa' else
  Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Oa'
  StringChange(Result, ',', '.')
end;

// Oaaeaiea ia?aeuiuo, eiia?iuo e iiaoi?iuo i?iaaeia
function DelSp(String: String): String;
begin
  while (Pos(' ', String) > 0) do
  Delete(String, Pos(' ', String), 1)
  Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2
for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

function CheckCPU(NeedMHz: Integer): Boolean;
var
String: String;
begin
String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys) // Eiee?anoai yaa?
for n := 0 to GetArrayLength(Keys)-1 do
RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
Exit
else
Result := True
end;

function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
MemoryEx.dwLength := SizeOf(MemoryEx)
if not GlobalMemoryStatusEx(MemoryEx) then
MsgBox('Ioeaea ooieoee:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
else
if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
Exit
else
Result := True
end;

procedure CreateCheckForm();
begin

TopText := TNewStaticText.Create(InfoPage)
with TopText do
begin
Parent := InfoPage.Surface
Left := 0
AutoSize := True
end

BottomText := TNewStaticText.Create(InfoPage)
with BottomText do
begin
Parent := InfoPage.Surface
Caption := 'Eiaaa Au aoaaoa aioiau i?iaie?eou onoaiiaeo, ia?ieoa «Aaeaa».'
Font.Color := clBlack
Left := 0
Top := 200
AutoSize := True
end

SystemPanel := TMemo.Create(InfoPage)
with SystemPanel do
begin
Text := 'Nenoaia'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ScaleY(33)
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

SystemVersionPanel := TMemo.Create(InfoPage)
with SystemVersionPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := SystemPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

ProcessorPanel := TMemo.Create(InfoPage)
with ProcessorPanel do
begin
Text := 'I?ioanni?'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := SystemPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

ProcessorMHzPanel := TMemo.Create(InfoPage)
with ProcessorMHzPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := ProcessorPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

VideoPanel := TMemo.Create(InfoPage)
with VideoPanel do
begin
Text := 'Aeaaiaaaioa?'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ProcessorPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

VideoRAMPanel := TMemo.Create(InfoPage)
with VideoRAMPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := VideoPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

AudioPanel := TMemo.Create(InfoPage)
with AudioPanel do
begin
Text := 'Caoeiaay ea?oa'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := VideoPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

AudioNamePanel := TMemo.Create(InfoPage)
with AudioNamePanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := AudioPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

RAMPanel := TMemo.Create(InfoPage)
with RAMPanel do
begin
Text := 'Iau?i iaiyoe'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := AudioPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

RAMTotalPanel := TMemo.Create(InfoPage)
with RAMTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := RAMPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

PageFilePanel := TMemo.Create(InfoPage)
with PageFilePanel do
begin
Text := 'Oaee iiaea?ee'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := RAMPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;

PageFileTotalPanel := TMemo.Create(InfoPage)
with PageFileTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := PageFilePanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

end;

procedure UpdateInfo();
var
  DeviceName, DeviceKey: String;
begin
  ChangeText := False

  GetWindowsVersionEx(Version)

  // Iia?aoeiiiay nenoaia:
  SystemVersionPanel.Color := $CCFFCC

  DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
  if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
  RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
  if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
  DeviceName := DeviceName + ' ' + DeviceKey
  StringChange(DeviceName, 'Microsoft ', '')
  SystemVersionPanel.Text := ' ' + DeviceName + ' nai?ea ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
  '.' + IntToStr(Version.Build)

  if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and // Windows 2000 SP4
  (Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and // Windows XP SP2
  (Pos('Vista', SystemVersionPanel.Text) = 0) then // Windows Vista (c e?aui SP eee aac iaai)
  begin
    SystemVersionPanel.Color := $CCCCFF
    ChangeText := True
  end

  // I?ioanni?:
  ProcessorMHzPanel.Color := $CCFFCC

  if not CheckCPU(NeedMHz) then
  begin
    ProcessorMHzPanel.Color := $CCCCFF
    ChangeText := True
  end

  ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
  if GetArrayLength(Keys) > 1 then
  ProcessorPanel.Text := 'I?ioanni?u' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

  // Aeaaiea?oa:
  VideoRAMPanel.Color := $CCFFCC

  lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
  DeviceKey := ''
  n := 0
  while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
  (lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
  for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
  Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127) // Ee?? a?aeaa?a iieo?aai ec API
  StringChange(DeviceKey, '\Registry\Machine\', '')
  errCode := 1
  DeviceValue := 0
  if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
  for n := 1 to Length(DeviceName) do
  begin
    DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
    errCode := errCode*$100
  end else
  if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
  else
  RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
  DeviceName := ''
  for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
  Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

  if DeviceName <> '' then
  if DeviceValue > 0 then
  VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
  else
  VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
  else
  begin
    VideoRAMPanel.Text := ' A?aeaa? ono?ienoaa ia iaia?o?ai'
    VideoRAMPanel.Color := $CCCCFF
    ChangeText := True
  end
  if (DeviceValue/oneMB < NeedVideoRAM) then
  begin
    VideoRAMPanel.Color := $CCCCFF
    ChangeText := True
  end
  VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
  IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
  GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

// Caoeiaay ea?oa:
AudioNamePanel.Color := $CCFFCC

// for errCode := 0 to 1 do // Auaia iniiaiiai caoeiaiai ono?ienoaa
for errCode := 0 to mixerGetNumDevs do
begin
mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
DeviceName := ' '
for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
Delete(DeviceName, Pos(' [', DeviceName), 31)
StringChange(DeviceName, 'SB ', 'Creative ')
Delete(DeviceName, Pos(' Audio', DeviceName), 31)
SetArrayLength(Keys, errCode)
if errCode > 0 then Keys[errCode-1] := DeviceName
end

if GetArrayLength(Keys) > 1 then
begin
AudioPanel.Text := 'Caoeiaua ea?ou'
// AudioPanel.Text := 'Caoeiaua ea?ou (' + IntToStr(GetArrayLength(Keys)) +')'
AudioNamePanel.Text := ''
for n := 1 to GetArrayLength(Keys) do
AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1] // + '(' + IntToStr(n) + ')'
end
else
if GetArrayLength(Keys) = 0 then
begin
AudioNamePanel.Text := ' A?aeaa? ono?ienoaa ia iaia?o?ai'
AudioNamePanel.Color := $CCCCFF
ChangeText := True
end
else
AudioNamePanel.Text := Keys[0]
if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
AudioNamePanel.Text := AudioNamePanel.Text + ' (?aeiiaiaoaony ' + NeedSoundCard + ')'

// Iau?i iaiyoe:
RAMTotalPanel.Color := $CCFFCC
if not CheckMemorySize(NeedMB) then
begin
RAMTotalPanel.Color := $CCCCFF
ChangeText := True
end
RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' anaai, ' +
ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' eniieucoaony, ' +
ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' naiaiaii'

// Ae?ooaeuiay iaiyou:
PageFileTotalPanel.Color := $CCFFCC
PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' anaai, ' +
ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' caiyoi nenoaiiui eyoai'
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
begin
PageFileTotalPanel.Color := $CCCCFF
ChangeText := True
end

  if ChangeText = True then
  begin
    TopText.Top := 0
    TopText.Caption := 'Ia ana eiiiiiaiou oaiaeaoai?y?o ieieiaeuiui o?aaiaaieyi ea?u.' #13
    'Ii?aeoenoa, i?iaa?uoa iiceoee, auaaeaiiua e?aniui oaaoii.'
    TopText.Font.Color := clRed
    WizardForm.NextButton.Enabled := False
  end else
  begin
    TopText.Caption := 'Ana eiiiiiaiou niioaaonoao?o ieieiaeuiui o?aaiaaieyi ea?u.'
    TopText.Font.Color := clGreen
    TopText.Top := 8
    WizardForm.NextButton.Enabled := True
  end
end;

Function CutString(String: String; MaxLength: Longint): String; { Ia?acaou no?ieo ai caaaiiiai eie-aa neiaieia}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='aac iaoee';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // aene 'A' i?iionoeou
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { anee a iaeiieoaea iao aenea, i?iionoeou iaiiaeaiea }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' anaai| '+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' anaai| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% naia|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Function NextButtonClick(CurPageID: Integer): Boolean; Begin
Result:= True
if (CurPageID = wpSelectDir) and (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'), 'Onoaiiaea a nenoaiio? iaieo', MB_YESNO or $30) = idYes;
End;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = InfoPage.ID then UpdateInfo() // Iaiiaeaiea eioi?iaoee i nenoaia
  if CurPageID = wpSelectDir then ListBoxRefresh
end;

procedure InitializeWizard();
begin
  InfoPage := CreateCustomPage(wpLicense, 'Aiia?aoiia e i?ia?aiiiia iaania?aiea',
  'I?ia?aiia onoaiiaee iaia?o?eea neaao?uea iaiaoiaeiua eiiiiiaiou.')
  CreateCheckForm() // Nicaaiea iauaeoia TMemo, a eioi?uo aoaao auaiaeony eioi?iaoey i nenoaia
  UpdateInfo() // Iaiiaeaiea eioi?iaoee i nenoaia

  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
  ListBox.Font.Size:= 9
  ListBox.Font.Style:= [fsBold]
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;
  WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1, WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height)
  WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick
  WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage
  WizardForm.NoIconsCheck.Show
  StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm)
  StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
  StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height)
  StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage
  StartMenuTreeView.Cursor:= crHand
  StartMenuTreeView.OnChange:=@ObjectOnClick
end;


p3rf3ct1c 28-05-2009 15:03 1129509

Drongo, мне уже Serega_ сделал. Но и вам спасибо за то что хотели помочь!

Serega_, Спасибо!

Drongo 28-05-2009 16:43 1129591

p3rf3ct1c, Я не в том плане, просто Serega_, спец в скриптах, а мне интересно было бы узнать его назначение, вдруг бы и я использовал вашу заготовку. ;) Вроде то что делает проверку компонентов системы увидел. А остальное тёмный лес, почти. :)

Serega 28-05-2009 17:20 1129620

Цитата:

Цитата Drongo
мне интересно было бы узнать его назначение »

Первый скрипт, создаёт дополнительную страницу с параметрами системы, а второй создаёт листбокс на странице выбора директории с параметрами жёстких дисков, т.е. размер и свободное место на каждом из дисков.

SkynetAst 30-05-2009 09:51 1130792

У меня проблема насчет Скрипта для отображения процесса распаковки FreeArc архивов во втором прогрессбаре СКРИПТ от Serega
Выходит такая ошибка

Где достать эту процедуру? Unpackarc может какой то файл создать?
Допустим у меня файл worms.arc (сам архив) и файл Arc.exe, мне нужно это распокавать как хотел Blackself
где теперь достать процедуру unpackarc?

Serega 30-05-2009 11:10 1130825

SkynetAst, эта процедура в родном скрипте есть, а судя по ошибке, вы просто удалили её из своего скрипта.

SkynetAst 30-05-2009 11:42 1130846

Serega_,
А у меня и не было этой процедуры....что за родной скрипт??? Я скопировал ВАШ скрипт изменил файл (архив) и все......а что за процедура, где мне ее найти?

Serega 30-05-2009 12:05 1130858

SkynetAst, у меня в подписи, нажмите на Inno Setup и там будет ссылка на скрипт - распаковка FreeArc.
Скопировав скрипт целиком, строка 81 в скрипте и будет начало этой процедуры: procedure UnpackArc(s: string);

SkynetAst 30-05-2009 12:13 1130865

Serega_,
Нажимаю на ссылку в вашей подписи, Inno Setup, кидает на эту же страницу только в шапку. а там ничего подобного Распаковка FreeArc нет.
Если вы говорите про ЭТО ваше сообщение там есть
читать дальше »
procedure UnpackArc(s: string);
begin
WizardForm.CancelButton.Enabled:= False; // отключаем кнопку 'Отмена'
BatRunArc(s); // создаём батник для запуска Arc.exe
WizardForm.StatusLabel.Caption:= 'Распаковка архива, ждите...';
ParserLog; // обрабатываем лог файл
WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
ProgressBar.Position := 100;
// удаляем лишнее
DelayDeleteFile(ExpandConstant('{app}\out_log'), 2);
DelayDeleteFile(ExpandConstant('{app}\in_log'), 2);
DelayDeleteFile(ExpandConstant('{app}\Arc.exe'), 2);
DelayDeleteFile(ExpandConstant('{app}\') + s, 2);
end;

Но все равно ругается. я скопировал весь ваш пример, изменил архивы и эта ошибка.

Serega 30-05-2009 12:20 1130869

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

P.S.
Только не забудьте исправить название секции кода...

BlackSelf 30-05-2009 12:24 1130873

SkynetAst, я просто уверен в том, что у вас в скрипте написано [_Code], поменяйте на [code].

SkynetAst 30-05-2009 12:37 1130886

[_code] на [code]?
Исправил теперь вот так ругается:

BlackSelf 30-05-2009 12:39 1130888

SkynetAst, написано ведь было:
"Для нормальной работы необходима расширенная версия Inno Setup от Restools http://restools.hanzify.org/"
Скачивайте, ставьте.

SkynetAst 30-05-2009 12:44 1130891

ой спасибо народ, спасибо что терпели меня =)
еще чуть чуть по надоедаю.
как изменить скрипт, например у меня два архива, чтобы он по очереди распаковал их?

Serega 30-05-2009 12:53 1130895

Цитата:

Цитата SkynetAst
как изменить скрипт, например у меня два архива, чтобы он по очереди распаковал их? »

так всёж просто, в скрипте пишите два архива:
читать дальше »
Код:

..................................
[Files]
Source: Arc.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall
Source: {src}\Project1.arc; DestDir: {app}; Afterinstall: UnpackArc('Project1.arc'); Flags: external ignoreversion skipifsourcedoesntexist
Source: {src}\Project2.arc; DestDir: {app}; Afterinstall: UnpackArc('Project2.arc'); Flags: external ignoreversion skipifsourcedoesntexist
...................................


а в потерянной процедуре ;) - procedure UnpackArc(s: string); удаляем эту строку:
Код:

    DelayDeleteFile(ExpandConstant('{app}\Arc.exe'), 2);

SkynetAst 30-05-2009 14:02 1130937

У меня такой скрипт
читать дальше »
[Files]
Source: E:\arc.exe; DestDir: {app}
Source: E:\maps.arc; DestDir: {app}
[Setup]
AppName=Worms
Uninstallable=false
AppVerName=1.0
DefaultDirName=worm
OutputDir=C:\Users\Skynet\Desktop
[Run]
Filename: {app}\arc.exe; WorkingDir: {app}; Parameters: x {app}\maps.arc -y -dp{app}; StatusMsg: Идет распаковка данных..

Что надо изменить чтобы после распаковки файлы arc.exe и maps.arc удалились?
Flags: deleteafterinstall не робит...
И еще....app это те файлы которые находятся в установочном файле......src это рядом с файлом установки?

Serega 30-05-2009 14:14 1130940

Цитата:

Цитата SkynetAst
Что надо изменить чтобы после распаковки файлы arc.exe и maps.arc удалились?
Flags: deleteafterinstall не робит... »

Как говорят - неверю... Надо сделать, так:
читать дальше »
Код:

[Setup]
AppName=Worms
Uninstallable=false
AppVerName=1.0
DefaultDirName=worm
OutputDir=C:\Users\Skynet\Desktop

[Files]
Source: E:\arc.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall
Source: E:\maps.arc; DestDir: {app}; Flags: ignoreversion deleteafterinstall

[Run]
Filename: {app}\arc.exe; WorkingDir: {app}; Parameters: x {app}\maps.arc -y -dp{app}; StatusMsg: Идет распаковка данных...; Flags: runhidden


Цитата:

Цитата SkynetAst
И еще....app это те файлы которые находятся в установочном файле......src это рядом с файлом установки? »

Цитата:

Цитата из Справки, раздел Константы
{app}

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

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

Папка, из которой запущен инсталлятор.

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


Raf-9600 30-05-2009 16:29 1131020

Ктонить может написать код, чтоб посреди установки, в скрытом режиме, запускался файл "inWAV.bat", при условии что выбран компонент "Sound", и чтоб пока выполняется этот батник, в статус сообщении писалось что-то типа "Распаковка аудио".

Serega 30-05-2009 16:48 1131039

Цитата:

Цитата Raf-9600
Ктонить может написать код, чтоб посреди установки, в скрытом режиме, запускался файл "inWAV.bat", при условии что выбран компонент "Sound", и чтоб пока выполняется этот батник, в статус сообщении писалось что-то типа "Распаковка аудио". »

можно, но сейчас надо ехать... часа через полтора, приеду и накидаю.

Raf-9600 30-05-2009 16:52 1131046

Ок, буду ждать =)

Serega 30-05-2009 18:04 1131070

Raf-9600,
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full
Name: b; Description: Справка; Types: custom

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a; Flags: ignoreversion
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Afterinstall: inWAVBat; Components: b; Flags: ignoreversion

[_Code]
procedure inWAVBat;
var
  bat, str: string;
  res: Integer;
begin
  bat := ExpandConstant('{app}\inWAV.bat');
  str := str + '@echo off' + #10#13 +
        str + '' + #10#13 + // здесь надо заполнить командами батник
        str + 'del ' + '"' + bat + '"'; // удаляет сам себя
  SaveStringToFile(bat, str, False);
  WizardForm.StatusLabel.Caption:= 'Распаковка  аудио, ждите...';
  Exec(bat, '', '', SW_HIDE, ewWaitUntilTerminated, res);
  WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
end;


Raf-9600 30-05-2009 19:03 1131102

Непонял эту строчку:
Цитата:

str + '' + #10#13 + // здесь надо заполнить командами батник
А зачем второй раз прописывать те команды, которые уже есть в батнике? Тем боле их у меня две:
Цитата:

for /R sound %%i in (*.wav) do oggenc.exe -Q "%%i"
WinMPQ.exe s StarDat.txt
Пробывал вставить эти команды, но чёт нифига они не выполняются :(

SkynetAst 30-05-2009 19:30 1131121

Файлы не распаковываются из архива arc
Что не так сделал?
читать дальше »
[Setup]
SourceDir=.
OutputDir=Setup
AppName=StarCraft
AppVerName=StarCraft
AppVersion=StarCraft
AppPublisher=Skynet
AppCopyright=Skynet
DefaultDirName={pf}\StarCraft
DefaultGroupName=StarCraft
AllowNoIcons=yes
OutputBaseFilename=starik
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/fast
WizardImageFile=C:\Program Files\Smart Install Maker\Bitmaps\Import\Bmp014.bmp
WizardSmallImageFile=C:\Program Files\Smart Install Maker\Bitmaps\Import\Bmp015.bmp
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"

[Files]
Source: "isxbb.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\starcraft.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\img_2862_starcraft-0002.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\1221340359_starcraft.front_cover.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "bass.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "innocallback.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Music\blur_-_song2.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "E:\StarCraft\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: E:\starcraft\arc.exe; DestDir: {app};
Source: E:\starcraft\starcraft.arc; DestDir: {app};
[Icons]
Name: "{group}\StarCraft"; Filename: "{app}\StarCraft.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\StarCraft"; Filename: "{app}\StarCraft.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\{cm:UninstallProgram,StarCraft}"; Filename: "{uninstallexe}"

[Run]
Filename: {app}\arc.exe; WorkingDir: {app}; Parameters: x {app}\starcraft.arc -y -dp{app}; StatusMsg: Èäåò ðàñïàêîâêà äàííûõ...;
Description: "{cm:LaunchProgram, StarCraft}"; Filename: "{app}\StarCraft.exe"; WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent unchecked

[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[_ISTool]
EnableISX=True

[code]
type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
const
BackGround=6;
Timer=16;
Indent=25;

var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;

function isxbb_AddImage(Image: PChar; Flags: Cardinal): integer; external 'isxbb_AddImage@files:isxbb.dll stdcall delayload';
function isxbb_Init(hWnd: Integer): integer; external 'isxbb_Init@files:isxbb.dll stdcall delayload';
function isxbb_StartTimer(Seconds: Integer; Flags: Cardinal): integer; external 'isxbb_StartTimer@files:isxbb.dll stdcall';
function isxbb_KillTimer(Flags: Cardinal): integer; external 'isxbb_KillTimer@files:isxbb.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 GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';

procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('blur_-_song2.mp3');
MP3List:=TStringList.Create;
MP3List.Add(ExpandConstant('{tmp}')+'\blur_-_song2.mp3');
CurrentMP3:=0;
Result:=True;
end;

procedure InitializeWizard;
begin
WizardForm.Position:=poScreenCenter;
MainForm.BorderStyle:=bsNone;
MainForm.Width:=GetSystemMetrics(0);
MainForm.Height:=GetSystemMetrics(1)+1;
MainForm.Top:=-1;
MainForm.Left:=0;
ExtractTemporaryFile('1221340359_starcraft.front_cover.jpg');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\1221340359_starcraft.front_cover.jpg',1 000,3000,1000,0,255,False,$FFFFFF,10);
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ExtractTemporaryFile('starcraft.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\starcraft.jpg',BackGround);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
MainForm.Visible:=True;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
ExtractTemporaryFile('img_2862_starcraft-0002.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\img_2862_starcraft-0002.jpg',BackGround or Timer);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
isxbb_StartTimer(4,BackGround)
end;
if CurStep=ssPostInstall then begin
isxbb_KillTimer(BackGround);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(MainForm.Width-WizardForm.Width-Indent);
WizardForm.Top:=ScaleY(MainForm.Height-WizardForm.Height-Indent);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end;
if CurPageID=wpFinished then begin
WizardForm.Visible:=False;
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Left:=(MainForm.Width-WizardForm.Width) div 2;
WizardForm.Top:=(MainForm.Height-WizardForm.Height) div 2;
WizardForm.Visible:=True;
end;
end;

procedure DeinitializeSetup;
begin
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
end;

А чисто такой скрипт работает, его и вставляю в верхний, и все перестает работать
читать дальше »
[Setup]
AppName=Map
Uninstallable=false
AppVerName=1.0
DefaultDirName=Map
OutputDir=C:\Users\Skynet\Desktop
[Files]
Source: E:\starcraft\arc.exe; DestDir: {app};
Source: E:\starcraft\starcraft.arc; DestDir: {app};

[Run]
Filename: {app}\arc.exe; WorkingDir: {app}; Parameters: x {app}\starcraft.arc -y -dp{app}; StatusMsg: Идет распаковка...;

Serega 30-05-2009 20:43 1131180

Цитата:

Цитата Raf-9600
Зачем второй раз прописывать те команды, которые уже есть в батнике? Тем боле их у меня две: »

я вам просто показал пример вызова и создания батника при условии выбора компонентов...
Мне тяжело понять о чём вы думаете, извините, но я не телепат. Или покажите код, или объясните подробней, что вы хотите... каков был вопрос:
Цитата:

Цитата Raf-9600
Ктонить может написать код, чтоб посреди установки, в скрытом режиме, запускался файл "inWAV.bat", при условии что выбран компонент "Sound", и чтоб пока выполняется этот батник, в статус сообщении писалось что-то типа "Распаковка аудио". »

таков и ответ...

SkynetAst,
Цитата:

Цитата SkynetAst
Файлы не распаковываются из архива arc »

Исправьте секцию [Run]... у вас два задания на выполнение и две строчки... Внимательней приглядитесь, как вы их написали.

Raf-9600 30-05-2009 21:46 1131231

Цитата:

Цитата Serega_
я вам просто показал пример вызова и создания батника при условии выбора компонентов... »

Ну я имел ввиду все тоже, только без создания батника, т.е. просто запуск распакованного инсталлятором "inWAV.bat", при условии что выбран компонент "Sound", и чтоб пока выполняется "inWAV.bat", выводилось собственное статус-сообщение.

P.S.1
Если приглядеться в мой пост, то там я не прошу чтоб из секции [code] что-то создавалось.

P.S.2
ИМХО вы просто чересчур оригинально мыслите :)

BlackSelf 30-05-2009 21:56 1131240

Raf-9600, а какие проблемы с созданием батника в примере Serega_?
Вот так будет выглядеть процедура создания батника:
читать дальше »
Код:

procedure inWAVBat;
var
  bat, str: string;
  res: Integer;
begin
  bat := ExpandConstant('{app}\inWAV.bat');
  str := str + '@echo off' + #10#13 +
        str + '' + #10#13 + 'for /R sound %%i in (*.wav) do oggenc.exe -Q "%%i"' + #10#13 +
        str + '' + #10#13 + 'WinMPQ.exe s StarDat.txt' + #10#13 +
        str + '' + #10#13 + 'del ' + '"' + bat + '"'; // удаляет сам себя
  SaveStringToFile(bat, str, False);
  WizardForm.StatusLabel.Caption:= 'Распаковка  аудио, ждите...';
  Exec(bat, '', '', SW_HIDE, ewWaitUntilTerminated, res);
  WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
end;


Serega 30-05-2009 22:02 1131244

Raf-9600,
Цитата:

Цитата Raf-9600
P.S.2
ИМХО вы просто чересчур оригинально мыслите »

Не все люди думают одинаково... ;) а уж тем более, ход и порядок мыслей разный... :)
Цитата:

Цитата Raf-9600
Ну я имел ввиду все тоже, только без создания батника, т.е. просто запуск распакованного инсталлятором "inWAV.bat", при условии что выбран компонент "Sound" »

т.е. батник существует внутри инсталлятора и распаковывается в момент установки? и его просто надо запустить по тихому с показом сообщения?

Raf-9600 30-05-2009 22:03 1131247

BlackSelf, не проблема была в том, что я недоганял что и куда нужно вставлять, чтоб все работало :)
Вобще, ИМХО создавать батники из кода не практично, ибо это пригодно только для маленьких батников. А если батник маленький, тогда проще вобще без него обойтись, чтобы из секции [code] сразу выполнялись необходимые нействия.
Ну это мои философствования, щяс буду тестить код :)

Serega 30-05-2009 22:11 1131260

BlackSelf,
Спасибо!

P.S.
Вы вставляйте код в тег [code][/code], удобней читать...

Raf-9600 30-05-2009 22:12 1131263

BlackSelf, ничего не заработало :(

Цитата:

Цитата Serega_
т.е. батник существует внутри инсталлятора и распаковывается в момент установки? и его просто надо запустить по тихому с показом сообщения? »



upd
Сек, ещё раз перепроверю....

BlackSelf 30-05-2009 22:20 1131269

Raf-9600, батник создается точно с таким же содержимым, как вы и сказали.

Serega 30-05-2009 22:29 1131283

Raf-9600, скрипт, в студию...

P.S.
Жаль, я не телепат...

Raf-9600 30-05-2009 22:33 1131286

Все ок, это я тупанул. Скрипт пашет, просто я немного перепутал коды для запаковки в ogg и распаковки из него %)

SkynetAst 30-05-2009 22:34 1131287

Serega_, Исправьте секцию [Run]... у вас два задания на выполнение и две строчки...
Я в это не разбираюсь. научите пожалуйста....

Raf-9600 30-05-2009 22:44 1131301

SkynetAst, если для меня нужен персональный телепат, то для вас тут окулист нужен :)
После "{cm:LaunchProgram, StarCraft}"; нужно сделать отступ, чтоб выглядело так:

[Run]
Filename: {app}\arc.exe; WorkingDir: {app}; Parameters: x {app}\starcraft.arc -y -dp{app}; StatusMsg: Идет распаковка данных...; Description: "{cm:LaunchProgram, StarCraft}";
Filename: "{app}\StarCraft.exe"; WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent unchecked

Serega 30-05-2009 22:59 1131312

Цитата:

Цитата Raf-9600
если для меня нужен персональный телепат, то для вас тут окулист нужен »

честно, насмешили... :lol:
на самом деле, надо так:
Код:

[Run]
Filename: {app}\arc.exe; Parameters: x {app}\starcraft.arc -y -dp{app}; WorkingDir: {app}; Description: {cm:LaunchProgram, StarCraft}; StatusMsg: Идет распаковка данных... ; Flags: runhidden
Filename: {app}\StarCraft.exe; WorkingDir: {app}; Flags: nowait postinstall skipifsilent unchecked

P.S.
Насчёт ключей запуска не уверен, не проверял, но я думаю суть понятна?

Raf-9600,
тоже старайтесь использовать тег [code][/code]. удобней читать...

Raf-9600 30-05-2009 23:05 1131315

Кстати, а написать код на такую вот штукенцию ктонить может? :)



Это самая понтовая вещь которую только приходилось видеть в инсталляторе.
Только ИМХО там ПрогрессБар некрасиво смотриться, вот так было бы лучше:



И желательно вобще без кнопки "Отмена".

Ктонить способен сотворить сие (без преувеличений) чудо? На ру-боарде и я, и несколько других людей уже спрашивали, ответить так никто и не смог. Вся надежда на вас :pray:

BlackSelf 30-05-2009 23:07 1131317

Raf-9600, там что, картинка или видео или я, например, делал очень быструю смену картинок, похожую на видео?

Raf-9600 30-05-2009 23:12 1131321

BlackSelf, не знаю что там, мне подобное творение искусства лицезреть не удавалось, только скрины видел. Но предполагаю что там либо слайд-шоу "по таймеру", либо в зависимости от процента хода установки.
Лично мне хотелось бы заиметь оба варианта.

SkynetAst 30-05-2009 23:23 1131327

Serega_, Во все работает. Спасибо. Хм....что можете из литературы посоветовать учебной чтобы вникать в суть?
Или тут все кругом поголовное программирование в которое мне лучше не соваться? =))

Raf-9600 30-05-2009 23:26 1131328

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

SkynetAst 30-05-2009 23:27 1131329

Raf-9600,
Русская, расширенная от Restools ???

Raf-9600 30-05-2009 23:31 1131331

SkynetAst, ну ли есть такая, не в курсе. Для начала подойдет и от обычной версии. В шапке есть на неё ссылки.

Raf-9600 30-05-2009 23:49 1131342

Сорь за офтоп, но ктонить может подсказать команду чтоб через батник удалить все файлы в формате ".wav", находящиеся в папке "Sound" и всех её подпапках?

BlackSelf 31-05-2009 00:00 1131347

Raf-9600, вот, пробуй.
"Слайдшоу на странице wpInstalling по таймеру". Автор: Rexsniper, я доработал.
читать дальше »
Код:

#define TIME_FOR_VIEW 5

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=none
SolidCompression=yes

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

[Files]
Source: compiler:get_hw_caps.dll; DestDir: {tmp}; Flags: dontcopy
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: Image_1.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: Image_2.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: Image_3.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: Image_4.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: Image_5.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: Image_6.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: Image_7.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: Image_8.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: Image_9.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: Image_10.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak

[_Code]
var
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;


procedure InitializeWizard;
begin
  ExtractTemporaryFile('Image_1.bmp');
  ExtractTemporaryFile('Image_2.bmp');
  ExtractTemporaryFile('Image_3.bmp');
  ExtractTemporaryFile('Image_4.bmp');
  ExtractTemporaryFile('Image_5.bmp');
  ExtractTemporaryFile('Image_6.bmp');
  ExtractTemporaryFile('Image_7.bmp');
  ExtractTemporaryFile('Image_8.bmp');
  ExtractTemporaryFile('Image_9.bmp');
  ExtractTemporaryFile('Image_10.bmp');

  currTime := 0;

  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(10);
  WizardForm.ProgressGauge.Left := ScaleX(10);
  WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
  WizardForm.ProgressGauge.Height := 16;
  WizardForm.ProgressGauge.Hide;
  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := WizardForm.ProgressGauge.Width;
  WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
  WizardForm.StatusLabel.Hide;
 
  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
  SplashImage.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 5);
      TimerID := SetTimer(0, 0, 1000, pfunc);
      WizardForm.PageNameLabel.Visible:=false
      WizardForm.PageDescriptionLabel.Visible:=false
      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
      WizardForm.CancelButton.hide
      end
  else
    begin
    WizardForm.ProgressGauge.Hide;
    WizardForm.StatusLabel.Hide;
    SplashImage.Hide;
    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end
    If CurPageID=wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
 KillTimer(0, TimerID);
end;


Raf-9600 31-05-2009 00:11 1131353

BlackSelf, а get_hw_caps.dll и InnoCallback.dll можете куданить залить?

BlackSelf 31-05-2009 00:13 1131355

Raf-9600, http://narod.ru/disk/9309585000/dll.rar.html

Serega 31-05-2009 00:20 1131358

Цитата:

Цитата Raf-9600
Лично мне хотелось бы заиметь оба варианта. »

Видео, сразу скажу даже ни разу не делал, не знаю, а смена картинок - можно, но где-то на предыдущих страницах, я уже писал такой код... там происходит смена картинок и прогрессбар именно снизу.
Цитата:

Цитата SkynetAst
что можете из литературы посоветовать учебной чтобы вникать в суть? »

Справка к Inno Setup, а если есть желание изучить глубже, то нужна литература по Делфи. Я создавал тему по Делфи и в шапке, много очень полезной литературы.
Цитата:

Цитата SkynetAst
Русская, расширенная от Restools ??? »

Справки к Restools, просто не может быть, потому, что она на основе стандартного Inno Setup, но заточенная под Делфи...
Если вам будет проще, то в шапке этой темы есть - InnoCompiler090319_Russian - Русский перевод (80%) от tem000.
Цитата:

Цитата Raf-9600
что нужно прописать, чтоб через батник удалить все файлы в формате ".wav", находящиеся в папке "Sound" и всех её подпапках? »

Вопрос не для этой темы, но надо написать так:
Код:

del Sound\*.wav

Raf-9600 31-05-2009 00:33 1131364

BlackSelf, Выглядит мега круто! Даже красивее чем на сканах
Смущает только то что кнопка "закрыть" совершенно не работает. Т.е. во время инсталляции, она не может отменить её.
Ну и ещё хотелось бы вариант в котором бы отображался какой файл на данный момент распаковываться.
Также интересует, возможно ли какнить сделать так, чтобы вместо BMP можно было туда вставлять JPG картинки? Это ускорило б запуск инсталлятора, и позволило б добавить значительно больше слайдов.

Цитата:

Цитата Serega_
Видео, сразу скажу даже ни разу не делал »

Я имел веду одну версию со слайд-шоу по времени, а вторую со слайд-шоу в зависимости от того, сколько % установлено.
ИМХО Видео туда пихать непрактично, вот протестировал, и запихнул картинок, сумарным объемом в 63,0 МБ, и это ЗНАЧИТЕЛЬНО повлияло на скорость запуска инсталлятора.

Цитата:

Цитата Serega_
Вопрос не для этой темы, но надо написать так: »

Та знаю... Но "del Sound\*.wav", если не ошибаюсь, удалит только wav из папки Sound, а мне нужно ещё и из всех её подпапок.

Serega 31-05-2009 00:55 1131374

Цитата:

Цитата Raf-9600
если не ошибаюсь, удалит только wav из папки Sound, а мне нужно ещё и из всех её подпапок. »

Да, извините, надо так:
Код:

del /s Sound\*.wav

BlackSelf 31-05-2009 01:28 1131382

Raf-9600, код с отображением путей и активной кнопкой "отмена".
читать дальше »
Код:

#define TIME_FOR_VIEW 5

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=none
SolidCompression=yes

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

[Files]
Source: compiler:get_hw_caps.dll; DestDir: {tmp}; Flags: dontcopy
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_1.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_2.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_3.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_4.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_5.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_6.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_7.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_8.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_9.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_10.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak

[_Code]
var
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;


procedure InitializeWizard;
begin
  ExtractTemporaryFile('Image_1.bmp');
  ExtractTemporaryFile('Image_2.bmp');
  ExtractTemporaryFile('Image_3.bmp');
  ExtractTemporaryFile('Image_4.bmp');
  ExtractTemporaryFile('Image_5.bmp');
  ExtractTemporaryFile('Image_6.bmp');
  ExtractTemporaryFile('Image_7.bmp');
  ExtractTemporaryFile('Image_8.bmp');
  ExtractTemporaryFile('Image_9.bmp');
  ExtractTemporaryFile('Image_10.bmp');

  currTime := 0;

  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
  WizardForm.ProgressGauge.Left := ScaleX(10);
  WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
  WizardForm.ProgressGauge.Height := 16;
  WizardForm.ProgressGauge.Hide;
 
  WizardForm.FileNameLabel.Parent := WizardForm;
  WizardForm.FileNameLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
  WizardForm.FileNameLabel.Left := ScaleX(10);
  WizardForm.FileNameLabel.Width := ScaleX(397);
  WizardForm.FileNameLabel.Hide;
 
  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
  SplashImage.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 5);
      TimerID := SetTimer(0, 0, 1000, pfunc);
      WizardForm.PageNameLabel.Visible:=false
      WizardForm.PageDescriptionLabel.Visible:=false
      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.ProgressGauge.Show;
      WizardForm.FileNameLabel.Show;
      SplashImage.Show;
      WizardForm.CancelButton.Enabled :=True
      WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(2)
      end
  else
    begin
    WizardForm.ProgressGauge.Hide;
    SplashImage.Hide;
    WizardForm.FileNameLabel.Hide;
    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end
    If CurPageID=wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
 KillTimer(0, TimerID);
end;


А насчет *.jpg это надо через isxbb.dll делать.

SkynetAst 31-05-2009 12:44 1131559

Вот возникло два вопроса:
1) То что вчера получилось отлично работает НО, при указании пути установки например D:\Games\Star 1.16 из - за пробела не идет распаковка архива, если писать любой другой путь но без пробелов все ставится, с пробелами не идет распаковка.
читать дальше »
[Setup]
SourceDir=.
OutputDir=Setup
AppName=StarCraft
AppVerName=StarCraft
AppVersion=StarCraft
AppPublisher=Skynet
AppCopyright=Skynet
DefaultDirName={pf}\StarCraft
DefaultGroupName=StarCraft
AllowNoIcons=yes
OutputBaseFilename=starik
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/fast
WizardImageFile=C:\Program Files\Smart Install Maker\Bitmaps\Import\Bmp014.bmp
WizardSmallImageFile=C:\Program Files\Smart Install Maker\Bitmaps\Import\Bmp015.bmp
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"

[Files]
Source: "isxbb.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\starcraft.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\img_2862_starcraft-0002.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\1221340359_starcraft.front_cover.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "bass.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "innocallback.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Music\blur_-_song2.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "E:\StarCraft\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: E:\starcraft\arc.exe; DestDir: {app};
Source: E:\starcraft\starcraft.arc; DestDir: {app};
[Icons]
Name: "{group}\StarCraft"; Filename: "{app}\StarCraft.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\StarCraft"; Filename: "{app}\StarCraft.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\{cm:UninstallProgram,StarCraft}"; Filename: "{uninstallexe}"

[Run]
Filename: {app}\arc.exe; Parameters: x {app}\starcraft.arc -y -dp{app}; WorkingDir: {app}; Description: {cm:LaunchProgram, StarCraft}; StatusMsg: Идет распаковка... ;
Filename: {app}\StarCraft.exe; WorkingDir: {app}; Flags: nowait postinstall skipifsilent unchecked
[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[_ISTool]
EnableISX=True

[code]
type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
const
BackGround=6;
Timer=16;
Indent=25;

var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;

function isxbb_AddImage(Image: PChar; Flags: Cardinal): integer; external 'isxbb_AddImage@files:isxbb.dll stdcall delayload';
function isxbb_Init(hWnd: Integer): integer; external 'isxbb_Init@files:isxbb.dll stdcall delayload';
function isxbb_StartTimer(Seconds: Integer; Flags: Cardinal): integer; external 'isxbb_StartTimer@files:isxbb.dll stdcall';
function isxbb_KillTimer(Flags: Cardinal): integer; external 'isxbb_KillTimer@files:isxbb.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 GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';

procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('blur_-_song2.mp3');
MP3List:=TStringList.Create;
MP3List.Add(ExpandConstant('{tmp}')+'\blur_-_song2.mp3');
CurrentMP3:=0;
Result:=True;
end;

procedure InitializeWizard;
begin
WizardForm.Position:=poScreenCenter;
MainForm.BorderStyle:=bsNone;
MainForm.Width:=GetSystemMetrics(0);
MainForm.Height:=GetSystemMetrics(1)+1;
MainForm.Top:=-1;
MainForm.Left:=0;
ExtractTemporaryFile('1221340359_starcraft.front_cover.jpg');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\1221340359_starcraft.front_cover.jpg',1 000,3000,1000,0,255,False,$FFFFFF,10);
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ExtractTemporaryFile('starcraft.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\starcraft.jpg',BackGround);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
MainForm.Visible:=True;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
ExtractTemporaryFile('img_2862_starcraft-0002.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\img_2862_starcraft-0002.jpg',BackGround or Timer);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
isxbb_StartTimer(4,BackGround)
end;
if CurStep=ssPostInstall then begin
isxbb_KillTimer(BackGround);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(MainForm.Width-WizardForm.Width-Indent);
WizardForm.Top:=ScaleY(MainForm.Height-WizardForm.Height-Indent);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end;
if CurPageID=wpFinished then begin
WizardForm.Visible:=False;
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Left:=(MainForm.Width-WizardForm.Width) div 2;
WizardForm.Top:=(MainForm.Height-WizardForm.Height) div 2;
WizardForm.Visible:=True;
end;
end;

procedure DeinitializeSetup;
begin
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
end;

2) Добавил в свой скрипт, скрипт со вторым прогресс грабом распаковкой arc архива? получился такой скрипт:
читать дальше »
[Setup]
SourceDir=.
OutputDir=Setup
AppName=StarCraft
AppVerName=StarCraft
AppVersion=StarCraft
AppPublisher=Skynet
AppCopyright=Skynet
DefaultDirName={pf}\StarCraft
DefaultGroupName=StarCraft
AllowNoIcons=yes
OutputBaseFilename=starik
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/fast
WizardImageFile=C:\Program Files\Smart Install Maker\Bitmaps\Import\Bmp014.bmp
WizardSmallImageFile=C:\Program Files\Smart Install Maker\Bitmaps\Import\Bmp015.bmp
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"

[Files]
Source: "isxbb.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\starcraft.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\img_2862_starcraft-0002.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\1221340359_starcraft.front_cover.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "bass.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "innocallback.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Music\blur_-_song2.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "E:\StarCraft\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: E:\starcraft\arc.exe; DestDir: {app};
Source: E:\starcraft\starcraft.arc; DestDir: {app};
Source: {app}\starcraft.arc; DestDir: {app}; Afterinstall: UnpackArc('starcraft.arc'); Flags: external ignoreversion skipifsourcedoesntexist
[Icons]
Name: "{group}\StarCraft"; Filename: "{app}\StarCraft.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\StarCraft"; Filename: "{app}\StarCraft.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\{cm:UninstallProgram,StarCraft}"; Filename: "{uninstallexe}"

[Run]
Filename: {app}\StarCraft.exe; WorkingDir: {app}; Flags: nowait postinstall skipifsilent unchecked
[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[_ISTool]
EnableISX=True

[code]
type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
const
BackGround=6;
Timer=16;
Indent=25;

var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;

function isxbb_AddImage(Image: PChar; Flags: Cardinal): integer; external 'isxbb_AddImage@files:isxbb.dll stdcall delayload';
function isxbb_Init(hWnd: Integer): integer; external 'isxbb_Init@files:isxbb.dll stdcall delayload';
function isxbb_StartTimer(Seconds: Integer; Flags: Cardinal): integer; external 'isxbb_StartTimer@files:isxbb.dll stdcall';
function isxbb_KillTimer(Flags: Cardinal): integer; external 'isxbb_KillTimer@files:isxbb.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 GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';

procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('blur_-_song2.mp3');
MP3List:=TStringList.Create;
MP3List.Add(ExpandConstant('{tmp}')+'\blur_-_song2.mp3');
CurrentMP3:=0;
Result:=True;
end;

procedure InitializeWizard;
begin
WizardForm.Position:=poScreenCenter;
MainForm.BorderStyle:=bsNone;
MainForm.Width:=GetSystemMetrics(0);
MainForm.Height:=GetSystemMetrics(1)+1;
MainForm.Top:=-1;
MainForm.Left:=0;
ExtractTemporaryFile('1221340359_starcraft.front_cover.jpg');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\1221340359_starcraft.front_cover.jpg',1 000,3000,1000,0,255,False,$FFFFFF,10);
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ExtractTemporaryFile('starcraft.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\starcraft.jpg',BackGround);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
MainForm.Visible:=True;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
ExtractTemporaryFile('img_2862_starcraft-0002.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\img_2862_starcraft-0002.jpg',BackGround or Timer);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
isxbb_StartTimer(4,BackGround)
end;
if CurStep=ssPostInstall then begin
isxbb_KillTimer(BackGround);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(MainForm.Width-WizardForm.Width-Indent);
WizardForm.Top:=ScaleY(MainForm.Height-WizardForm.Height-Indent);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end;
if CurPageID=wpFinished then begin
WizardForm.Visible:=False;
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Left:=(MainForm.Width-WizardForm.Width) div 2;
WizardForm.Top:=(MainForm.Height-WizardForm.Height) div 2;
WizardForm.Visible:=True;
end;
end;

procedure DeinitializeSetup;
begin
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
end;
[code]
var
ProgressLabel: TLabel;
ProgressBar: TNewProgressBar;

procedure ParserLog;
var
in_File, out_File, S, S1, S2: string;
i, j, n: Integer;
begin
in_File := ExpandConstant('{app}\in_log');
out_File := ExpandConstant('{app}\out_log');
ProgressBar.Show;
ProgressLabel.Show;
// åñëè ôàéëà íåò, òî ïîäîæä¸ì... ;)
if FileExists(in_File) = False then
repeat
Application.ProcessMessages; // íåîáõîäèìà ðàñøèðåííàÿ âåðñèÿ îò Restools
n:= n + 1;
Sleep(500); // æä¸ì ïîëñåêóíäû è ïîâòîðÿåì öèêë
until (FileExists(in_File) = True) or (n = 10); // ìàêñèìàëüíî ïîâòîðÿåì öèêë 10 ðàç, ÷òî ñîñòàâèò 5 ñåêóíä...
// åñëè âñ¸ æå ôàéëà íåò, òî âûõîäèì
if FileExists(in_File) = False then Exit;
// åñëè ôàéë ñóùåñòâóåò, òî îáðîáàòûâàåì åãî
repeat
FileCopy(in_File, out_File, False); // êîïèðóì ôàéë, ÷òîá ìîæíî áûëî îòêðûòü out_File äëÿ ÷òåíèÿ
LoadStringFromFile(out_File, S); // åñëè ïîïûòàòüñÿ çàãðóçèòü in_File, òî íè÷åãî íå âûéäåò, ïîêà â íåãî ïèøåò Arc.exe...
Application.ProcessMessages; // íåîáõîäèìà ðàñøèðåííàÿ âåðñèÿ îò Restools
if Pos('%', S) > 0 then begin
S1:= Copy(S, Length(S) - 4, (Length(S) - 2) - (Length(S) - 4));
S2:= Copy(S, Length(S) - 4, Length(S) - (Length(S) - 5));
StringChange(S1, ' ', ''); // óäàëÿåì ïðîáåëû
for i:= 0 to 100 do if S1 = IntToStr(i) then begin
j:= StrToInt(S1);
ProgressBar.Position := j;
StringChange(S2, ' ', '');
ProgressLabel.Caption:= S2;
Application.ProcessMessages; // íåîáõîäèìà ðàñøèðåííàÿ âåðñèÿ îò Restools
end;
end;
until (Pos('Extracted', S) or Pos('ERROR', S)) > 0;
end;

procedure BatRunArc(s: string);
var
bat, str: string;
res: Integer;
begin
bat := ExpandConstant('{app}\RunArc.bat');
str := str + '@echo off' + #10#13 +
str + 'Arc x ' + s + ' -y -s2 -dp >in_log' + #10#13 +
str + 'del ' + '"' + bat + '"';
SaveStringToFile(bat, str, False);
Exec(bat, '', '', SW_HIDE, ewNoWait, res);
end;

procedure UnpackArc(s: string);
begin
WizardForm.CancelButton.Enabled:= False; // îòêëþ÷àåì êíîïêó 'Îòìåíà'
BatRunArc(s); // ñîçäà¸ì áàòíèê äëÿ çàïóñêà Arc.exe
WizardForm.StatusLabel.Caption:= 'Ðàñïàêîâêà àðõèâà, æäèòå...';
ParserLog; // îáðàáàòûâàåì ëîã ôàéë
WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
ProgressBar.Position := 100;
// óäàëÿåì ëèøíåå
DelayDeleteFile(ExpandConstant('{app}\out_log'), 2);
DelayDeleteFile(ExpandConstant('{app}\in_log'), 2);
DelayDeleteFile(ExpandConstant('{app}\Arc.exe'), 2);
DelayDeleteFile(ExpandConstant('{app}\') + s, 2);
end;

procedure InitializeWizard;
begin
// âòîðîé ïðîãðåññáàð
ProgressBar := TNewProgressBar.Create(WizardForm);
with ProgressBar do begin
Left := WizardForm.ProgressGauge.Left;
Top := WizardForm.ProgressGauge.Top + ScaleX(30);
Width := WizardForm.ProgressGauge.Width;
Height := WizardForm.ProgressGauge.Height;
Parent := WizardForm.InstallingPage;
Position := 0;
Hide;
end;
// ñîçäà¸ì Label äëÿ îòîáðàæåíèÿ ïðîöåíòîâ
ProgressLabel := TLabel.Create(WizardForm);
with ProgressLabel do begin
Left := ProgressBar.Left;
Top := ProgressBar.Top + ProgressBar.Height + ScaleX(5);
AutoSize:= True;
Caption:= '0%';
Parent := WizardForm.InstallingPage;
Transparent:= True;
Hide;
end;
end;

И компиляция ругается на это:

Насколько я понимаю, что два раза запущено одно и тоже......как совместить код?

BlackSelf 31-05-2009 13:05 1131570

SkynetAst, вот совмещенный код, пробуйте:
читать дальше »
Код:

[Setup]
SourceDir=.
OutputDir=Setup
AppName=StarCraft
AppVerName=StarCraft
AppVersion=StarCraft
AppPublisher=Skynet
AppCopyright=Skynet
DefaultDirName={pf}\StarCraft
DefaultGroupName=StarCraft
AllowNoIcons=yes
OutputBaseFilename=starik
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/fast
WizardImageFile=C:\Program Files\Smart Install Maker\Bitmaps\Import\Bmp014.bmp
WizardSmallImageFile=C:\Program Files\Smart Install Maker\Bitmaps\Import\Bmp015.bmp
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"

[Files]
Source: "isxbb.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\starcraft.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\img_2862_starcraft-0002.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Skynet\Desktop\1221340359_starcraft.front_cover.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "bass.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "innocallback.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Music\blur_-_song2.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "E:\StarCraft\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: E:\starcraft\arc.exe; DestDir: {app};
Source: E:\starcraft\starcraft.arc; DestDir: {app};
Source: {app}\starcraft.arc; DestDir: {app}; Afterinstall: UnpackArc('starcraft.arc'); Flags: external ignoreversion skipifsourcedoesntexist
[Icons]
Name: "{group}\StarCraft"; Filename: "{app}\StarCraft.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\StarCraft"; Filename: "{app}\StarCraft.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\{cm:UninstallProgram,StarCraft}"; Filename: "{uninstallexe}"

[Run]
Filename: {app}\StarCraft.exe; WorkingDir: {app}; Flags: nowait postinstall skipifsilent unchecked
[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[_ISTool]
EnableISX=True

[_code]
type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
const
BackGround=6;
Timer=16;
Indent=25;

var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;
ProgressLabel: TLabel;
ProgressBar: TNewProgressBar;

function isxbb_AddImage(Image: PChar; Flags: Cardinal): integer; external 'isxbb_AddImage@files:isxbb.dll stdcall delayload';
function isxbb_Init(hWnd: Integer): integer; external 'isxbb_Init@files:isxbb.dll stdcall delayload';
function isxbb_StartTimer(Seconds: Integer; Flags: Cardinal): integer; external 'isxbb_StartTimer@files:isxbb.dll stdcall';
function isxbb_KillTimer(Flags: Cardinal): integer; external 'isxbb_KillTimer@files:isxbb.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 GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';

procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('blur_-_song2.mp3');
MP3List:=TStringList.Create;
MP3List.Add(ExpandConstant('{tmp}')+'\blur_-_song2.mp3');
CurrentMP3:=0;
Result:=True;
end;

procedure ParserLog;
var
in_File, out_File, S, S1, S2: string;
i, j, n: Integer;
begin
in_File := ExpandConstant('{app}\in_log');
out_File := ExpandConstant('{app}\out_log');
ProgressBar.Show;
ProgressLabel.Show;
// åñëè ôàéëà íåò, òî ïîäîæä¸ì...
if FileExists(in_File) = False then
repeat
Application.ProcessMessages; // íåîáõîäèìà ðàñøèðåííàÿ âåðñèÿ îò Restools
n:= n + 1;
Sleep(500); // æä¸ì ïîëñåêóíäû è ïîâòîðÿåì öèêë
until (FileExists(in_File) = True) or (n = 10); // ìàêñèìàëüíî ïîâòîðÿåì öèêë 10 ðàç, ÷òî ñîñòàâèò 5 ñåêóíä...
// åñëè âñ¸ æå ôàéëà íåò, òî âûõîäèì
if FileExists(in_File) = False then Exit;
// åñëè ôàéë ñóùåñòâóåò, òî îáðîáàòûâàåì åãî
repeat
FileCopy(in_File, out_File, False); // êîïèðóì ôàéë, ÷òîá ìîæíî áûëî îòêðûòü out_File äëÿ ÷òåíèÿ
LoadStringFromFile(out_File, S); // åñëè ïîïûòàòüñÿ çàãðóçèòü in_File, òî íè÷åãî íå âûéäåò, ïîêà â íåãî ïèøåò Arc.exe...
Application.ProcessMessages; // íåîáõîäèìà ðàñøèðåííàÿ âåðñèÿ îò Restools
if Pos('%', S) > 0 then begin
S1:= Copy(S, Length(S) - 4, (Length(S) - 2) - (Length(S) - 4));
S2:= Copy(S, Length(S) - 4, Length(S) - (Length(S) - 5));
StringChange(S1, ' ', ''); // óäàëÿåì ïðîáåëû
for i:= 0 to 100 do if S1 = IntToStr(i) then begin
j:= StrToInt(S1);
ProgressBar.Position := j;
StringChange(S2, ' ', '');
ProgressLabel.Caption:= S2;
Application.ProcessMessages; // íåîáõîäèìà ðàñøèðåííàÿ âåðñèÿ îò Restools
end;
end;
until (Pos('Extracted', S) or Pos('ERROR', S)) > 0;
end;

procedure BatRunArc(s: string);
var
bat, str: string;
res: Integer;
begin
bat := ExpandConstant('{app}\RunArc.bat');
str := str + '@echo off' + #10#13 +
str + 'Arc x ' + s + ' -y -s2 -dp >in_log' + #10#13 +
str + 'del ' + '"' + bat + '"';
SaveStringToFile(bat, str, False);
Exec(bat, '', '', SW_HIDE, ewNoWait, res);
end;

procedure UnpackArc(s: string);
begin
WizardForm.CancelButton.Enabled:= False; // îòêëþ÷àåì êíîïêó 'Îòìåíà'
BatRunArc(s); // ñîçäà¸ì áàòíèê äëÿ çàïóñêà Arc.exe
WizardForm.StatusLabel.Caption:= 'Ðàñïàêîâêà àðõèâà, æäèòå...';
ParserLog; // îáðàáàòûâàåì ëîã ôàéë
WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
ProgressBar.Position := 100;
// óäàëÿåì ëèøíåå
DelayDeleteFile(ExpandConstant('{app}\out_log'), 2);
DelayDeleteFile(ExpandConstant('{app}\in_log'), 2);
DelayDeleteFile(ExpandConstant('{app}\Arc.exe'), 2);
DelayDeleteFile(ExpandConstant('{app}\') + s, 2);
end;

procedure InitializeWizard;
begin
WizardForm.Position:=poScreenCenter;
MainForm.BorderStyle:=bsNone;
MainForm.Width:=GetSystemMetrics(0);
MainForm.Height:=GetSystemMetrics(1)+1;
MainForm.Top:=-1;
MainForm.Left:=0;
ExtractTemporaryFile('1221340359_starcraft.front_cover.jpg');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\1221340359_starcraft.front_cover.jpg',1 000,3000,1000,0,255,False,$FFFFFF,10);
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ExtractTemporaryFile('starcraft.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\starcraft.jpg',BackGround);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
MainForm.Visible:=True;
// âòîðîé ïðîãðåññáàð
ProgressBar := TNewProgressBar.Create(WizardForm);
with ProgressBar do begin
Left := WizardForm.ProgressGauge.Left;
Top := WizardForm.ProgressGauge.Top + ScaleX(30);
Width := WizardForm.ProgressGauge.Width;
Height := WizardForm.ProgressGauge.Height;
Parent := WizardForm.InstallingPage;
Position := 0;
Hide;
end;
// ñîçäà¸ì Label äëÿ îòîáðàæåíèÿ ïðîöåíòîâ
ProgressLabel := TLabel.Create(WizardForm);
with ProgressLabel do begin
Left := ProgressBar.Left;
Top := ProgressBar.Top + ProgressBar.Height + ScaleX(5);
AutoSize:= True;
Caption:= '0%';
Parent := WizardForm.InstallingPage;
Transparent:= True;
Hide;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
ExtractTemporaryFile('img_2862_starcraft-0002.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\img_2862_starcraft-0002.jpg',BackGround or Timer);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
isxbb_StartTimer(4,BackGround)
end;
if CurStep=ssPostInstall then begin
isxbb_KillTimer(BackGround);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(MainForm.Width-WizardForm.Width-Indent);
WizardForm.Top:=ScaleY(MainForm.Height-WizardForm.Height-Indent);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end;
if CurPageID=wpFinished then begin
WizardForm.Visible:=False;
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Left:=(MainForm.Width-WizardForm.Width) div 2;
WizardForm.Top:=(MainForm.Height-WizardForm.Height) div 2;
WizardForm.Visible:=True;
end;
end;

procedure DeinitializeSetup;
begin
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
end;


Raf-9600 31-05-2009 13:50 1131590

Цитата:

Цитата BlackSelf
код с отображением путей и активной кнопкой "отмена". »

А можно без кнопки "Отмена" (ну чтоб она нигде не отображалась), но с рабочей кнопкой закрытия? Ну я имею ввиду ту копку которая правее кнопок свернуть, и развернуть, в правом верхнем углу окна.


Цитата:

Цитата BlackSelf
А насчет *.jpg это надо через isxbb.dll делать. »

Можете сделать?

BlackSelf 31-05-2009 14:06 1131596

Raf-9600
Насчет кнопки "Отмена" могу предложить следующее (бредовая идея, конечно, но всё же):
Заменить в данной строке цифру 2 на, скажем, 100. Тогда кнопка будет за пределами окна инсталлятора. Видно её не будет, но "закрыть" в правом верхнем углу будет работать.
Код:

      WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(2)
А насчет *.jpg подумаю на неделе, когда время будет.

Raf-9600 31-05-2009 15:45 1131636

Цитата:

Цитата BlackSelf
Насчет кнопки "Отмена" могу предложить следующее (бредовая идея, конечно, но всё же) »

Главное что нужный эффект достигнут :)

Цитата:

Цитата BlackSelf
А насчет *.jpg подумаю на неделе, когда время будет. »

Буду ждать.

SkynetAst 31-05-2009 19:39 1131772

BlackSelf,
Попробовал....теперь вот так ругается =)) какие то кавычки не нравятся ему

BlackSelf 31-05-2009 20:45 1131800

SkynetAst,
Код:

ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\1221340359_starcraft.front_cover.jpg',1000,3000,1000,0,255,False,$FFFFFF,10);

SkynetAst 01-06-2009 09:56 1132078

А как указать какое место будет занимать установка? А то показывает размер архива а не то что будет после него )

Raf-9600 01-06-2009 10:32 1132100

SkynetAst, в справке все написано. Юзай либо "ExtraDiskSpaceRequired" в секции компонентов, либо "ExtraDiskSpaceRequired" в секции [Setup].

Iven 02-06-2009 16:34 1133153

подскажите как в окне приветствия сдвинуть границу между логотипом и текстом - тоесть чтоб картинки было больше

следующий вопрос по сложнее -) - как в окне где показывается процес установки - чуть выше бегунка прогресса инсталляции поместить видео-ролик - тоесть при инсталляции чтобы играло видео

да, и появилось уже какое то решение убрать окно о программе не конфликтующее с форматированием rtf файлов ?

semiono 02-06-2009 23:54 1133501

Параметр реестра PendingFileRenameOperations
 
Какой синтакс у этого вызова в реестре?
Вот это например понятно
\??\source file
!\??\target file
Переименование нам не нужно, хотя это следует даже из названия, но тем не менее этим ключём можно и удалять!
http://www.pcreview.co.uk/forums/thread-1715654.php
Но я так и не понял всётаки логику, сколько и где надо нулей -
Цитата:

WXP: Right-click the value, choose "Modify Binary Data", click at the
end of the hex string, enter 0000 (four zeros)
Это на словах так легко выглядит! Но я делаю инсталяторы и вот что я нашёл методом подбора-

{olddata} - это предыдущая запись; {break} - это "00" нули; записи соответственно прибавляются друг за другом.
Код:

"PendingFileRenameOperations"; ValueData: "{olddata}{break}{break}\??\{sys}\mmc.ko"
"PendingFileRenameOperations"; ValueData: "{olddata}{break}\??\{sys}\mmcbase.ko"
"PendingFileRenameOperations"; ValueData: "{olddata}{break}\??\{sys}\mmcndmgr.ko"
"PendingFileRenameOperations"; ValueData: "{olddata}{break}\??\{sys}\hnetwiz.ko"
"PendingFileRenameOperations"; ValueData: "{olddata}{break}\??\{sys}\taskmgr.ko{break}{break}"

Все другие способы не работают почему-то, хотя логика этого мне тоже не понятна! Ну например зачем в начале нужно {break}{break}?
Да и в конце зачем, одного чтоль мало? Причём похоже что реестр сам прибавляет ещё один байт нулей "00"
Но моя запись работает, а проблемма в том что если запустить друг за другом два инсталлера с подобным кодом,
то записи одного из них будут проигнорированны... А мне какраз нужно много инсталлеров!
Кароче сколько там нулей вообще непонятно.

Пока что получается из моих наблюдений такое
{старая_запись} 00 00 \??\Файл1_для_удаления
{старая_запись} 00 \??\Файл2_для_удаления
{старая_запись} 00 \??\Файл3_для_удаления 00 00

Но два раза записать из инсталлеров вызовет проблемму! Один работает нормально...
??

Serega 03-06-2009 00:37 1133528

semiono, пережде всего, нужно было написать, что вы делаете инсталляторы на Inno Setup и спрашивать в соответствующей теме.
Цитата:

Цитата semiono
{olddata} - это предыдущая запись »

{olddata} - означает, что если этот параметр в реестре существует, то он будет дополнен, а не перезаписан.
Цитата:

Цитата semiono
{break} - это "00" нули »

{break} - это четыре нуля, если быть точнее и означает переход на новую строку.
Все эти команды действительны для REG_MULTI_SZ.
Цитата:

Цитата semiono
{старая_запись} 00 00 \??\Файл1_для_удаления »

Не понятно, что означают ваши вопросы в строке.
Цитата:

Цитата semiono
{olddata}{break}{break}\??\{sys}\mmc.ko »

Зачем {break} - перевод в строки в начале записи, это должна сделать предыдущая запись. У вас должно быть так:
Код:

{olddata}{sys}\mmc.ko{break}
P.S.
И мне не совсем понятна, суть вашего вопроса...

dinazav 03-06-2009 02:11 1133560

Привет всем, уважаемые программисты! Помогите мне (чайнику) разобраться с моим скриптом.

Задача простая.
Мой сетап должен ставить в каталог с программой дополнительные файлы (что он успешно и делает), но при этом необходимо сделать до инсталяции резервную копию одного из заменяемых файлов (вот тут то и проблема, не хочет работать).
При деинсталяции резервный файл надо вернуть на место (до этого еще не дошел).
Файл предполагается копировать в папку "backup" , которая должна создаться в том же каталоге куда инсталятся файлы.

Вот код скрипта полностью:
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
AppName=Death a Board (beta5)
AppVerName=Дополнение к Left 4 Dead
DefaultDirName=C:\Program Files\Steam\SteamApps\Common\left4dead
DefaultGroupName=Death a Board (beta5)
DisableProgramGroupPage=yes
OutputDir=E:\Загрузки\Output
OutputBaseFilename=setup
SetupIconFile=E:\Left4Dead\left4dead\Left 4 Dead Demo.ico
Compression=lzma
SolidCompression=yes

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

[Files]
Source: "E:\Загрузки\Output\left4dead\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[code]
procedure CurStepChanged(CurStep: TSetupStep);
var
s1, s2: string;
begin
s1:=ExpandConstant('{app}')+'\resource\UI\L4D360UI\LoadingPosters.res';
s2:=ExpandConstant('{app}')+'\Backup\left4dead\resource\UI\L4D360UI';
If FileExists(s1) then
begin
CreateDir(s2);
FileCopy(s1, s2+'\LoadingPosters.res', True);
end;
end;

BlackSelf 03-06-2009 02:49 1133567

dinazav, попробуйте так:
читать дальше »
Код:

[Setup]
AppName=Death a Board (beta5)
AppVerName=Дополнение к Left 4 Dead
DefaultDirName=C:\Program Files\Steam\SteamApps\Common\left4dead
DefaultGroupName=Death a Board (beta5)
DisableProgramGroupPage=yes
OutputDir=E:\Загрузки\Output
OutputBaseFilename=setup
SetupIconFile=E:\Left4Dead\left4dead\Left 4 Dead Demo.ico
Compression=lzma
SolidCompression=yes

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

[Files]
Source: "E:\Загрузки\Output\left4dead\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[_Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
CopyFiles(ExpandConstant('{app}\resource\UI\L4D360UI'),ExpandConstant('{app}\Backup\resource\UI\L4D360UI'),('LoadingPosters.res'));
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveFiles(ExpandConstant('{app}\Backup\resource\UI\L4D360UI\'),ExpandConstant('{app}\resource\UI\L4D360UI\'),('LoadingPosters.res'));
RemoveDir(ExpandConstant('{app}\Backup'));
end;
end;


semiono 03-06-2009 06:14 1133598

Я боюсь что этот вопрос выходит за пределы InnoSetup, причём я обычно не использую
restartreplace флаги, так как мне не нужны диалоги в инсталлере.
Поэтому пытаюсь удалять файлы "ручным способом", кстати это даже интересно.
Цитата:

Цитата Serega_
{break} - это четыре нуля »

Не уверенн, но раз вы говорите проверю.
Цитата:

Цитата Serega_
Не понятно, что означают ваши вопросы в строке. »

Это правильная запись сетевых по-моему устройств, не знаю точно, но по крайней мере
это майкрософт придумано - \??\C:\windows...
Хотя я думаю вы в курсе, просто можно было подумать что это я что-то там зашифровал :)
Хотя я не пробовал напрямую писать без '\??\' может и не будет валидным?
Цитата:

Цитата Serega_
Зачем {break} - перевод в строки в начале записи »

Я и сам удивлён, но другие варианты у меня никакие не работают!
Хотя я думаю что есть альтернатива? Суть вопроса какраз в том, как правильно удалять
используя PendingFileRenameOperations, но меня не один файлик интересует, а сразу много!
Причём с возможностью добавлять строки из разных подряд запускаемых инсталяторов.
То что вы говорите что брейк вначале не нужен - это верно и я это тоже знаю,
но почему-то на практике работает только именно как у меня было.
Просто если второй инсталятор запишет позади свой код то он уже не будет выполняться.
А вот многократный запуск одного и того же инсталятора хотя он и начинает
дублировать записи но тем не менее файлы будут удалены всё как положенно.
Наверное два инсталлера суммируют какой-то сдвиг по нулям {break} и происходит косяк! :)

---
То что я записываю в виде:
ValueData: "{olddata}{break}{break}\??\{sys}\mmc.ko"
ValueData: "{olddata}{break}\??\{sys}\mmcbase.ko"
это не принципиально, просто так удобнее код контролировать, хотя можно и в строчку всё оформить:
ValueData: "{olddata}{break}{break}\??\{sys}\mmc.ko{break}\??\{sys}\mmcbase.ko итакдалее"

-Marshall- 03-06-2009 12:50 1133847

Подскажите пожалуйста, как сделать так, чтоб инсталлятор не могли распаковать, как это сделано у Boss911 в его трансформ-паке?

Serega 03-06-2009 18:24 1134129

Цитата:

Цитата semiono
Я боюсь что этот вопрос выходит за пределы InnoSetup »

А вы не бойтесь... это как раз и есть вопрос по Inno Setup.
Цитата:

Цитата semiono
причём я обычно не использую
restartreplace флаги, так как мне не нужны диалоги в инсталлере. »

Не понятно, причём тут флаг restartreplace и диалоги в инсталляторе?
Цитата:

Цитата из Справки
restartreplace

Этот флаг необходим при перемещении системных файлов ядра. Если файл существовал ранее и оказался заблокирован инсталлятором из-за невозможности его переместить, инсталлятор зарегистрирует файл (в WININIT.INI или используя MoveFileEx для Windows и Windows NT соответственно), чтобы переместить его после перезагрузки системы. Когда это произойдет, пользователю будет предложено перезагрузить компьютер в конце установки.

Цитата:

Цитата semiono
Поэтому пытаюсь удалять файлы "ручным способом" »

Вы имеете в виду не создаёте деинсталлятор?
Цитата:

Цитата semiono
Это правильная запись сетевых по-моему устройств, не знаю точно, но по крайней мере
это майкрософт придумано - \??\C:\windows... »

Вот здесь, я с вами не согласен, это скорей всего, попытка не правильной перекодировки из формата Unicode в ANSI...
Вообще, все инсталляторы делают люди и нельзя сказать с уверенностью, что если вы увидели такую запись у себя в реестре, после установки, какой-нибудь переупакованной игры, что именно эта запись верная... Потому, что перед установкой игры, если цель переупаковать инсталлятор, обычно делают снимок реестра и вместе с нужными ключами реестра для этой игры, пихают весь свой хлам из системы, что вообще не относится к данному инсталлятору. В итоге, получается бардак с реестром. ИМХО.
Цитата:

Цитата semiono
Суть вопроса какраз в том, как правильно удалять
используя PendingFileRenameOperations, но меня не один файлик интересует, а сразу много! »

Что вы удаляете? откуда? И честное слово, я не телепат... Если вы действительно хотите получить помощь, то показывайте скрипт и объясните нормально, для чего вам записи в PendingFileRenameOperations? и как на основе этих записей вы, что-то собрались удалять?
Одним словом, вопросов встречных много...

P.S.
Вот вам пример скрипта, устанавливайте, сколько угодно раз и всегда будет дописываться ещё одна строка...
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Registry]
Root: HKLM; SubKey: SOFTWARE\My Program; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\My Program; ValueType: multisz; ValueName: My Program; ValueData: {olddata}My Program{break}; Flags: uninsdeletevalue uninsdeletekeyifempty



И извините, за мою неточность: {break} - это шесть нолей...

Serega 03-06-2009 19:09 1134163

-Marshall-, используйте шифрование инсталлятора...
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
Password=-Marshall-
Encryption=True

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}

[_Code]
// пропускаем страницу с вводом пароля
procedure CurPageChanged(CurPageID: Integer);
begin
  If CurPageID = wpPassword then begin
    WizardForm.PasswordEdit.Text := '-Marshall-';
    WizardForm.NextButton.OnClick(WizardForm.NextButton);
  end;
end;


semiono 03-06-2009 22:36 1134351

Цитата:

Цитата Serega_
Вы имеете в виду не создаёте деинсталлятор? »

Да, uninstall у меня тоже отсутствует.
Цитата:

Цитата Serega_
Вот здесь, я с вами не согласен, это скорей всего, попытка не правильной перекодировки из формата Unicode в ANSI »

Я не знаю, но можно посмотреть сюда, где полно таких же записей:
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices

Вообще в разделе SYSTEM\Services я встречал какие угодно записи, например
%SystemRoot%\System32 и тут же \SystemRoot\System32 и всё это записи майкрософт по большому счёту,
всмысле если даже \??\ это не правильная запись от \??\\ я тоже с этим согласен. :)

Цитата:

Цитата Serega_
Что вы удаляете? откуда? И честное слово, я не телепат »

А какая разница что, если надо удалять? :)
Конечно же открытые и не доступные для удаления файлы!
К примеру, я заменил Icons ресурсы в taskmgr.exe, или если пофантазировать русифицыровал его, хотя это навряд ли. Впрочем, я ошибаюсь taskmgr легко итак заменить, а вот какие-то DLL ну скажем даже shell32.dll,
то это без перезагрузки не получиться. Сначала я переименовываю файл в shell32.old, потом удаляю.

Цитата:

Цитата Serega_
Если вы действительно хотите получить помощь, то показывайте скрипт »

Часть скрипта в первом посте, весь целиком он не интересен и большой. Суть вообще-то понятна я думаю..?

Цитата:

Цитата Serega_
: {break} - это шесть нолей... »

Вы меня опять убили :)
Я так и не проверял ещё, но раньше вроде заглядывал и между записями путей вроде бы 00 00 было!?...
Где-то это продокументированно в Inno хелпе чтоли?

Пример установки PowerISO:
Код:

[Setup]
AppName=PowerISO
AppVerName=PowerISO 4.4.0.0
AllowUNCPath=yes
DefaultDirName={code:GetPath}
DirExistsWarning=no
DisableDirPage=yes
DisableFinishedPage=no
DisableProgramGroupPage=yes
DisableReadyMemo=yes
DisableReadyPage=no
ArchitecturesInstallIn64BitMode=x64
Compression=lzma
SolidCompression=yes
OutputDir=..\..\SVCPACK
OutputBaseFilename=PowerISO
TouchDate=2001-01-01
TouchTime=00:00
MinVersion=4.1,4.0
VersionInfoCompany=Semiono
VersionInfoCopyright=2001-2005 GmbH
VersionInfoDescription=PowerISO
VersionInfoTextVersion=4.4.0.0
VersionInfoVersion=4.4.0.0
Uninstallable=no
UsePreviousAppDir=no
SetupIconFile=.\Patch\PowerISO.ico
WizardImageFile=.\Patch\PowerISO.bmp

[Messages]
BeveledLabel= AMD64 +

[Сode]
var
  Dir: String;
function GetPath(Param: String): String;
var
  S: TArrayOfString;
  F: String;
begin
  F := Dir + 'PowerISO';
  if not FileExists(F) then
    Result := ExpandConstant('{pf}\PowerISO')
  else
  begin
  LoadStringsFromFile(F, S);
  Result := S[0];
  end;
end;

function InitializeSetup(): Boolean;
begin
  Dir := ExpandConstant('{sd}\');
  Result := True;
end;

procedure InitializeWizard();
begin
  try
  DeleteFile(ExpandConstant('{sys}\drivers\scdemu.o'))
  RenameFile(ExpandConstant('{sys}\drivers\scdemu.sys'),ExpandConstant('{sys}\drivers\scdemu.o'))
  except
  Beep; Exit;
  end;
  try
  DeleteFile(ExpandConstant('{code:GetPath}\pwrisosh.o'))
  RenameFile(ExpandConstant('{code:GetPath}\pwrisosh.dll'),ExpandConstant('{code:GetPath}\pwrisosh.o'))
  except
  Beep; Exit;
  end;
  try
  DeleteFile(ExpandConstant('{code:GetPath}\pwrisovm.o'))
  RenameFile(ExpandConstant('{code:GetPath}\pwrisovm.exe'),ExpandConstant('{code:GetPath}\pwrisovm.o'))
  except
  Beep; Exit;
  end;
end;

procedure DeinitializeSetup();
var
  S: TArrayOfString;
  F: String;
begin
  F := ExpandConstant('{sys}\PowerISO.cmd');
  SetArrayLength(S, 1);
  S[0] := ExpandConstant('@start {code:GetPath}\PowerISO.exe "%1" %*');
  SaveStringsToFile(F, S, False);
end;

[Dirs]
Name: "{code:GetPath}"; Attribs: readonly; Flags: uninsneveruninstall; Permissions: admins-full

[Icons]
Name: "{userprograms}\PowerISO"; Filename: "{code:GetPath}\PowerISO.exe"; WorkingDir: "{code:GetPath}"; IconIndex: 0; Comment: "PowerISO"
Name: "{sendto}\PowerISO"; Filename: "{code:GetPath}\PowerISO.exe"; WorkingDir: "{code:GetPath}"; IconIndex: 0; Comment: "PowerISO"

[Registry]
; Run
Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\App Paths\PowerISO.exe"; ValueType: string; ValueName: ""; ValueData: "{code:GetPath}\PowerISO.exe"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\App Paths\PowerISO.exe"; ValueType: string; ValueName: "Path"; ValueData: "{code:GetPath}"; Flags: noerror; Permissions: admins-full
; Labels
Root: HKLM; Subkey: "Software\Classes\CLSID\{{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\PowerISO"; ValueType: string; ValueName: ""; ValueData: "&PowerISO"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "Software\Classes\CLSID\{{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\PowerISO\command"; ValueType: string; ValueName: ""; ValueData: "{code:GetPath}\PowerISO.exe"; Flags: noerror; Permissions: admins-full
; Delete
Root: HKCU; Subkey: "Software\PowerISO"; Flags: deletekey noerror; Permissions: admins-full
; PowerISO
Root: HKCU; Subkey: "Software\PowerISO"; ValueType: binary; ValueName: "USER"; ValueData: "xx xx xx ... b3 88"; Flags: noerror; Permissions: admins-full
Root: HKCU; Subkey: "Software\PowerISO"; ValueType: binary; ValueName: "MainWindow"; ValueData: "90 00 00 00 86 00 00 00 60 03 00 00 50 02 00 00 00 00 00 00"; Flags: noerror; Permissions: admins-full
Root: HKCU; Subkey: "Software\PowerISO"; ValueType: dword; ValueName: "Language"; ValueData: "$00000409"; Flags: noerror; Permissions: admins-full
Root: HKCU; Subkey: "Software\PowerISO"; ValueType: dword; ValueName: "ShellIntegration"; ValueData: "$00000001"; Flags: noerror; Permissions: admins-full
Root: HKCU; Subkey: "Software\PowerISO"; ValueType: dword; ValueName: "Status"; ValueData: "$00000005"; Flags: noerror; Permissions: admins-full
Root: HKCU; Subkey: "Software\PowerISO"; ValueType: string; ValueName: "Install_Dir"; ValueData: "{code:GetPath}"; Flags: noerror; Permissions: admins-full
Root: HKCU; Subkey: "Software\PowerISO\SCDEmu"; ValueType: dword; ValueName: "DiskCount"; ValueData: "$00000000"; Flags: noerror; Permissions: admins-full
Root: HKCU; Subkey: "Software\PowerISO\SCDEmu"; ValueType: dword; ValueName: "FLAGS"; ValueData: "$00000000"; Flags: noerror; Permissions: admins-full
; PowerISO File
Root: HKLM; Subkey: "Software\Classes\.daa"; ValueType: string; ValueName: ""; ValueData: "PowerISO"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "Software\Classes\.iso"; ValueType: string; ValueName: ""; ValueData: "PowerISO"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "Software\Classes\.uif"; ValueType: string; ValueName: ""; ValueData: "PowerISO"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "Software\Classes\PowerISO"; ValueType: string; ValueName: ""; ValueData: "PowerISO File"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "Software\Classes\PowerISO\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{code:GetPath}\PowerISO.exe,0"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "Software\Classes\PowerISO\shell\open\command"; ValueType: string; ValueName: ""; ValueData: "{code:GetPath}\PowerISO.exe ""%1"""; Flags: noerror; Permissions: admins-full
; Delete
Root: HKLM32; Subkey: "Software\PowerISO"; Flags: deletekey noerror; Permissions: admins-full
; ContextMenuHandlers
Root: HKLM; Subkey: "Software\Classes\*\shellex\ContextMenuHandlers\PowerISO"; ValueType: string; ValueName: ""; ValueData: "{{967B2D40-8B7D-4127-9049-61EA0C2C6DCE}"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "Software\Classes\Folder\shellex\ContextMenuHandlers\PowerISO"; ValueType: string; ValueName: ""; ValueData: "{{967B2D40-8B7D-4127-9049-61EA0C2C6DCE}"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "Software\Classes\Directory\shellex\ContextMenuHandlers\PowerISO"; ValueType: string; ValueName: ""; ValueData: "{{967B2D40-8B7D-4127-9049-61EA0C2C6DCE}"; Flags: noerror; Permissions: admins-full
; Approved
Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved"; ValueType: string; ValueName: "{{967B2D40-8B7D-4127-9049-61EA0C2C6DCE}"; ValueData: "PowerISO"; Flags: noerror; Permissions: admins-full
; Services
Root: HKLM; Subkey: "System\ControlSet001\Services\SCDEmu"; ValueType: dword; ValueName: "ErrorControl"; ValueData: "$00000001"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "System\ControlSet001\Services\SCDEmu"; ValueType: dword; ValueName: "MaxDiskCount"; ValueData: "$00000008"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "System\ControlSet001\Services\SCDEmu"; ValueType: dword; ValueName: "Start"; ValueData: "$00000001"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "System\ControlSet001\Services\SCDEmu"; ValueType: dword; ValueName: "Type"; ValueData: "$00000001"; Flags: noerror; Permissions: admins-full
; PendingFileRenameOperations
Root: HKLM; Subkey: "System\ControlSet001\Control\Session Manager"; ValueType: multisz; ValueName: "PendingFileRenameOperations"; ValueData: "{olddata}{break}{break}\??\{sys}\drivers\scdemu.o"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "System\ControlSet001\Control\Session Manager"; ValueType: multisz; ValueName: "PendingFileRenameOperations"; ValueData: "{olddata}{break}\??\{code:GetPath}\pwrisosh.o"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "System\ControlSet001\Control\Session Manager"; ValueType: multisz; ValueName: "PendingFileRenameOperations"; ValueData: "{olddata}{break}\??\{code:GetPath}\pwrisovm.o{break}{break}"; Flags: noerror; Permissions: admins-full

[Files]
Source: "T:\Process\Lang\*"; DestDir: "{code:GetPath}\Lang"; Flags: ignoreversion overwritereadonly touch; Permissions: admins-full
Source: "T:\Process\Skins\*"; DestDir: "{code:GetPath}\Skins"; Flags: ignoreversion overwritereadonly touch; Permissions: admins-full
Source: "T:\Process\desktop.ini"; DestDir: "{code:GetPath}"; Flags: ignoreversion overwritereadonly touch; Permissions: admins-full
Source: "T:\Process\piso.exe"; DestDir: "{code:GetPath}"; Flags: ignoreversion overwritereadonly touch; Permissions: admins-full
Source: "T:\Process\PowerISO.chm"; DestDir: "{code:GetPath}"; Flags: ignoreversion overwritereadonly touch; Permissions: admins-full
Source: "T:\Process\PowerISO.exe"; DestDir: "{code:GetPath}"; Flags: ignoreversion overwritereadonly touch; Permissions: admins-full
Source: "T:\Process\pwrisosh32.dll"; DestDir: "{code:GetPath}"; DestName: "pwrisosh.dll"; Flags: noregerror onlyifdoesntexist regserver touch; Check: not IsWin64; Permissions: admins-full
Source: "T:\Process\pwrisosh64.dll"; DestDir: "{code:GetPath}"; DestName: "pwrisosh.dll"; Flags: noregerror onlyifdoesntexist regserver touch; Check: IsWin64; Permissions: admins-full
Source: "T:\Process\pwrisovm.exe"; DestDir: "{code:GetPath}"; Flags: onlyifdoesntexist touch; Permissions: admins-full
Source: "T:\Process\setup64.exe"; DestDir: "{code:GetPath}"; Flags: onlyifdoesntexist touch; Check: IsWin64; Permissions: admins-full
Source: "T:\System\drivers\scdemu32.sys"; DestDir: "{sys}\drivers"; DestName: "scdemu.sys"; Flags: onlyifdoesntexist touch; Check: not IsWin64; Permissions: admins-full
Source: "T:\System\drivers\scdemu64.sys"; DestDir: "{sys}\drivers"; DestName: "scdemu.sys"; Flags: onlyifdoesntexist touch; Check: IsWin64; Permissions: admins-full


dinazav 03-06-2009 23:40 1134394

BlackSelf, спасибо за помощь. Но мой скрипт создан в Inno Setup 5.1.12 и на такие функции как "CopyFiles", "MoveFiles" и "RemoveDir" компилятор ругается... Мож изменить чего надо?


все поставил ISToll 5.2 на функции не ругается, но по прежнему не хочет делать резервную копию файла

Serega 04-06-2009 00:07 1134417

Цитата:

Цитата semiono
Я не знаю, но можно посмотреть сюда, где полно таких же записей:
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices »

Сказать честно, никогда туда не заглядывал и действительно, есть такие вопросы в путях...
Цитата:

Цитата semiono
Я так и не проверял ещё, но раньше вроде заглядывал и между записями путей вроде бы 00 00 было!?...
Где-то это продокументированно в Inno хелпе чтоли? »

Нет, это из моего опыта.
Цитата:

Цитата semiono
Пример установки PowerISO: »

из вашего кода не понятно, для чего вам ; PendingFileRenameOperations, но надо записывать, как я уже и говорил ранее:
Код:

ValueData: "{olddata}\??\{sys}\drivers\scdemu.o{break}";
ValueData: "{olddata}\??\{code:GetPath}\pwrisosh.o{break}";
ValueData: "{olddata}\??\{code:GetPath}\pwrisovm.o{break}";

Проверил запись в реестре, все появляется как надо...

P.S.
К сожалению ни программы PowerISO, ни скрипта для неё у меня не оказалось, но насколько я знаю ключ HKEY_LOCAL_MACHINE\System\ControlSet001\... - никаким боком не относится к программе.

semiono 04-06-2009 00:39 1134434

Спасибо за конструктивный разговор! Хорошо что я свою тему Inno Setup нашёл, хотя я изначально сомневался,
так как часто бывает по инсталлеру обсуждают сугубо конкретные инсталерные дела.
Но мне иногда бывает понадобиться чтонибудь этакое o_0 :)
Самое главное чтоб разговор был конструктивным, чтобы можно было больше узнать. :)

Цитата:

Цитата Serega_
HKLM\System\ControlSet001\... - никаким боком не относится к программе. »

В нём регистрируется служба использующая драйвер scdemu.sys, который поставляется вместе с приложением, это сервис виртуальных CD-ROM от PowerISO программы.

Цитата:

Цитата Serega_
из вашего кода не понятно, для чего вам ; PendingFileRenameOperations »

Для того чтобы удалить возможно имеющиеся файлы от предыдущей версии, (для установки поверх и поверх себя)

1. scdemu.sys (> scdemu.o) - я не уверен, возможно что драйвер(ы) можно просто даже удалять?

2. pwrisosh.dll - этот файл обычное расширение проводника, тоесть он регистрируется как
regsvr32 /s pwrisosh.dll
из чего понятно что шел его не даст так просто удалить, поэтому я сначало его переименовываю
в секции [code] а потом удаляю как pwrisosh.o

3. pwrisovm.exe - а это менеджер CR-ROM, вполне возможно что он будет торчать в системном трее,
и удалить тогда напрямую него нельзя, то же самое pwrisovm.exe > pwrisovm.o и делет через пендинг =)

У меня цель исключить все вопросы и диалоги в непредвиденной ситуации,
инсталятор должен сам решать и принимать решения, при условии что он грамотно сконструирован.

Цитата:

Цитата Serega_
Проверил запись в реестре, все появляется как надо... »

Если не поленитесь проверьте? Я уверен что файлы не будут удалены.
Можно попрактиковаться с
C:\New Text Document.txt
C:\New Text Document (2).txt

semiono 04-06-2009 01:32 1134465

Цитата:

"\\?\"
Вот страничка какраз нашлась File Names, Paths, and Namespaces
http://msdn.microsoft.com/en-us/libr...,printer).aspx

Serega 04-06-2009 09:00 1134577

Цитата:

Цитата semiono
так как часто бывает по инсталлеру обсуждают сугубо конкретные инсталерные дела. »

Так ведь это и есть инсталерные дела... :)
Цитата:

Цитата semiono
Самое главное чтоб разговор был конструктивным, чтобы можно было больше узнать. »

Это всё зависит от собеседников. :)
Цитата:

Цитата semiono
Для того чтобы удалить возможно имеющиеся файлы от предыдущей версии, (для установки поверх и поверх себя) »

Из приведённого вами кода этого не видно, т.е. в скрипте нет обращений к данной ветке реестра для проверки значений и на основании этого выполнения каких-либо действий инсталлятором.
Цитата:

Цитата semiono
из чего понятно что шел его не даст так просто удалить, поэтому я сначало его переименовываю
в секции [code] а потом удаляю как pwrisosh.o »

Интересное решение.
Цитата:

Цитата semiono
инсталятор должен сам решать и принимать решения, при условии что он грамотно сконструирован. »

Это верное замечание, но не в обиду вам сказано, я бы не хотел использовать ваши инсталляторы на своей системе. Хотя подход к реализации некоторых вещей, интересен, но всё же объясняю почему - нет:
У пользователя всегда должно быть право удалить установленную программу, всегда должен быть выбор, при этом о виртуозности и профессионализме человека, который делал инсталлятор, говорит то, что после удаления не остаётся никаких хвостов, т.е. удаляются все установленные службы в системе и записи в реестре, сделанные этой программой.
Цитата:

Цитата semiono
Если не поленитесь проверьте? Я уверен что файлы не будут удалены. »

т.е. мне в ручную создать эти файлы и попытаться удалить их инсталлятором в процессе установки?
если да, то использовал скрипт и всё нормально удалилось:
Скрипт
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[_Code]
procedure CurPageChanged(CurPageID: Integer);
var
 file1, file2: string;
begin
  If CurPageID = wpInstalling then
  begin
    file1:= ExpandConstant('{sd}\New Text Document.txt');
    file2:= ExpandConstant('{sd}\New Text Document(2).txt');
    if FileExists(file1) then
    if DeleteFile(file1) then
      MsgBox('Файл: ' + ExtractFileName(file1) + ' успешно удалён!', mbInformation, MB_OK)
    else MsgBox(ExtractFileName(file1) + ' - облом!', mbInformation, MB_OK);
    if FileExists(file2) then
    if DeleteFile(file2) then
      MsgBox('Файл: ' + ExtractFileName(file2) + ' успешно удалён!', mbInformation, MB_OK)
    else
    MsgBox(ExtractFileName(file2) + ' - облом!', mbInformation, MB_OK);
  end;
end;



Цитата:

Цитата semiono
Вот страничка какраз нашлась File Names, Paths, and Namespaces »

Спасибо, я этого не знал... :)

semiono 04-06-2009 17:58 1135092

Serega_, ведь вы удалили файлы которые свободно можно удалить.
Но я имел ввиду используя PendingFileRenameOperations, чтобы проверить работу самого параметра.
И тут уже не важно что именно это за файлы, так как если помните разговор был об нулях...

Но это уже даже не нужно, так как пару решений снова возникло. :)

Для того чтобы проверить правильность записей, можно использовать это

Код:

; http://flatassembler.net/fasmw16738.zip
include '%fasm%\win32wx.inc' ; здесь нужно записать корректно!

section '.code' code readable executable
start:
        invoke MoveFileEx,lpExistingFileName1,NULL,MOVEFILE_DELAY_UNTIL_REBOOT
        invoke MoveFileEx,lpExistingFileName2,NULL,MOVEFILE_DELAY_UNTIL_REBOOT
        invoke MoveFileEx,lpExistingFileName3,NULL,MOVEFILE_DELAY_UNTIL_REBOOT
        invoke  ExitProcess,0

        lpExistingFileName1 db '\\?\C:\New Text Document.txt',0
        lpExistingFileName2 db '\\?\C:\New Text Document (2).txt',0
        lpExistingFileName3 db '\\?\C:\New Text Document (3).txt',0

data import
        library kernel32,'KERNEL32.DLL'
        import kernel32,ExitProcess,'ExitProcess',MoveFileEx,'MoveFileExA'
end data

section '.rsrc' resource data readable

        directory RT_ICON,icons,RT_GROUP_ICON,group_icons,RT_VERSION,versions
        resource icons,1,LANG_NEUTRAL,icon_data
        resource group_icons,17,LANG_NEUTRAL,main_icon
        resource versions,1,LANG_NEUTRAL,version

        icon main_icon,\
        icon_data,'%SystemRoot%\Icons\exec.ico'

Получается, что нулей между строками пять! Использование этой API вообще меня обрадовало,
так как записи сами добавляются в хвост, без всяких {olddata}
Можно даже этим бинарем и пользоваться как внешним скриптом. :)

Но есть и другое решение. Я же изначально знал что NSIS переименовывает файлы а не удаляет.
Но я что-то сам комплексовал и тупил. Почему-то мне показалось это не надёжно то ли не совсем очевидно.
Но я всётаки сейчас понял как всё должно быть, правда ещё сказалось то что я наконец-то прочитал документацию, как они пишут что PendingFileRenameOperations запускается после chkdsk ещё до старта оболочки, тоесть можно смело переименовывать файлы, а зачем их тогда удалять!
Именно так nsis инсталлер и делает. Просто копируется новый файл как *.tmp и на загрузке он копируется
скажем в shll32.dll. То есть я лишнего намудрил с удалениями *.old

Цитата:

Цитата Serega_
я бы не хотел использовать ваши инсталляторы на своей системе. »

Это не удивительно, и я знаю об этом. :)
Но просто у меня с инсталлерами это целая философия. Вообще это часть "моей системы" winxp,
которую я собираю для себя. Но всё же хочется верить что и ктонить ещё установит.

Я просто думаю о том, что многие программы, практически все устанавливаются поверх себя сколько угодно раз.
Приложения должны устанавливаться в %ProgramFiles% за исключением каких-то гигантов.
Просто потому что {pf} уже придуманна и её проще целиком переименовать и переместить если не нравиться то что есть.
uninst.exe - хотя и очень маленький файл, но тем не менее по большому счёту хлам.
Я всё же расчитываю немного на продвинутого пользователя, чтобы удалить программу достаточно
удалить её папку [del] и если надо затереть ключи в software разделах реестра.
Остальное можно расчистить любым рег-клинером.
Но самое глдавное, что на самом деле эти записи не на что не влияют.
Да и на размере реестра это не сказывается. Если записи актуальные, то новая интсаляция перепишет их.
Тут дело ещё и в том, что например Adobe Reader во-первых засоряет не на шутку HKLM\Software\Classes,
вдобавок пишет тонны хешей в uninstall ветку реестра, это уже работает MSI интсаллер.
Я одинакого обхожу стороной их обоих. И как бы нахально заявляю что мои програмки все не проблемные
и даже если не нужны совершенно, то не стоит их удалять, так как они никому не мешают.
Хотя о вкусах конечно можно поспорить. :)
Вообщем я сначала делаю а потом меня пусть осудят ))
Я надеюсь не сильно ругать будут ))
Сейчас стал пробираться в 64 битную WinXP, слежу чтобы инсталятор правильно работал и там.
Поначалу массу ошибок понаделал, так как я думал HKCU32 это панацея от всего, но как оказалось
такого ключа вообще нет, а есть только HKLM32 тоесть ссылка на HKLM\Software\wow6432node,
что гораздо чаще используется так как приложения в большинстве своём 32 битные.
Но ито там думать приходиться так как ярлык
Код:

Root: HKLM; Subkey: "Software\Classes\CLSID\{{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Cpuz"; ValueType: string; ValueName: ""; ValueData: "&Cpuz"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "Software\Classes\CLSID\{{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Cpuz\command"; ValueType: string; ValueName: ""; ValueData: "{code:GetPath}\Cpuz.exe"; Flags: noerror; Permissions: admins-full

просто не будет виден из HKLM32 под 64 битным проводником ;-

Цитата:

Цитата Serega_
если да, то использовал скрипт и всё нормально удалилось: »

а в паскале я очень тяжело разбираюсь :(
чтобы что либо написать самостоятельно гуглю часами :) как и в остальном всём

DemonAk 04-06-2009 19:21 1135135

Привет всем, есть sfx архив data.exe созданный freearc'ом, есть у кого примерчик как прикрутить второй прогрессбар, что бы он был чуть ниже основного или его продолжением и показывал сколько процентов осталось. С Serega_Inc. скриптом не могу разобраться ведь с sfx должно быть вроде попроще.

Serega 04-06-2009 20:00 1135174

Цитата:

Цитата semiono
Получается, что нулей между строками пять! »

Не согласен, вот пример экспортированного ключа реестра:
Пример
Код:

"SystemBiosVersion"=hex(7):47,00,42,00,54,00,20,00,20,00,20,00,20,00,2d,00,20,\
  00,34,00,32,00,33,00,30,00,32,00,65,00,33,00,31,00,00,00,41,00,77,00,61,00,\
  72,00,64,00,20,00,4d,00,6f,00,64,00,75,00,6c,00,61,00,72,00,20,00,42,00,49,\
  00,4f,00,53,00,20,00,76,00,36,00,2e,00,30,00,30,00,50,00,47,00,00,00,00,00


если перевести в IS, то:
Код:

ValueType: multisz; ValueName: SystemBiosVersion; ValueData: GBT    - 42302e31{break}Award Modular BIOS v6.00PG{break}
Из этого получается, что {break} - шесть нолей...

Цитата:

Цитата semiono
Хотя о вкусах конечно можно поспорить. »

я думаю нет смысла... :)
Цитата:

Цитата semiono
а в паскале я очень тяжело разбираюсь »

я тоже полгода назад, знал только название самого языка, а сейчас хоть узнал как процедуры называются... :)

Цитата:

Цитата DemonAk
ведь с sfx должно быть вроде попроще »

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

DemonAk 04-06-2009 21:51 1135271

Цитата:

Цитата Serega_
ничего подобного, там просто ключи распаковки, т.е. запуска архива будут разные, а всё остальное тоже самое... »

Да это понятно, толкьо вот в чем дело я не собираюсь архив копировать сначала на диск С:\, потом запускать батник для распаковки и тд. Хочу чтобы он с dvd распаковывался. И хоть я и установил расширенную версию inno пытаюсь собрать инсталл он ругается на Application.ProcessMessages; типа unknown identifier Application

Serega 04-06-2009 22:02 1135278

Цитата:

Цитата DemonAk
Хочу чтобы он с dvd распаковывался »

чуть позже выложу пример...
Цитата:

Цитата DemonAk
он ругается на Application.ProcessMessages »

Попробуйте эту версию.

DemonAk 05-06-2009 01:53 1135416

Цитата:

Цитата Serega_
Попробуйте эту версию. »

Скопировал вот это InnoSetup FullVCL и заробило.
Цитата:

Цитата Serega_
чуть позже выложу пример... »

С нетерпением жду)

semiono 05-06-2009 12:17 1135674

Цитата:

Цитата Serega_
Из этого получается, что {break} - шесть нолей... »

Serega_, break наверное шесть, я имел ввиду что через
invoke MoveFileEx,lpExistingFileName1,NULL,MOVEFILE_DELAY_UNTIL_REBOOT
пять получалось, хотя надо посчитать, я только за комп сел :)
Правда мне кажется там суть такова, что один байт "00" это конец строки или закрытие строки,
а "00 00 00 00" это новая пустая строка или NULL кароче то чем "затирает", может она и длинее даже...

semiono 05-06-2009 15:44 1135816

Даже сейчас с уверенностью сказать трудно, но этот брейк даёт четыре нуля '00 00'
Код:

Root: HKLM; Subkey: "Software\ax"; ValueType: multisz; ValueName: "a"; ValueData: "{break}."; Flags: noerror; Permissions: admins-full
Дело в том, как я понял, что там юникод типа, и каждый символ записывается как два байта, отсюда запись точки скажем будет 2E 00, вот это и путает.

semiono 05-06-2009 18:58 1136001

Вот этот код работает, даже если его поделить на два инсталлера и частями запускать
Код:

[Registry]
; PendingFileRenameOperations
Root: HKLM; Subkey: "System\ControlSet001\Control\Session Manager"; ValueType: multisz; ValueName: "PendingFileRenameOperations"; ValueData: "{olddata}\??\{sd}\ax{break}\??\{sd}\xb"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "System\ControlSet001\Control\Session Manager"; ValueType: multisz; ValueName: "PendingFileRenameOperations"; ValueData: "{olddata}\??\{sd}\bx{break}\??\{sd}\xa"; Flags: noerror; Permissions: admins-full

[Files]
Source: "ax"; DestDir: "{sd}"; Flags: ignoreversion overwritereadonly touch; Permissions: admins-full
Source: "bx"; DestDir: "{sd}"; Flags: ignoreversion overwritereadonly touch; Permissions: admins-full

Причём даже {break} в конце строк не нужен. И даже это '!' не надо,
я вообще подозревал ещё раньше что это какая то опция а не указатель на target, ещёб узнать её значение!?
Однако, проблем опять не убавилось :)
Так как суперзадачей стоит заменить shell32.dll, то как оказалось его даже restartreplace стандартный флаг
не способен потянуть. Сразу же возникает предположение, что уж что а shell32.dll видимо грузится очень рано и уже просто невозможно бывает его заменять. Придётся вернуться к старым методам переименования
до перезагрузки, хотя там я так и не выяснил точный синтакс.
Кстати, я точно установил, что {break} в конце строки безполезен, то ли его инно игнорирует то ли реестр,
хоть десять бряков записать в реестре строка будет закрыта всегда как "00 00 00", если только она не последняя. Поэтому у меня там брейки вначале стояли, так как сначала строки они почему-то не игнорируются.
Там вообще загадок много, например, если я програмно из ассемлера пытался писать без
преффикса \\?\ который сам превращается потом в \??\ то без него вообще лажа получается - путь лезет прямо
от папки исходника, вот дурь!

ЗЫ я ещё не надоел тут с этим своим PendingFileRenameOperations :) ?

Serega 05-06-2009 19:27 1136021

Цитата:

Цитата DemonAk
С нетерпением жду) »

Извиняюсь, только добрался до компьютера...

Цитата:

Цитата semiono
Вот этот код работает, даже если его поделить на два инсталлера и частями запускать »

Ну, что здесь сказать, водимо {olddata} заставляет инсталлятор добавлять перевод строки если его там нет...
Цитата:

Цитата semiono
Кстати, я точно установил, что {break} в конце строки безполезен, то ли его инно игнорирует то ли реестр,
хоть десять бряков записать в реестре будет строка закрыта как "00 00 00" всегда, если только она не последняя. »

неправда, Inno игнорирует по-моему больше пятнадцати {break} и в все они заносятся в реестр, плюс добавляется, это видно после экспорта из реестра, в конец ключа ещё 00,00
Цитата:

Цитата semiono
я ещё не надоел тут с этим своим PendingFileRenameOperations »

Не переживайте...

grinda 07-06-2009 15:19 1137430

скажите, а есть ли запаковщик setup'а, чтоб заново не компилировать, а директорию или ярлык в скрипте поправить.

Serega 07-06-2009 17:11 1137500

Цитата:

Цитата grinda
а есть ли запаковщик setup'а, чтоб заново не компилировать, а директорию или ярлык в скрипте поправить. »

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

Krekerpro 07-06-2009 21:40 1137706

Может ктонить дать скрипт для распаковки архива free arc'a?

Kutsenko Andriy 08-06-2009 12:48 1138167

Заметил такую штуку в инсталах от InstallShield: когда нажимеш на кнопку отмена на любой странице установки и отвечаеш "Да" то появляется вот такая страничка:

Кто знает как такое можна сделать в Inno Setup'e??? Заранее Спасибо!

semiono 08-06-2009 13:30 1138220

насколько понял это надо дополнительную страницу самому нарисовать? и связать её с [tasks] секцией?
что-то вроде этого, только с другими константами...
Код:

[C0de]
var DataDirPage: TInputDirWizardPage;

procedure InitializeWizard;
begin
    DataDirPage := CreateInputDirPage(wpSelectTasks, 'External...',
                                      '1,43 GB (1*545*427*804 bytes)',
                                      'Sounds files will be stored:',
                                      False, 'New Folder');
    DataDirPage.Add('Location:');
    DataDirPage.Values[0] := ExpandConstant('{reg:HKLM32\Software\VST,VSTPluginsPath|{sd}}\RMIV');
end;

function GetDataDir(Param: String): String;
begin
    Result := DataDirPage.Values[0];
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
    if PageID = DataDirPage.ID {wpSelectTasks} then
    begin
        if IsTaskSelected('External') then Result := false
        else Result := true;
    end
    else {wpPreparing} Result := false;
end;

CreateInputDirPage надо зделать под Cancel Page наверное...

Цитата:

Цитата Serega
неправда, Inno игнорирует по-моему больше пятнадцати {break} и в все они заносятся в реестр, плюс добавляется, это видно после экспорта из реестра, в конец ключа ещё 00,00 »

я нули считал между концом и началом строк "путей файлов на удаление" прямо в реестре нажав 'Modify binary data',
так как там немного было и легко сосчитать на глаз, поэтому export я не делал.
Десять дел делаю одновременно, поэтому уже трудно вернуться уточнить =)

Kutsenko Andriy 08-06-2009 13:50 1138239

Цитата:

Цитата semiono
CreateInputDirPage надо зделать под Cancel Page наверное... »

А как это сделать? У меня просто знаний на такое нехватит(, вот я к вам и обращаюсь.
Цитата:

Цитата semiono
насколько понял это надо дополнительную страницу самому нарисовать? »

Именно это мне и нада!

Serega 08-06-2009 22:35 1138645

Здравствуйте, исправил скрипт распаковки FreeArc архивов...
Теперь используются внешние архивы, без копирования в папку приложения.

sanya007 08-06-2009 23:23 1138704

Serega,

Я не много по другому создал батник, и не пришлось ничего прописывать в procedure CurStepChanged

Код:

procedure BatRunArc(s: string);
var
  bat, a, b, str: string;
  res: Integer;
begin
  bat := ExpandConstant('{tmp}\RunArc.bat');          /// путь откуда запускается батник
  a:=ExpandConstant('{src}')      ////  Назначаем путь для переменной  "A"
  b:=ExpandConstant('{app}')            ////  Назначаем путь для переменной  "B"
  str := str + '@echo off' + #10#13 +
        str + 'Arc x "' + a + '" -y -s2 -dp"' + b + '" >in_log' + #10#13 +    /// Распаковка из переменной "A" в переменную "B"
        str + 'del ' + '"' + bat + '"';  ////  Батник убивает сам себя
  SaveStringToFile(bat, str, False);
  Exec(bat, '', '', SW_HIDE, ewNoWait, res);  ////  Прячем выполнение батника от "Посторонних глаз"
end;


Serega 08-06-2009 23:37 1138726

Цитата:

Цитата sanya007
Я не много по другому создал батник »

здесь уж на любителя... :)
Самое главное - результат, а пути достижения могут быть разные...

DemonAk 08-06-2009 23:43 1138732

Цитата:

Цитата Serega
Здравствуйте, исправил скрипт распаковки FreeArc архивов...
Теперь используются внешние архивы, без копирования в папку приложения. »

Огромная благодарность, все отлично работает :yahoo: :up

Krekerpro 09-06-2009 00:02 1138753

А что надо в батнике прописать?

Serega 09-06-2009 00:26 1138779

Цитата:

Цитата Krekerpro
А что надо в батнике прописать? »

Там уже всё прописано, а менять нужно здесь:
читать дальше »
Код:

...................................
procedure CurStepChanged(CurStep: TSetupStep);
begin
  If CurStep = ssPostInstall then begin
    patch_Arc:= ExpandConstant('"{src}\Arc.exe"'); // расположение Arc.exe
    UnpackArc(ExpandConstant('"{src}\Project.arc"'), // расположение архива
      ExpandConstant('"{app}"')); // место распаковки архива
  end;
end;
.................................


Krekerpro 09-06-2009 00:32 1138783

Serega,
При попытки компиляции выявляет ошибку: http://clip2net.com/clip/m0/1244493206-clip-47kb.png

Serega 09-06-2009 00:43 1138790

Цитата:

Цитата Krekerpro
При попытки компиляции выявляет ошибку »

Скрипт покажите...

Krekerpro 09-06-2009 00:46 1138795

Serega,
читать дальше »
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=D:\123
Compression=lzma/ultra
SolidCompression=yes
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]

Source: C:\Program Files\FreeArc\bin\Arc.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\DirectX.arc; DestDir: {app}; Afterinstall: UnpackArc('DirectX.arc'); Flags: ignoreversion skipifsourcedoesntexist



[UninstallDelete]
Name: {app}; Type: filesandordirs

[code]
var
ProgressLabel: TLabel;
ProgressBar: TNewProgressBar;
patch_Arc: string;

procedure ParserLog;
var
in_File, out_File, S, S1, S2: string;
i, j, n: Integer;
begin
in_File := ExpandConstant('{tmp}\in_log');
out_File := ExpandConstant('{tmp}\out_log');
ProgressBar.Show;
ProgressLabel.Show;
// если файла нет, то подождём... ;)
if FileExists(in_File) = False then
repeat
Application.ProcessMessages; // необходима расширенная версия от Restools
n:= n + 1;
Sleep(500); // ждём полсекунды и повторяем цикл
until (FileExists(in_File) = True) or (n = 10); // максимально повторяем цикл 10 раз, что составит 5 секунд...
// если всё же файла нет, то выходим
if FileExists(in_File) = False then Exit;
// если файл существует, то обробатываем его
repeat
FileCopy(in_File, out_File, False); // копирум файл, чтоб можно было открыть out_File для чтения
LoadStringFromFile(out_File, S); // если попытаться загрузить in_File, то ничего не выйдет, пока в него пишет Arc.exe...
Application.ProcessMessages; // необходима расширенная версия от Restools
if Pos('%', S) > 0 then begin
S1:= Copy(S, Length(S) - 4, (Length(S) - 2) - (Length(S) - 4));
S2:= Copy(S, Length(S) - 4, Length(S) - (Length(S) - 5));
StringChange(S1, ' ', ''); // удаляем пробелы
for i:= 0 to 100 do if S1 = IntToStr(i) then begin
j:= StrToInt(S1);
ProgressBar.Position := j;
StringChange(S2, ' ', '');
ProgressLabel.Caption:= S2;
Application.ProcessMessages; // необходима расширенная версия от Restools
end;
end;
until (Pos('Extracted', S) or Pos('ERROR', S)) > 0;
end;

procedure RunArc(s, patch: string);
var
bat, str: string;
res: Integer;
begin
bat := ExpandConstant('{tmp}\RunArc.bat');
str := '@echo off' + #10#13 +
patch_Arc +
' x ' + s + ' -y -s2 -dp' + // ключи распаковки архива
patch +
' >' + ExpandConstant('"{tmp}\in_log"') + #10#13 +
'del "' + bat + '"';
SaveStringToFile(bat, str, False);
Exec(bat, '', '', SW_HIDE, ewNoWait, res);
end;

procedure UnpackArc(s, patch: string);
begin
WizardForm.CancelButton.Enabled:= False; // отключаем кнопку 'Отмена'
// создаём батник для запуска Arc.exe... незнаю почему, но без батника, не хочет работать Arc.exe ;)
RunArc(s, patch);
WizardForm.StatusLabel.Caption:= 'Распаковка архива ' + ExtractFileName(s) + ', ждите...';
ParserLog; // обрабатываем лог файл
WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
ProgressBar.Position := 100;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep = ssPostInstall then begin
patch_Arc:= ExpandConstant('"{src}\Arc.exe"'); // расположение Arc.exe
UnpackArc(ExpandConstant('"{src}\Project.arc"'), // расположение архива
ExpandConstant('"{app}"')); // место распаковки архива
end;
end;

procedure InitializeWizard;
begin
// второй прогрессбар
ProgressBar := TNewProgressBar.Create(WizardForm);
with ProgressBar do begin
Left := WizardForm.ProgressGauge.Left;
Top := WizardForm.ProgressGauge.Top + ScaleX(30);
Width := WizardForm.ProgressGauge.Width;
Height := WizardForm.ProgressGauge.Height;
Parent := WizardForm.InstallingPage;
Position := 0;
Hide;
end;
// создаём Label для отображения процентов
ProgressLabel := TLabel.Create(WizardForm);
with ProgressLabel do begin
Left := ProgressBar.Left;
Top := ProgressBar.Top + ProgressBar.Height + ScaleX(5);
AutoSize:= True;
Caption:= '0%';
Parent := WizardForm.InstallingPage;
Transparent:= True;
Font.Color:= clDefault;
Hide;
end;
end;

Serega 09-06-2009 00:57 1138805

Krekerpro, удалите секцию [Files], и исправьте процедуру:
читать дальше »
Код:

...................
procedure CurStepChanged(CurStep: TSetupStep);
begin
  If CurStep = ssPostInstall then begin
    patch_Arc:= ExpandConstant('"{pf}\FreeArc\bin\Arc.exe"'); // расположение Arc.exe
    UnpackArc(ExpandConstant('"{sd}\DirectX.arc"'), // расположение архива
      ExpandConstant('"{app}"')); // место распаковки архива
  end;
end;
..................



Цитата:

Цитата Kutsenko Andriy
Заметил такую штуку в инсталах от InstallShield: когда нажимеш на кнопку отмена на любой странице установки и отвечаеш "Да" то появляется вот такая страничка: »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[code]
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:= False;
end;

procedure CancelClick(Sender: TObject);
begin
  WizardForm.Close;
end;

procedure CancelOnClick(Sender: TObject);
begin
  with WizardForm do begin
    NextButton.Hide;
    BackButton.Hide;
    CancelButton.Left:= 250;
    CancelButton.Caption:= 'Готово';
    CancelButton.OnClick:= @CancelClick;
//    FinishedHeadingLabel.Caption:= 'Завершение мастера установки бла-бла';
    FinishedLabel.Caption:= 'Установка прервана... бла-бла...' + #13#13#13 +
                            'Нажмите на кнопку "Готово"';
    FinishedPage.Show;
  end;
end;

procedure InitializeWizard;
begin
  WizardForm.CancelButton.OnClick:= @CancelOnClick;
end;


Krekerpro 09-06-2009 01:19 1138826

Serega,
Спасибо,ошибка пропала,но если я не ошибаюсь,то на другом компьютере установка будет не возможна :(

Serega 09-06-2009 01:31 1138831

Цитата:

Цитата Krekerpro
то на другом компьютере установка будет не возможна »

Скрипт для распаковки внешних архивов, поэтому архив должен лежать рядом с инсталлятором. Это сделано для того, чтоб не копировать большие архивы на диск.

Krekerpro 09-06-2009 01:34 1138833

Serega,
То есть,получается,если производить установку на другой машине,надо архив класть рядом с инсталятором?

DemonAk 09-06-2009 02:51 1138861

Цитата:

Цитата Serega
Здравствуйте, исправил скрипт распаковки FreeArc архивов...
Теперь используются внешние архивы, без копирования в папку приложения. »

Такой вопросик еще, как быть если у меня 2 архива??

lLancer 09-06-2009 10:41 1138991

А как сделать что бы после установки в пуске и на рабочем столе появился ярлык запуска игры?

Berline 09-06-2009 11:03 1139003

Вопрос, может и повторяюсь чей-то, но как-то не нашел...
Каким образом сделать при деинсталле - типа опции - галочку - удалять настройки из реестра или нет?

lLancer
Код:

[Tasks]
Name: desktopicon; Description: Создать ярлык на Рабочем Столе; GroupDescription: {cm:AdditionalIcons}
Name: startmenu; Description: Создать ярлыки в меню Пуск; GroupDescription: {cm:AdditionalIcons}

[Icons]
Name: {userdesktop}\Прога; Filename: {app}\exe.exe; WorkingDir: {app}; Tasks: desktopicon; IconIndex: 0
Name: {group}\Прога; Filename: {app}\exe.exe; WorkingDir: {app}; IconFilename: {app}\exe.exe; Tasks: startmenu; IconIndex: 0


lLancer 09-06-2009 11:27 1139025

А где там указывать путь к EXE файлу? :teeth:

Serega 09-06-2009 17:57 1139311

Цитата:

Цитата Krekerpro
то на другом компьютере установка будет не возможна »

Цитата:

Цитата DemonAk
как быть если у меня 2 архива?? »

Добавил описание к скрипту, этих вопросов.

Цитата:

Цитата Kutsenko Andriy
отвечаеш "Да" то появляется вот такая страничка »

Исправил
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[code]
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:= False;
end;

procedure CancelClick(Sender: TObject);
begin
  WizardForm.Close;
end;

procedure CancelOnClick(Sender: TObject);
begin
  if ExitSetupMsgBox then begin
    with WizardForm do begin
      NextButton.Hide;
      BackButton.Hide;
      CancelButton.Left:= 250;
      CancelButton.Caption:= 'Готово';
      CancelButton.OnClick:= @CancelClick;
    //    FinishedHeadingLabel.Caption:= 'Завершение мастера установки бла-бла';
      FinishedLabel.Caption:= 'Установка прервана... бла-бла...' + #13#13#13 +
                              'Нажмите на кнопку "Готово"';
      FinishedPage.Show;
    end;
  end;
end;

procedure InitializeWizard;
begin
  WizardForm.CancelButton.OnClick:= @CancelOnClick;
end;


Цитата:

Цитата Berline
Каким образом сделать при деинсталле - типа опции - галочку - удалять настройки из реестра или нет? »

Надо создавать новую форму в виде сообщения и на ней рисовать чебокс... Я предлагаю другой вариант:
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Registry]
Root: HKLM; SubKey: SOFTWARE\My Program; Flags: uninsdeletekeyifempty

[code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  res: Integer;
begin
  if CurUninstallStep = usAppMutexCheck then begin
    if msgConfirmUninstall then
      if RegKeyExists(HKLM, 'SOFTWARE\My Program') then
    case MsgBox('Удалить настройки программы из реестра?.'#13#13 +
        '"Да" – полное удаление всех настроек сделанных этой программой в системе.' #13#13 +
        '"Нет" – оставить настройки сделанные этой программой.', mbInformation, MB_YESNO) of
    IDYES:
      begin
      // здесь надо быть аккуратнее, чтоб по ошибке не удалить лишнее, т.к. удаляется ключ со всеми разделами
        if not RegDeleteKeyIncludingSubkeys(HKLM, 'SOFTWARE\My Program') then
        MsgBox('Немогу удалить ключ...', mbError, MB_OK);
      end;
    IDNO:
      begin
      end;
    end;
  end;
end;


Konstantin_555 09-06-2009 18:46 1139347

Подскажите, плиз - как сделать, чтобы программа при деинсталяции спрашивала про необходимость удаления определённого файла? Файл создаётся во время инсталяции и изменяется в течении работы программы (база данных). Спасибо

Serega 09-06-2009 19:20 1139365

Цитата:

Цитата Konstantin_555
как сделать, чтобы программа при деинсталяции спрашивала про необходимость удаления определённого файла? »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  res: Integer;
begin
  if CurUninstallStep = usAppMutexCheck then begin
    if msgConfirmUninstall then
      if FileExists(ExpandConstant('{app}\MyProg.exe')) then
    case MsgBox('Удалить файл MyProg.exe?.'#13#13 +
        '"Да" – удалить MyProg.exe.' #13#13 +
        '"Нет" – оставить MyProg.exe.', mbInformation, MB_YESNO) of
    IDYES:
      begin
        if not DeleteFile(ExpandConstant('{app}\MyProg.exe')) then
        MsgBox('Немогу удалить файл MyProg.exe...', mbError, MB_OK);
      end;
    IDNO:
      begin
      end;
    end;
  end;
end;


Raf-9600 09-06-2009 21:01 1139426

Ктонить может написать скрипт для переименования папки "{app}\YourСountry" на английское название текущего языка интерфейса Windows. Чтоб к примеру если у меня язык винды русский, то папка называлась "{app}\Russian".

Konstantin_555 09-06-2009 21:24 1139439

Цитата:

Цитата Serega
Цитата Konstantin_555:
как сделать, чтобы программа при деинсталяции спрашивала про необходимость удаления определённого файла? »
Пример »

Спасибо! Отдельный файл удалить удалось..

Как быть с несколькими файлами? Например, при установке, я сделал возможность выбора компонентов:
читать дальше »
[Components]
Name: "MainFiles"; Description: "Главные файлы программы"; Types: full compact custom; Flags:fixed
Name: "DBFile"; Description: "Файл базы данных"; Types: full compact
Name: "Templates"; Description: "Шаблоны документов"; Types: full
Name: "OptionFile"; Description: "Файл настроек программы"; Types: full
Name: "ProtocolFile"; Description: "Файл протокола"; Types: full

+В разделе [Files] прописал соответствующие значения.

Как при удалении сделать подобное диалоговое окно? (Т.е. возможность выбора удаляемых компонентов)

Serega 09-06-2009 21:34 1139447

Цитата:

Цитата Raf-9600
для переименования папки "{app}\YourСountry" на английское название текущего языка интерфейса Windows »

Как вы себе это представляете?
Нет, конечно можно оттолкнутся от GetUILanguage, но это придётся в ручную перечислять все языки:
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\{code:YourCountry}
OutputDir=.
Compression=lzma/ultra
SolidCompression=yes

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {code:YourCountry}; Flags: ignoreversion

[code]
function YourCountry(AppID: string): string;
begin
  if GetUILanguage = $0419 then Result:= 'Russian' else
  if GetUILanguage = $0409 then Result:= 'English';
end;



Цитата:

Цитата Konstantin_555
Как при удалении сделать подобное диалоговое окно? (Т.е. возможность выбора удаляемых компонентов) »

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

Raf-9600 09-06-2009 21:53 1139459

Цитата:

Цитата Serega
Как вы себе это представляете? »

Смутно :gigi:
Ну сам Inno видь как-то умеет определять язык винды, и менять в зависимости от этого язык своего интерфейса.
Хотя в принципе, предложенный вам код тоже подходит. Только нужно чтоб он переименовывал уже существующую папку, после инсталляции.

P.S.
А где можно узнать коды языков всех стран?

Krekerpro 09-06-2009 22:05 1139474

Мог бы ктонить реализовать вот этот инсталл в cкрипт?

Raf-9600 09-06-2009 22:12 1139482

Krekerpro, немного иные реализации этих картинок уже есть:

http://s45.radikal.ru/i108/0906/af/141f2f4bf10b.jpg - http://shareua.com/get_file/f96e28/2995221
http://s51.radikal.ru/i134/0906/11/b6339d082574.jpg - сечас поищу.

UPD

Вот он, создал Victor_Dobrov, очистил Serega:
читать дальше »

[code]
var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

var baseDisk, baseDir: string;
Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then if baseDisk = ListBox.Items[n][1] then WizardForm.DirEdit.Text:= baseDir else WizardForm.DirEdit.Text:= ListBox.Items[n][1] +':\'+ ExtractFileName(WizardForm.DirEdit.Text)
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpSelectDir then ListBoxRefresh
End;

Procedure InitializeWizard;
Begin
ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
ListBox.Font.Size:= 9
ListBox.Font.Style:= [fsBold]
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;
baseDir:= WizardForm.DirEdit.Text
baseDisk:= WizardForm.DirEdit.Text[1]
End;

Serega 09-06-2009 22:21 1139493

Цитата:

Цитата Raf-9600
А где можно узнать коды языков всех стран? »

Всех не знаю, но посмотрите файлы в каталоге Inno Setup в папке Languages есть языковые файлы, параметр LanguageID

Цитата:

Цитата Krekerpro
Мог бы ктонить реализовать вот этот инсталл в cкрипт? »

Посмотрите, этот скрипт

Raf-9600 09-06-2009 22:52 1139535

Цитата:

Цитата Serega
Всех не знаю, но посмотрите файлы в каталоге Inno Setup в папке Languages есть языковые файлы, параметр LanguageID »

Пасибо, все необходимые языки нашел.

Немного обмозговал над вашим предыдущим скриптом, в принципе он и в таком виде подходит, но только если скажите что нужно прописать, чтоб распаковать один и тот же файл, в две разные папки. К примеру и в "DestDir: {code:YourCountry}" и в "DestDir: UKEnglsh".

Serega 09-06-2009 23:03 1139543

Цитата:

Цитата Raf-9600
один и тот же файл, в две разные папки »

Его просто два раза нужно прописать в секции [Files]:
Код:

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {code:YourCountry}; Flags: ignoreversion
Source: compiler:Examples\MyProg.exe; DestDir: UKEnglsh; Flags: ignoreversion


Krekerpro 09-06-2009 23:05 1139544

Есть у кого нибудь get_hw_caps.dll?
При попытки скомпилировать выдаёт следующие http://clip2net.com/clip/m0/1244574459-clip-30kb.png ,я так пологая что надо что то дописать?

Konstantin_555 09-06-2009 23:12 1139554

Цитата:

Цитата Serega
Цитата Konstantin_555:
Как при удалении сделать подобное диалоговое окно? (Т.е. возможность выбора удаляемых компонентов) »
Если необходим выбор удаляемых компонентов, то придётся рисовать новую форму, а уже в ней указывать компоненты. Просто насколько знаю, в сообщении нельзя нарисовать чебоксы... »

Где в Inno Setup рисуется новая форма, можешь подсказать?

Serega 09-06-2009 23:17 1139562

Цитата:

Цитата Krekerpro
При попытки скомпилировать выдаёт »

В самом начале скрипта, запишите:
#define TIME_FOR_VIEW 5

Цитата:

Цитата Konstantin_555
Где в Inno Setup рисуется новая форма »

В секции кода... :) Я просто не знаю, как можно объяснить, так сказать, на пальцах...

Raf-9600 09-06-2009 23:23 1139571

Цитата:

Цитата Krekerpro
Есть у кого нибудь get_hw_caps.dll? »

http://narod.ru/disk/9309585000/dll.rar.html

Krekerpro 09-06-2009 23:24 1139572

Serega,
Опять ему чтот не нравится http://clip2net.com/clip/m0/1244575423-clip-34kb.png :(

Konstantin_555 09-06-2009 23:37 1139580

Цитата:

Цитата Serega
Цитата Konstantin_555:Где в Inno Setup рисуется новая форма »
В секции кода... Я просто не знаю, как можно объяснить, так сказать, на пальцах... »

А есть где-то ссылка на подробное описание создания форм? Не найду в гугле..

Serega 09-06-2009 23:55 1139593

Цитата:

Цитата Krekerpro
Опять ему чтот не нравится »

Ух, какой он у вас привередливый... :)
Попробуйте закомментировать эту строку, должно помочь.

Цитата:

Цитата Konstantin_555
А есть где-то ссылка на подробное описание создания форм? »

Подробное описание вы не найдёте. Есть коротко написаное описание, в Справке к Inno. Есть пример, в папке Examples, название скрипта не помню. Вот, как-то делал форму авторан:
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Files]
Source: AutoRun.bmp; Flags: dontcopy

[code]
var
  AutoRun: TSetupForm;
  img1: TBitmapImage;
  btn, btn1: TButton;
  btn2: TButton;
  btn3: TButton;
  btn4: TButton;
  btn5: TButton;
  btn6: TButton;
  btn7: TButton;
  btn8: TButton;
  i, t: integer;

procedure btn7Click(Sender: TObject);
begin
  btn7.Height:= 21;
  btn7.Width:= 21;
  btn7.Top:= 325;
  btn7.Font.Style := [fsBold];
  btn8.Height:= 23;
  btn8.Width:= 23;
  btn8.Top:= 324;
  btn8.Font.Style := [];
end;

procedure btn8Click(Sender: TObject);
begin
  btn7.Height:= 23;
  btn7.Width:= 23;
  btn7.Top:= 324;
  btn7.Font.Style := [];
  btn8.Height:= 21;
  btn8.Width:= 21;
  btn8.Top:= 325;
  btn8.Font.Style := [fsBold];
end;


procedure CreateAutoRun;
begin
  //AutoRun
  AutoRun := CreateCustomForm;
  with AutoRun do begin
    Left := 498;
    Top := 75;
    Width := 586;
    Height := 386;
    BorderIcons := [];
    Color := clBtnFace;
    Font.Color := clWindowText;
    Font.Height := -11;
    Font.Name := 'MS Sans Serif';
    Font.Style := [];
    Position := poScreenCenter;
  end;
  //img1
  img1 := TBitmapImage.Create(AutoRun);
  ExtractTemporaryFile('AutoRun.bmp');
  with img1 do begin
    Parent := AutoRun;
    Left := 10;
    Top := 10;
    Width := 220;
    Height := 335;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\AutoRun.bmp'));
  end;
  //btn1
  btn1:= TButton.Create(AutoRun);
  with btn1 do begin
    Parent := AutoRun;
    Left := 248;
    Top := 15;
    Width := 313;
    Height := 22;
    Caption:= 'Начать игру';
    Cursor:= crHand;
  end;
  //btn2
  btn2:= TButton.Create(AutoRun);
  with btn2 do begin
    Parent:= AutoRun;
    Left := 248;
    Top := 75;
    Width := 313;
    Height := 22;
    Caption:= 'Установка';
    Cursor:= crHand;
  end;
  //btn3
  btn3:= TButton.Create(AutoRun);
  with btn3 do begin
    Parent:= AutoRun;
    Left := 248;
    Top := 135;
    Width := 313;
    Height := 22;
    Caption:= 'Техническая поддержка';
    Cursor:= crHand;
  end;
  //btn4
  btn4:= TButton.Create(AutoRun);
  with btn4 do begin
    Parent:= AutoRun;
    Left := 248;
    Top := 195;
    Width := 313;
    Height := 22;
    Caption:= 'Readme';
    Cursor:= crHand;
  end;
  //btn5
  btn5:= TButton.Create(AutoRun);
  with btn5 do begin
    Parent:= AutoRun;
    Left := 248;
    Top := 255;
    Width := 313;
    Height := 22;
    Caption:= 'Веб-сайт';
    Cursor:= crHand;
  end;
  //btn6
  btn6:= TButton.Create(AutoRun);
  with btn6 do begin
    Parent:= AutoRun;
    Left := 248;
    Top := 315;
    Width := 313;
    Height := 22;
    Caption:= 'Выход';
    Cursor:= crHand;
    ModalResult:= mrCancel;
  end;
  //btn7
  btn7:= TButton.Create(AutoRun);
  with btn7 do begin
    Parent := AutoRun;
    Left := 8;
    Top := 324;
    Width := 23;
    Height := 23;
    Cursor := crHand;
    Caption := 'EN';
    Font.Color := clWindowText;
    Font.Height := -5;
    Font.Name := 'MS Sans Serif';
    Font.Style := [];
    ParentFont := False;
    TabOrder := 6;
    OnClick := @btn7Click;
  end;
  //btn8
  btn8:= TButton.Create(AutoRun);
  with btn8 do begin
    Parent := AutoRun;
    Left := 31;
    Top := 325;
    Width := 21;
    Height := 21;
    Cursor := crHand;
    Caption := 'RU';
    Font.Color := clWindowText;
    Font.Height := -5;
    Font.Name := 'MS Sans Serif';
    Font.Style := [fsBold];
    ParentFont := False;
    TabOrder := 6;
    OnClick := @btn8Click;
  end;
  AutoRun.ShowModal;
end;

procedure InitializeWizard;
begin
  CreateAutoRun;
end;


Krekerpro 10-06-2009 00:08 1139608

Цитата:

Цитата Serega
Попробуйте закомментировать эту строку, должно помочь.

Эм,эт как? :blush2:

Serega 10-06-2009 00:15 1139618

Krekerpro, покажите свой код. Ошибка говорит о том, что неизвестная переменная, а она должна задаваться в скрипте.

Krekerpro 10-06-2009 00:33 1139630

Serega,
читать дальше »
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl



[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: compiler:get_hw_caps.dll; DestDir: {tmp}; Flags: dontcopy
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: C:\Program Files\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion
Source: D:\Program Files\Yamicsoft\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Documents and Settings\Admin\Мои документы\Мои рисунки\Безымянный3.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: C:\Documents and Settings\Admin\Мои документы\Мои рисунки\Безымянный.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak


; NOTE: Don't use "Flags: ignoreversion" on any shared system files


[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe; Tasks: desktopicon

[Run]
Filename: {app}\MyProg.exe; Description: {cm:LaunchProgram,My Program}; Flags: nowait postinstall skipifsilent

[_Code]
var
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
case currTime of
{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Безымянный3.bmp')) end;
2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Безымянный.bmp')) end;

end;
if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;


procedure InitializeWizard;
begin
ExtractTemporaryFile('Безымянный3.bmp');
ExtractTemporaryFile('Безымянный.bmp');


currTime := 0;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
WizardForm.ProgressGauge.Height := 16;
WizardForm.ProgressGauge.Hide;

WizardForm.FileNameLabel.Parent := WizardForm;
WizardForm.FileNameLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
WizardForm.FileNameLabel.Left := ScaleX(10);
WizardForm.FileNameLabel.Width := ScaleX(397);
WizardForm.FileNameLabel.Hide;

SplashImage := TBitmapImage.Create(WizardForm);
SplashImage.Top := 0;
SplashImage.Left := 0;
SplashImage.Width := WizardForm.MainPanel.Width;
SplashImage.Height := WizardForm.Bevel.Top;
SplashImage.Parent := WizardForm.InnerPage;
SplashImage.Stretch := True;
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
SplashImage.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 5);
TimerID := SetTimer(0, 0, 1000, pfunc);
WizardForm.PageNameLabel.Visible:=false
WizardForm.PageDescriptionLabel.Visible:=false
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.ProgressGauge.Show;
WizardForm.FileNameLabel.Show;
SplashImage.Show;
WizardForm.CancelButton.Enabled :=True
WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(2)
end
else
begin
WizardForm.ProgressGauge.Hide;
SplashImage.Hide;
WizardForm.FileNameLabel.Hide;
if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
end
If CurPageID=wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
KillTimer(0, TimerID);
end;

Serega 10-06-2009 00:48 1139642

Krekerpro, у меня с вашего примера, компилируется нормально.

Krekerpro 10-06-2009 00:54 1139646

Serega,
А чем компилируете?

Serega 10-06-2009 00:59 1139648

Krekerpro, у меня расширенная версия от Restools, но это не влияет на ваш скрипт. У вас ошибка, что неизвестный индетификатор, а он у вас задан в скрипте currTime: Integer;

P.S.
А вы исправили название секции с [_Code] на [code]?

Krekerpro 10-06-2009 01:32 1139674

Serega,
Да,исправил

Serega 10-06-2009 12:49 1139989

Krekerpro, тогда действительно, попробуйте закоментировать, пример:
// currTime := 0;

Krekerpro 10-06-2009 13:18 1140020

Serega,
Спасибо огромное,всё отлично работает :)

Krekerpro 10-06-2009 14:19 1140072

Соедините кто нибудь пожалуйста
читать дальше »
Код:

[_code] var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;  const oneMB= 1024*1024; function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall'; function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall'; function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall'; function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';  Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)} Begin if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб' StringChange(Result, ',', '.') End;  Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов } Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;  Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов} Begin if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength) else Result:= String; End;  Procedure GetDiskInfo(Disk: String); Begin FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256); GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31); FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки'; End;  Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin ListBox.Items.Clear for n:= 1 to 31 do // диск 'А' пропустить if (GetLogicalDrives and (1 shl n)) > 0 then if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':'); for n:= 0 to ListBox.Items.Count -1 do begin Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление } if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path); if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10); if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String; ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end; End;  var baseDisk, baseDir: string; Procedure ObjectOnClick(Sender: TObject); Begin Case TObject(Sender) of ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then if baseDisk = ListBox.Items[n][1] then WizardForm.DirEdit.Text:= baseDir else WizardForm.DirEdit.Text:= ListBox.Items[n][1] +':\'+ ExtractFileName(WizardForm.DirEdit.Text) StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}' WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end; end; End;  Procedure CurPageChanged(CurPageID: Integer); Begin if CurPageID = wpSelectDir then ListBoxRefresh End;  Procedure InitializeWizard; Begin ListBox:= TListBox.Create(WizardForm) ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12)) ListBox.Font.Size:= 9 ListBox.Font.Style:= [fsBold] ListBox.Font.Name:= 'Courier New'; ListBox.OnClick:= @ObjectOnClick; ListBox.Parent:= WizardForm.SelectDirPage; baseDir:= WizardForm.DirEdit.Text baseDisk:= WizardForm.DirEdit.Text[1] End;

И
читать дальше »
Код:

[_Code] var  TimerID: LongWord;  currTime: Integer;  SplashImage: TBitmapImage; type  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);  function WrapTimerProc(callback:TProc; paramcount:integer):longword;  external 'wrapcallback@files:InnoCallback.dll stdcall';  function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;  external 'SetTimer@user32.dll stdcall';  function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;  external 'KillTimer@user32.dll stdcall';  procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord); begin    currTime := currTime + 1;    case currTime of    {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;    2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;    3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;    4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;    5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;    6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;    7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;    8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;    9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;    end;    if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1; end;  procedure InitializeWizard; begin  ExtractTemporaryFile('Image_1.bmp');  ExtractTemporaryFile('Image_2.bmp');  ExtractTemporaryFile('Image_3.bmp');  ExtractTemporaryFile('Image_4.bmp');  ExtractTemporaryFile('Image_5.bmp');  ExtractTemporaryFile('Image_6.bmp');  ExtractTemporaryFile('Image_7.bmp');  ExtractTemporaryFile('Image_8.bmp');  ExtractTemporaryFile('Image_9.bmp');  ExtractTemporaryFile('Image_10.bmp');    currTime := 0;    WizardForm.ProgressGauge.Parent := WizardForm;  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);  WizardForm.ProgressGauge.Left := ScaleX(10);  WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);  WizardForm.ProgressGauge.Height := 16;  WizardForm.ProgressGauge.Hide;      WizardForm.FileNameLabel.Parent := WizardForm;  WizardForm.FileNameLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);  WizardForm.FileNameLabel.Left := ScaleX(10);  WizardForm.FileNameLabel.Width := ScaleX(397);  WizardForm.FileNameLabel.Hide;      SplashImage := TBitmapImage.Create(WizardForm);  SplashImage.Top := 0;  SplashImage.Left := 0;  SplashImage.Width := WizardForm.MainPanel.Width;  SplashImage.Height := WizardForm.Bevel.Top;  SplashImage.Parent := WizardForm.InnerPage;  SplashImage.Stretch := True;  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));  SplashImage.Hide; end;  procedure CurPageChanged(CurPageID: Integer); var    pfunc: LongWord; begin if (CurPageID = wpInstalling) then      begin      pfunc := WrapTimerProc(@OnTimer, 5);      TimerID := SetTimer(0, 0, 1000, pfunc);      WizardForm.PageNameLabel.Visible:=false      WizardForm.PageDescriptionLabel.Visible:=false      WizardForm.InnerNotebook.Hide;      WizardForm.Bevel1.Hide;      WizardForm.MainPanel.Hide;      WizardForm.PageNameLabel.Hide;      WizardForm.PageDescriptionLabel.Hide;      WizardForm.ProgressGauge.Show;      WizardForm.FileNameLabel.Show;      SplashImage.Show;      WizardForm.CancelButton.Enabled :=True      WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100)      end  else    begin    WizardForm.ProgressGauge.Hide;    SplashImage.Hide;    WizardForm.FileNameLabel.Hide;    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then      begin      WizardForm.InnerNotebook.Show;      WizardForm.Bevel1.Show;      WizardForm.MainPanel.Show;      WizardForm.PageNameLabel.Show;      WizardForm.PageDescriptionLabel.Show;      end      If CurPageID=wpFinished then end; end;  procedure DeInitializeSetup(); begin  KillTimer(0, TimerID); end;

Serega 10-06-2009 20:15 1140380

Цитата:

Цитата Krekerpro
Соедините кто нибудь пожалуйста »

Вы хоть сами то разберёте, что там написано? Используйте теги [more][code][/code][/more].

Serega 11-06-2009 00:03 1140564

Цитата:

Цитата Krekerpro
Соедините кто нибудь пожалуйста »

Ну такого, я ещё ни разу не видел, что весь код в одну строку...
Подробнее
Код:

type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  n: Integer;
  FreeMB, TotalMB: Cardinal;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;
  baseDisk, baseDir: string;

  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

const
  oneMB = 1024*1024;

function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint;
  external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
  external 'MessageBoxA@user32.dll stdcall';

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
    case currTime of
      {#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp'))
        end;
      2*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp'))
        end;
      3*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp'))
        end;
      4*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp'))
        end;
      5*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp'))
        end;
      6*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp'))
        end;
      7*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp'))
        end;
      8*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp'))
        end;
      9*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))
        end;
    end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
{ Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
  if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
  if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
  if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
  If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
  If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
  Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб' StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String;
{ Удаление начальных, конечных и повторных пробелов }
Begin
  while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
  Result:= Trim(String);
End;

Function CutString(String: String; MaxLength: Longint): String;
{ Обрезать строку до заданного кол-ва символов}
Begin
  if Length(String) > MaxLength then
  Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength) else
  Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
  FileSystemName:= StringOfChar(' ', 32);
  VolumeName:= StringOfChar(' ', 256);
  GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
  FileSystemName:= DelSp(FileSystemName);
  VolumeName:= DelSp(VolumeName);
  if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh;
var
  FreeB, TotalB: Cardinal;
  Path, String: string;
Begin
  ListBox.Items.Clear
  for n:= 1 to 31 do // диск 'А' пропустить
  if (GetLogicalDrives and (1 shl n)) > 0 then
  if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
  if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then
  ListBox.Items.Add(Chr(ord('A') + n) +':');
  for n:= 0 to ListBox.Items.Count -1 do
  begin
    Path:= Copy(ListBox.Items[n],1,2) +'\'
    { если в накопителе нет диска, пропустить обновление }
    if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then
    begin
      GetDiskInfo(Path);
      if FreeB >= $7FFFFFFF then
      String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else
      String:= PadL(ByteOrTB(FreeB, true),10);
      if TotalB >= $7FFFFFFF then
      begin
        TotalB:= TotalMB;
        FreeB:= FreeMB;
        String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String
      end else
      String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String; ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9);
    end;
  end;
End;

Procedure ObjectOnClick(Sender: TObject);
Begin
  Case TObject(Sender) of
  ListBox:
    for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then
    if baseDisk = ListBox.Items[n][1] then
      WizardForm.DirEdit.Text:= baseDir else
    WizardForm.DirEdit.Text:= ListBox.Items[n][1] +':\'+ ExtractFileName(WizardForm.DirEdit.Text)
  StartMenuTreeView:
    if StartMenuTreeView.Directory <> '' then
    WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else
    WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
  WizardForm.NoIconsCheck:
    begin
      WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled);
      StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled;
      WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled
      end;
    end;
End;

/////////////////////////////////////////////////////////////////////////
procedure InitializeWizard;
begin
  ExtractTemporaryFile('Image_1.bmp');
  ExtractTemporaryFile('Image_2.bmp');
  ExtractTemporaryFile('Image_3.bmp');
  ExtractTemporaryFile('Image_4.bmp');
  ExtractTemporaryFile('Image_5.bmp');
  ExtractTemporaryFile('Image_6.bmp');
  ExtractTemporaryFile('Image_7.bmp');
  ExtractTemporaryFile('Image_8.bmp');
  ExtractTemporaryFile('Image_9.bmp');
  ExtractTemporaryFile('Image_10.bmp');

  currTime := 0;

  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
  WizardForm.ProgressGauge.Left := ScaleX(10);
  WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
  WizardForm.ProgressGauge.Height := 16;
  WizardForm.ProgressGauge.Hide;
  WizardForm.FileNameLabel.Parent := WizardForm;
  WizardForm.FileNameLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
  WizardForm.FileNameLabel.Left := ScaleX(10);
  WizardForm.FileNameLabel.Width := ScaleX(397);
  WizardForm.FileNameLabel.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
  SplashImage.Hide;

  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
  ListBox.Font.Size:= 9
  ListBox.Font.Style:= [fsBold]
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;
  baseDir:= WizardForm.DirEdit.Text
  baseDisk:= WizardForm.DirEdit.Text[1]
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
  if CurPageID = wpSelectDir then ListBoxRefresh
  if CurPageID = wpInstalling then
  begin
    pfunc := WrapTimerProc(@OnTimer, 5);
    TimerID := SetTimer(0, 0, 1000, pfunc);
    WizardForm.PageNameLabel.Visible:=false
    WizardForm.PageDescriptionLabel.Visible:=false
    WizardForm.InnerNotebook.Hide;
    WizardForm.Bevel1.Hide;
    WizardForm.MainPanel.Hide;
    WizardForm.PageNameLabel.Hide;
    WizardForm.PageDescriptionLabel.Hide;
    WizardForm.ProgressGauge.Show;
    WizardForm.FileNameLabel.Show;
    SplashImage.Show;
    WizardForm.CancelButton.Enabled :=True
    WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100)
  end else
  begin
    WizardForm.ProgressGauge.Hide;
    SplashImage.Hide;
    WizardForm.FileNameLabel.Hide;
    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end
    If CurPageID=wpFinished then
  end;
end;

procedure DeInitializeSetup();
begin
  KillTimer(0, TimerID);
end;


Krekerpro 11-06-2009 14:53 1140998

Ещё хотелось бы узнать как это реализовать http://clip2net.com/clip/m19309/1244...-clip-32kb.png
И вот это http://clip2net.com/clip/m19309/1244...-clip-22kb.png ,как я понимаю здесь используется фри арк,в процессах винды для установки используется unpack.dll

Serega 11-06-2009 15:51 1141040

Цитата:

Цитата Krekerpro
Ещё хотелось бы узнать как это реализовать http://clip2net.com/clip/m19309/1244...-clip-32kb.png »

Это обычная страница дополнительных задач:
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Tasks]
Name: a; Description: Описание для a; GroupDescription: Группа abc
Name: b; Description:  Описание для b; GroupDescription: Группа abc; Flags: unchecked
Name: c; Description: Описание для c; GroupDescription: Группа abc; Flags: unchecked
Name: d; Description: Описание для d; GroupDescription: Группа de; Flags: exclusive
Name: e; Description: Описание для e; GroupDescription: Группа de; Flags: exclusive unchecked



Цитата:

Цитата Krekerpro
И вот это http://clip2net.com/clip/m19309/1244...-clip-22kb.png ,как я понимаю здесь используется фри арк,в процессах винды для установки используется unpack.dll »

Ничего сказать не могу, не встречал такой dll'ки...

BlackSelf 11-06-2009 16:12 1141060

Вроде вот dll-ка (можете переименовать на unpack.dll, если очень надо) - http://narod.ru/disk/9755536000/arc.dll.html
А вот скрипт:
читать дальше »
Код:

[Setup]
AppName=xx
AppVerName=xxx
DefaultDirName={pf}\xx
[Files]
Source: arc.dll; Flags: dontcopy
Source: Arc.exe; Flags: dontcopy
[сode]
procedure InitPBarz(wizpbhwnd,pbhwnd:THandle; pbLengt:integer);
external 'InitPBarz@files:arc.dll stdcall';

procedure StartArcExtract(freearc,params:pchar; var ReturnCode:integer);
external 'StartArcExtract@files:arc.dll stdcall';

procedure CancelExtract;
external 'CancelExtract@files:arc.dll stdcall';

procedure RepeatExtract;
external 'RepeatExtract@files:arc.dll stdcall';

procedure SuspendExtract;
external 'SuspendExtract@files:arc.dll stdcall';

procedure ResumeExtract;
external 'ResumeExtract@files:arc.dll stdcall';

procedure UpdateWizGauge;
external 'UpdateWizGauge@files:arc.dll stdcall';

procedure SkipError;
external 'SkipError@files:arc.dll stdcall';

function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';

const
MB_ICONQUESTION = $20;

var
SecondProgressBar: TNewProgressBar;

procedure InitializeWizard();
begin
SecondProgressBar := TNewProgressBar.Create(WizardForm);
with SecondProgressBar do
begin
  Parent := wizardform.InstallingPage;
  Left := ScaleX(wizardform.progressgauge.left);
  Top := ScaleY(wizardform.progressgauge.top);
  Width := ScaleX(wizardform.progressgauge.Width);
  Height := ScaleY(wizardform.progressgauge.Height);
end;
end;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
if curpage=wpInstalling then begin

Cancel:=False;
Confirm:=False;

SuspendExtract;

case MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), setupmessage(msgExitSetupMessage), setupmessage(msgExitSetupTitle), MB_YESNO or MB_defbutton2 or MB_ICONQUESTION) of

idyes: begin CancelExtract Cancel:=true end;

idno: ResumeExtract;
end
end
end;

procedure CurStepChanged(CurStep: TSetupStep);
var returnCode:integer;
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
ExtractTemporaryFile('arc.exe');
InitPBarz(wizardform.progressgauge.handle,secondprogressbar.Handle,200) //Последнее значение задается в зависимости от кол-ва архивов + 100. То есть - если их 3, то пишем 400, если 1, то 200.

StartArcExtract(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(AddBackslash(ExpandConstant('{src}'))+'data-a.bin')+' -y -dp'+AddQuotes(ExpandConstant('{app}')), ReturnCode)

UpdateWizGauge;

end;
end;


Serega 11-06-2009 16:34 1141071

Цитата:

Цитата BlackSelf
Вроде вот dll-ка »

а откуда такая роскошь? и тем более со скриптом, кто сделал?

BlackSelf 11-06-2009 16:40 1141076

Serega, этот скрипт и dll-ка достались мне от Z10y_ded. Но там ничего особенного. Ваш вариант меня больше устраивает.
Кстати, по поводу страницы выбора задач (http://clip2net.com/clip/m19309/1244...-clip-32kb.png). В зависимости какой выбран язык добавляется только запись в реестре.

Serega 11-06-2009 16:48 1141081

Цитата:

Цитата BlackSelf
этот скрипт и dll-ка достались мне от Z10y_ded »

Я столько раз слышал про него... кто это такой? :)

Цитата:

Цитата BlackSelf
Кстати, по поводу страницы выбора задач (http://clip2net.com/clip/m19309/1244...-clip-32kb.png). В зависимости какой выбран язык добавляется только запись в реестре. »

Был вопрос, как это сделать, я и показал пример.

P.S.
Если я бы знал раньше, что такая dll'ка есть, я бы... зачем, как говорят, изобретать велосипед... :)

А исходник, этой dll'ки, вам чисто случайно, не достался по наследству? :) Просто интересно, как он реализовал апдейт прогрессбара...

BlackSelf 11-06-2009 17:03 1141091

z10y_ded - репакер (перепаковка игры с целью уменьшения размера установочных файлов. Главная задача, на мой взгляд, - уместить игру на DVD5). Библиотека появилась примерно тогда, когда вы сделали первый вариант распаковки freearc-архивов. Если будет время, посмотрите на библиотеку, может сможете связать её со своим кодом. Минус этой библиотеки - нет считывания с лога и отображения правильной информации.

Krekerpro 12-06-2009 02:15 1141419

Что то не хочет у меня работать скрипт от z10y_ded',нет ни прогресс-бара ни распаковки архива.
Вот скрипт:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=D:\123
Compression=lzma/ultra
SolidCompression=yes
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]
Source: D:\*******\arc.dll; Flags: dontcopy
Source: C:\Program Files\FreeArc\bin\Arc.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\DirectX.arc; DestDir: {app};  Flags:  ignoreversion skipifsourcedoesntexist



[UninstallDelete]
Name: {app}; Type: filesandordirs

[_Code]
procedure InitPBarz(wizpbhwnd,pbhwnd:THandle; pbLengt:integer);
external 'InitPBarz@files:arc.dll stdcall';

procedure StartArcExtract(freearc,params:pchar; var ReturnCode:integer);
external 'StartArcExtract@files:arc.dll stdcall';

procedure CancelExtract;
external 'CancelExtract@files:arc.dll stdcall';

procedure RepeatExtract;
external 'RepeatExtract@files:arc.dll stdcall';

procedure SuspendExtract;
external 'SuspendExtract@files:arc.dll stdcall';

procedure ResumeExtract;
external 'ResumeExtract@files:arc.dll stdcall';

procedure UpdateWizGauge;
external 'UpdateWizGauge@files:arc.dll stdcall';

procedure SkipError;
external 'SkipError@files:arc.dll stdcall';

function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';

const
MB_ICONQUESTION = $20;

var
SecondProgressBar: TNewProgressBar;

procedure InitializeWizard();
begin
SecondProgressBar := TNewProgressBar.Create(WizardForm);
with SecondProgressBar do
begin
  Parent := wizardform.InstallingPage;
  Left := ScaleX(wizardform.progressgauge.left);
  Top := ScaleY(wizardform.progressgauge.top);
  Width := ScaleX(wizardform.progressgauge.Width);
  Height := ScaleY(wizardform.progressgauge.Height);
end;
end;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
if curpage=wpInstalling then begin

Cancel:=False;
Confirm:=False;

SuspendExtract;

case MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), setupmessage(msgExitSetupMessage), setupmessage(msgExitSetupTitle), MB_YESNO or MB_defbutton2 or MB_ICONQUESTION) of

idyes: begin CancelExtract Cancel:=true end;

idno: ResumeExtract;
end
end
end;

procedure CurStepChanged(CurStep: TSetupStep);
var returnCode:integer;
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
ExtractTemporaryFile('arc.exe');
InitPBarz(wizardform.progressgauge.handle,secondprogressbar.Handle,200) //Последнее значение задается в зависимости от кол-ва архивов + 100. То есть - если их 3, то пишем 400, если 1, то 200.

StartArcExtract(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(AddBackslash(ExpandConstant('{src}'))+'data-a.bin')+' -y -dp'+AddQuotes(ExpandConstant('{app}')), ReturnCode)

UpdateWizGauge;

end;
end;


BlackSelf 12-06-2009 02:22 1141421

Krekerpro, посмотри на скрипт, кот. я давал, внимательно. Не надо ничего в app копировать. data-a.bin - это архив, кот. надо распаковать.

Krekerpro 12-06-2009 02:35 1141424

BlackSelf,
Пожалуйста поточней :)

BlackSelf 12-06-2009 02:39 1141425

Возьми мой скрипт. Поменяй только пути к библиотеке и arc.exe. Рядом с инсталлом положи свой архив DirectX.arc и замени в скрипте data-a.bin на DirectX.arc

Krekerpro 12-06-2009 02:50 1141428

BlackSelf,
Спасибо,вот теперь заработало,вот только,второго прогресс-бара нету

BlackSelf 12-06-2009 03:06 1141430

Вот со вторым прогресс-баром. Размеры и расположение отрегулируйте сами (я сделал примерно как на скрине).
читать дальше »
Код:

[Setup]
AppName=xx
AppVerName=xxx
DefaultDirName={pf}\xx
[Files]
Source: arc.dll; Flags: dontcopy
Source: Arc.exe; Flags: dontcopy
[сode]
procedure InitPBarz(wizpbhwnd,pbhwnd:THandle; pbLengt:integer);
external 'InitPBarz@files:arc.dll stdcall';

procedure StartArcExtract(freearc,params:pchar; var ReturnCode:integer);
external 'StartArcExtract@files:arc.dll stdcall';

procedure CancelExtract;
external 'CancelExtract@files:arc.dll stdcall';

procedure RepeatExtract;
external 'RepeatExtract@files:arc.dll stdcall';

procedure SuspendExtract;
external 'SuspendExtract@files:arc.dll stdcall';

procedure ResumeExtract;
external 'ResumeExtract@files:arc.dll stdcall';

procedure UpdateWizGauge;
external 'UpdateWizGauge@files:arc.dll stdcall';

procedure SkipError;
external 'SkipError@files:arc.dll stdcall';

function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';

const
MB_ICONQUESTION = $20;

var
SecondProgressBar: TNewProgressBar;

procedure InitializeWizard();
begin
SecondProgressBar := TNewProgressBar.Create(WizardForm);
with SecondProgressBar do
begin
  Parent := wizardform.installingpage;
  Top := 100
  Width := 150;
  Height := wizardform.progressgauge.height;
end;
  WizardForm.ProgressGauge.Top:=ScaleY(100); 
  WizardForm.ProgressGauge.Width:=262;       
  WizardForm.ProgressGauge.Left:=155;         
  WizardForm.StatusLabel.Top:=ScaleY(80);
end;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
if curpage=wpInstalling then begin

Cancel:=False;
Confirm:=False;

SuspendExtract;

case MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), setupmessage(msgExitSetupMessage), setupmessage(msgExitSetupTitle), MB_YESNO or MB_defbutton2 or MB_ICONQUESTION) of

idyes: begin CancelExtract Cancel:=true end;

idno: ResumeExtract;
end
end
end;

procedure CurStepChanged(CurStep: TSetupStep);
var returnCode:integer;
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
ExtractTemporaryFile('arc.exe');
InitPBarz(wizardform.progressgauge.handle,secondprogressbar.Handle,200)
StartArcExtract(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(AddBackslash(ExpandConstant('{src}'))+'data-a.bin')+' -y -dp'+AddQuotes(ExpandConstant('{app}')), ReturnCode)

UpdateWizGauge;

end;
end;


Krekerpro 12-06-2009 03:09 1141431

BlackSelf,
Огромное спасибо,всё отлично работает :)

Krekerpro 13-06-2009 22:35 1142603

У меня вопрос:возможно ли соединить это
читать дальше »
Код:

[_Code]
var
MouseLabel,SiteLabel: TLabel;

procedure SiteLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExec('open', 'http://*******', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode)
end;

procedure SiteLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clRed
end;

procedure SiteLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clBlue
end;

procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clGreen
end;

procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clRed
end;

procedure InitializeWizard();
begin
MouseLabel:=TLabel.Create(WizardForm)
MouseLabel.Width:=WizardForm.Width
MouseLabel.Height:=WizardForm.Height
MouseLabel.Autosize:=False
MouseLabel.Transparent:=True
MouseLabel.OnMouseMove:=@SiteLabelMouseMove2
MouseLabel.Parent:=WizardForm

SiteLabel:=TLabel.Create(WizardForm)
SiteLabel.Left:=10
SiteLabel.Top:=330
SiteLabel.Cursor:=crHand
SiteLabel.Font.Color:=clRed
SiteLabel.Caption:='Pirat.ca'
SiteLabel.OnClick:=@SiteLabelOnClick
SiteLabel.OnMouseDown:=@SiteLabelMouseDown
SiteLabel.OnMouseUp:=@SiteLabelMouseUp
SiteLabel.OnMouseMove:=@SiteLabelMouseMove
SiteLabel.Parent:=WizardForm
end;


это
читать дальше »
Код:

[_сode]
procedure InitPBarz(wizpbhwnd,pbhwnd:THandle; pbLengt:integer);
external 'InitPBarz@files:arc.dll stdcall';

procedure StartArcExtract(freearc,params:pchar; var ReturnCode:integer);
external 'StartArcExtract@files:arc.dll stdcall';

procedure CancelExtract;
external 'CancelExtract@files:arc.dll stdcall';

procedure RepeatExtract;
external 'RepeatExtract@files:arc.dll stdcall';

procedure SuspendExtract;
external 'SuspendExtract@files:arc.dll stdcall';

procedure ResumeExtract;
external 'ResumeExtract@files:arc.dll stdcall';

procedure UpdateWizGauge;
external 'UpdateWizGauge@files:arc.dll stdcall';

procedure SkipError;
external 'SkipError@files:arc.dll stdcall';

function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';

const
MB_ICONQUESTION = $20;

var
SecondProgressBar: TNewProgressBar;

procedure InitializeWizard();
begin
SecondProgressBar := TNewProgressBar.Create(WizardForm);
with SecondProgressBar do
begin
  Parent := wizardform.InstallingPage;
  Left := ScaleX(wizardform.progressgauge.left);
  Top := ScaleY(wizardform.progressgauge.top);
  Width := ScaleX(wizardform.progressgauge.Width);
  Height := ScaleY(wizardform.progressgauge.Height);
end;
end;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
if curpage=wpInstalling then begin

Cancel:=False;
Confirm:=False;

SuspendExtract;

case MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), setupmessage(msgExitSetupMessage), setupmessage(msgExitSetupTitle), MB_YESNO or MB_defbutton2 or MB_ICONQUESTION) of

idyes: begin CancelExtract Cancel:=true end;

idno: ResumeExtract;
end
end
end;

procedure CurStepChanged(CurStep: TSetupStep);
var returnCode:integer;
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
ExtractTemporaryFile('arc.exe');
InitPBarz(wizardform.progressgauge.handle,secondprogressbar.Handle,200) //Последнее значение задается в зависимости от кол-ва архивов + 100. То есть - если их 3, то пишем 400, если 1, то 200.

StartArcExtract(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(AddBackslash(ExpandConstant('{src}'))+'data-a.bin')+' -y -dp'+AddQuotes(ExpandConstant('{app}')), ReturnCode)

UpdateWizGauge;

end;
end;


и вот это
читать дальше »
Код:

[сode]
procedure InitPBarz(wizpbhwnd,pbhwnd:THandle; pbLengt:integer);
external 'InitPBarz@files:arc.dll stdcall';

procedure StartArcExtract(freearc,params:pchar; var ReturnCode:integer);
external 'StartArcExtract@files:arc.dll stdcall';

procedure CancelExtract;
external 'CancelExtract@files:arc.dll stdcall';

procedure RepeatExtract;
external 'RepeatExtract@files:arc.dll stdcall';

procedure SuspendExtract;
external 'SuspendExtract@files:arc.dll stdcall';

procedure ResumeExtract;
external 'ResumeExtract@files:arc.dll stdcall';

procedure UpdateWizGauge;
external 'UpdateWizGauge@files:arc.dll stdcall';

procedure SkipError;
external 'SkipError@files:arc.dll stdcall';

function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';

const
MB_ICONQUESTION = $20;

var
SecondProgressBar: TNewProgressBar;

procedure InitializeWizard();
begin
SecondProgressBar := TNewProgressBar.Create(WizardForm);
with SecondProgressBar do
begin
  Parent := wizardform.InstallingPage;
  Left := ScaleX(wizardform.progressgauge.left);
  Top := ScaleY(wizardform.progressgauge.top);
  Width := ScaleX(wizardform.progressgauge.Width);
  Height := ScaleY(wizardform.progressgauge.Height);
end;
end;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
if curpage=wpInstalling then begin

Cancel:=False;
Confirm:=False;

SuspendExtract;

case MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), setupmessage(msgExitSetupMessage), setupmessage(msgExitSetupTitle), MB_YESNO or MB_defbutton2 or MB_ICONQUESTION) of

idyes: begin CancelExtract Cancel:=true end;

idno: ResumeExtract;
end
end
end;

procedure CurStepChanged(CurStep: TSetupStep);
var returnCode:integer;
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
ExtractTemporaryFile('arc.exe');
InitPBarz(wizardform.progressgauge.handle,secondprogressbar.Handle,200) //Последнее значение задается в зависимости от кол-ва архивов + 100. То есть - если их 3, то пишем 400, если 1, то 200.

StartArcExtract(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(AddBackslash(ExpandConstant('{src}'))+'data-a.bin')+' -y -dp'+AddQuotes(ExpandConstant('{app}')), ReturnCode)

UpdateWizGauge;

end;
end;


Serega 13-06-2009 22:55 1142617

Цитата:

Цитата Krekerpro
возможно ли соединить это »

читать дальше »
Код:

[code]
procedure InitPBarz(wizpbhwnd,pbhwnd:THandle; pbLengt:integer);
  external 'InitPBarz@files:arc.dll stdcall';
procedure StartArcExtract(freearc,params:pchar; var ReturnCode:integer);
  external 'StartArcExtract@files:arc.dll stdcall';
procedure CancelExtract;
  external 'CancelExtract@files:arc.dll stdcall';
procedure RepeatExtract;
  external 'RepeatExtract@files:arc.dll stdcall';
procedure SuspendExtract;
  external 'SuspendExtract@files:arc.dll stdcall';
procedure ResumeExtract;
  external 'ResumeExtract@files:arc.dll stdcall';
procedure UpdateWizGauge;
  external 'UpdateWizGauge@files:arc.dll stdcall';
procedure SkipError;
  external 'SkipError@files:arc.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
  external 'MessageBoxA@user32.dll stdcall';

const
  MB_ICONQUESTION = $20;

var
  SecondProgressBar: TNewProgressBar;
  MouseLabel,SiteLabel: TLabel;

procedure SiteLabelOnClick(Sender: TObject);
var
  ErrorCode: Integer;
begin
  ShellExec('open', 'http://*******', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode)
end;

procedure SiteLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color:=clRed
end;

procedure SiteLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color:=clBlue
end;

procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color:=clGreen
end;

procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color:=clRed
end;

procedure InitializeWizard();
begin
  MouseLabel:=TLabel.Create(WizardForm)
  MouseLabel.Width:=WizardForm.Width
  MouseLabel.Height:=WizardForm.Height
  MouseLabel.Autosize:=False
  MouseLabel.Transparent:=True
  MouseLabel.OnMouseMove:=@SiteLabelMouseMove2
  MouseLabel.Parent:=WizardForm

  SiteLabel:=TLabel.Create(WizardForm)
  SiteLabel.Left:=10
  SiteLabel.Top:=330
  SiteLabel.Cursor:=crHand
  SiteLabel.Font.Color:=clRed
  SiteLabel.Caption:='Pirat.ca'
  SiteLabel.OnClick:=@SiteLabelOnClick
  SiteLabel.OnMouseDown:=@SiteLabelMouseDown
  SiteLabel.OnMouseUp:=@SiteLabelMouseUp
  SiteLabel.OnMouseMove:=@SiteLabelMouseMove
  SiteLabel.Parent:=WizardForm

  SecondProgressBar := TNewProgressBar.Create(WizardForm);
  with SecondProgressBar do begin
    Parent := wizardform.InstallingPage;
    Left := ScaleX(wizardform.progressgauge.left);
    Top := ScaleY(wizardform.progressgauge.top);
    Width := ScaleX(wizardform.progressgauge.Width);
    Height := ScaleY(wizardform.progressgauge.Height);
  end;
end;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
  if curpage=wpInstalling then begin
    Cancel:=False;
    Confirm:=False;
    SuspendExtract;
    case MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')),
      setupmessage(msgExitSetupMessage), setupmessage(msgExitSetupTitle), MB_YESNO or
        MB_defbutton2 or MB_ICONQUESTION) of

    idyes:
      begin
        CancelExtract Cancel:=true
      end;
    idno: ResumeExtract;
    end
  end
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  returnCode:integer;
begin
  if CurStep = ssInstall then begin
    WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
    ExtractTemporaryFile('arc.exe');
    InitPBarz(wizardform.progressgauge.handle,secondprogressbar.Handle,200) //Последнее значение задается в зависимости от кол-ва архивов + 100. То есть - если их 3, то пишем 400, если 1, то 200.
    StartArcExtract(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(AddBackslash(ExpandConstant('{src}'))+'data-a.bin')+' -y -dp'+AddQuotes(ExpandConstant('{app}')), ReturnCode)
    UpdateWizGauge;
  end;
end;


Krekerpro 13-06-2009 23:01 1142620

Ой,я ошибся в третьем,вот скрипт
читать дальше »
Код:

type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  n: Integer;
  FreeMB, TotalMB: Cardinal;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;
  baseDisk, baseDir: string;

  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

const
  oneMB = 1024*1024;

function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint;
  external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
  external 'MessageBoxA@user32.dll stdcall';

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
    case currTime of
      {#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp'))
        end;
      2*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp'))
        end;
      3*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp'))
        end;
      4*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp'))
        end;
      5*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp'))
        end;
      6*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp'))
        end;
      7*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp'))
        end;
      8*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp'))
        end;
      9*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))
        end;
    end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
{ Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
  if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
  if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
  if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
  If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
  If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
  Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб' StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String;
{ Удаление начальных, конечных и повторных пробелов }
Begin
  while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
  Result:= Trim(String);
End;

Function CutString(String: String; MaxLength: Longint): String;
{ Обрезать строку до заданного кол-ва символов}
Begin
  if Length(String) > MaxLength then
  Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength) else
  Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
  FileSystemName:= StringOfChar(' ', 32);
  VolumeName:= StringOfChar(' ', 256);
  GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
  FileSystemName:= DelSp(FileSystemName);
  VolumeName:= DelSp(VolumeName);
  if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh;
var
  FreeB, TotalB: Cardinal;
  Path, String: string;
Begin
  ListBox.Items.Clear
  for n:= 1 to 31 do // диск 'А' пропустить
  if (GetLogicalDrives and (1 shl n)) > 0 then
  if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
  if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then
  ListBox.Items.Add(Chr(ord('A') + n) +':');
  for n:= 0 to ListBox.Items.Count -1 do
  begin
    Path:= Copy(ListBox.Items[n],1,2) +'\'
    { если в накопителе нет диска, пропустить обновление }
    if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then
    begin
      GetDiskInfo(Path);
      if FreeB >= $7FFFFFFF then
      String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else
      String:= PadL(ByteOrTB(FreeB, true),10);
      if TotalB >= $7FFFFFFF then
      begin
        TotalB:= TotalMB;
        FreeB:= FreeMB;
        String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String
      end else
      String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String; ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9);
    end;
  end;
End;

Procedure ObjectOnClick(Sender: TObject);
Begin
  Case TObject(Sender) of
  ListBox:
    for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then
    if baseDisk = ListBox.Items[n][1] then
      WizardForm.DirEdit.Text:= baseDir else
    WizardForm.DirEdit.Text:= ListBox.Items[n][1] +':\'+ ExtractFileName(WizardForm.DirEdit.Text)
  StartMenuTreeView:
    if StartMenuTreeView.Directory <> '' then
    WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else
    WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
  WizardForm.NoIconsCheck:
    begin
      WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled);
      StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled;
      WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled
      end;
    end;
End;

/////////////////////////////////////////////////////////////////////////
procedure InitializeWizard;
begin
  ExtractTemporaryFile('Image_1.bmp');
  ExtractTemporaryFile('Image_2.bmp');
  ExtractTemporaryFile('Image_3.bmp');
  ExtractTemporaryFile('Image_4.bmp');
  ExtractTemporaryFile('Image_5.bmp');
  ExtractTemporaryFile('Image_6.bmp');
  ExtractTemporaryFile('Image_7.bmp');
  ExtractTemporaryFile('Image_8.bmp');
  ExtractTemporaryFile('Image_9.bmp');
  ExtractTemporaryFile('Image_10.bmp');

  currTime := 0;

  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
  WizardForm.ProgressGauge.Left := ScaleX(10);
  WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
  WizardForm.ProgressGauge.Height := 16;
  WizardForm.ProgressGauge.Hide;
  WizardForm.FileNameLabel.Parent := WizardForm;
  WizardForm.FileNameLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
  WizardForm.FileNameLabel.Left := ScaleX(10);
  WizardForm.FileNameLabel.Width := ScaleX(397);
  WizardForm.FileNameLabel.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
  SplashImage.Hide;

  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
  ListBox.Font.Size:= 9
  ListBox.Font.Style:= [fsBold]
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;
  baseDir:= WizardForm.DirEdit.Text
  baseDisk:= WizardForm.DirEdit.Text[1]
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
  if CurPageID = wpSelectDir then ListBoxRefresh
  if CurPageID = wpInstalling then
  begin
    pfunc := WrapTimerProc(@OnTimer, 5);
    TimerID := SetTimer(0, 0, 1000, pfunc);
    WizardForm.PageNameLabel.Visible:=false
    WizardForm.PageDescriptionLabel.Visible:=false
    WizardForm.InnerNotebook.Hide;
    WizardForm.Bevel1.Hide;
    WizardForm.MainPanel.Hide;
    WizardForm.PageNameLabel.Hide;
    WizardForm.PageDescriptionLabel.Hide;
    WizardForm.ProgressGauge.Show;
    WizardForm.FileNameLabel.Show;
    SplashImage.Show;
    WizardForm.CancelButton.Enabled :=True
    WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100)
  end else
  begin
    WizardForm.ProgressGauge.Hide;
    SplashImage.Hide;
    WizardForm.FileNameLabel.Hide;
    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end
    If CurPageID=wpFinished then
  end;
end;

procedure DeInitializeSetup();
begin
  KillTimer(0, TimerID);
end;


Serega 13-06-2009 23:11 1142629

Цитата:

Цитата Krekerpro
ошибся в третьем,вот скрипт »

читать дальше »
[code]
Код:

type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  n: Integer;
  FreeMB, TotalMB: Cardinal;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;
  baseDisk, baseDir: string;

  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

  SecondProgressBar: TNewProgressBar;
  MouseLabel,SiteLabel: TLabel;

const
  oneMB = 1024*1024;
  MB_ICONQUESTION = $20;

function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint;
  external 'GetVolumeInformationA@kernel32.dll stdcall';

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure InitPBarz(wizpbhwnd,pbhwnd:THandle; pbLengt:integer);
  external 'InitPBarz@files:arc.dll stdcall';
procedure StartArcExtract(freearc,params:pchar; var ReturnCode:integer);
  external 'StartArcExtract@files:arc.dll stdcall';
procedure CancelExtract;
  external 'CancelExtract@files:arc.dll stdcall';
procedure RepeatExtract;
  external 'RepeatExtract@files:arc.dll stdcall';
procedure SuspendExtract;
  external 'SuspendExtract@files:arc.dll stdcall';
procedure ResumeExtract;
  external 'ResumeExtract@files:arc.dll stdcall';
procedure UpdateWizGauge;
  external 'UpdateWizGauge@files:arc.dll stdcall';
procedure SkipError;
  external 'SkipError@files:arc.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
  external 'MessageBoxA@user32.dll stdcall';

procedure SiteLabelOnClick(Sender: TObject);
var
  ErrorCode: Integer;
begin
  ShellExec('open', 'http://*******', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode)
end;

procedure SiteLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color:=clRed
end;

procedure SiteLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color:=clBlue
end;

procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color:=clGreen
end;

procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color:=clRed
end;

Procedure ObjectOnClick(Sender: TObject);
Begin
  Case TObject(Sender) of
  ListBox:
    for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then
    if baseDisk = ListBox.Items[n][1] then
      WizardForm.DirEdit.Text:= baseDir else
    WizardForm.DirEdit.Text:= ListBox.Items[n][1] +':\'+ ExtractFileName(WizardForm.DirEdit.Text)
  StartMenuTreeView:
    if StartMenuTreeView.Directory <> '' then
    WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else
    WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
  WizardForm.NoIconsCheck:
    begin
      WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled);
      StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled;
      WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled
      end;
    end;
End;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
  if curpage=wpInstalling then begin
    Cancel:=False;
    Confirm:=False;
    SuspendExtract;
    case MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')),
      setupmessage(msgExitSetupMessage), setupmessage(msgExitSetupTitle), MB_YESNO or
        MB_defbutton2 or MB_ICONQUESTION) of

    idyes:
      begin
        CancelExtract Cancel:=true
      end;
    idno: ResumeExtract;
    end
  end
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  returnCode:integer;
begin
  if CurStep = ssInstall then begin
    WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
    ExtractTemporaryFile('arc.exe');
    InitPBarz(wizardform.progressgauge.handle,secondprogressbar.Handle,200) //Последнее значение задается в зависимости от кол-ва архивов + 100. То есть - если их 3, то пишем 400, если 1, то 200.
    StartArcExtract(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(AddBackslash(ExpandConstant('{src}'))+'data-a.bin')+' -y -dp'+AddQuotes(ExpandConstant('{app}')), ReturnCode)
    UpdateWizGauge;
  end;
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
    case currTime of
      {#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp'))
        end;
      2*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp'))
        end;
      3*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp'))
        end;
      4*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp'))
        end;
      5*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp'))
        end;
      6*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp'))
        end;
      7*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp'))
        end;
      8*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp'))
        end;
      9*{#TIME_FOR_VIEW}:
        begin
          SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))
        end;
    end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
{ Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
  if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
  if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
  if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
  If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
  If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
  Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб' StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String;
{ Удаление начальных, конечных и повторных пробелов }
Begin
  while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
  Result:= Trim(String);
End;

Function CutString(String: String; MaxLength: Longint): String;
{ Обрезать строку до заданного кол-ва символов}
Begin
  if Length(String) > MaxLength then
  Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength) else
  Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
  FileSystemName:= StringOfChar(' ', 32);
  VolumeName:= StringOfChar(' ', 256);
  GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
  FileSystemName:= DelSp(FileSystemName);
  VolumeName:= DelSp(VolumeName);
  if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh;
var
  FreeB, TotalB: Cardinal;
  Path, String: string;
Begin
  ListBox.Items.Clear
  for n:= 1 to 31 do // диск 'А' пропустить
  if (GetLogicalDrives and (1 shl n)) > 0 then
  if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
  if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then
  ListBox.Items.Add(Chr(ord('A') + n) +':');
  for n:= 0 to ListBox.Items.Count -1 do
  begin
    Path:= Copy(ListBox.Items[n],1,2) +'\'
    { если в накопителе нет диска, пропустить обновление }
    if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then
    begin
      GetDiskInfo(Path);
      if FreeB >= $7FFFFFFF then
      String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else
      String:= PadL(ByteOrTB(FreeB, true),10);
      if TotalB >= $7FFFFFFF then
      begin
        TotalB:= TotalMB;
        FreeB:= FreeMB;
        String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String
      end else
      String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String; ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9);
    end;
  end;
End;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
  if CurPageID = wpSelectDir then ListBoxRefresh
  if CurPageID = wpInstalling then
  begin
    pfunc := WrapTimerProc(@OnTimer, 5);
    TimerID := SetTimer(0, 0, 1000, pfunc);
    WizardForm.PageNameLabel.Visible:=false
    WizardForm.PageDescriptionLabel.Visible:=false
    WizardForm.InnerNotebook.Hide;
    WizardForm.Bevel1.Hide;
    WizardForm.MainPanel.Hide;
    WizardForm.PageNameLabel.Hide;
    WizardForm.PageDescriptionLabel.Hide;
    WizardForm.ProgressGauge.Show;
    WizardForm.FileNameLabel.Show;
    SplashImage.Show;
    WizardForm.CancelButton.Enabled :=True
    WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100)
  end else
  begin
    WizardForm.ProgressGauge.Hide;
    SplashImage.Hide;
    WizardForm.FileNameLabel.Hide;
    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end
    If CurPageID=wpFinished then
  end;
end;

procedure InitializeWizard();
begin
  MouseLabel:=TLabel.Create(WizardForm)
  MouseLabel.Width:=WizardForm.Width
  MouseLabel.Height:=WizardForm.Height
  MouseLabel.Autosize:=False
  MouseLabel.Transparent:=True
  MouseLabel.OnMouseMove:=@SiteLabelMouseMove2
  MouseLabel.Parent:=WizardForm

  SiteLabel:=TLabel.Create(WizardForm)
  SiteLabel.Left:=10
  SiteLabel.Top:=330
  SiteLabel.Cursor:=crHand
  SiteLabel.Font.Color:=clRed
  SiteLabel.Caption:='Pirat.ca'
  SiteLabel.OnClick:=@SiteLabelOnClick
  SiteLabel.OnMouseDown:=@SiteLabelMouseDown
  SiteLabel.OnMouseUp:=@SiteLabelMouseUp
  SiteLabel.OnMouseMove:=@SiteLabelMouseMove
  SiteLabel.Parent:=WizardForm

  SecondProgressBar := TNewProgressBar.Create(WizardForm);
  with SecondProgressBar do begin
    Parent := wizardform.InstallingPage;
    Left := ScaleX(wizardform.progressgauge.left);
    Top := ScaleY(wizardform.progressgauge.top);
    Width := ScaleX(wizardform.progressgauge.Width);
    Height := ScaleY(wizardform.progressgauge.Height);
  end;

  ExtractTemporaryFile('Image_1.bmp');
  ExtractTemporaryFile('Image_2.bmp');
  ExtractTemporaryFile('Image_3.bmp');
  ExtractTemporaryFile('Image_4.bmp');
  ExtractTemporaryFile('Image_5.bmp');
  ExtractTemporaryFile('Image_6.bmp');
  ExtractTemporaryFile('Image_7.bmp');
  ExtractTemporaryFile('Image_8.bmp');
  ExtractTemporaryFile('Image_9.bmp');
  ExtractTemporaryFile('Image_10.bmp');

  currTime := 0;

  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
  WizardForm.ProgressGauge.Left := ScaleX(10);
  WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
  WizardForm.ProgressGauge.Height := 16;
  WizardForm.ProgressGauge.Hide;
  WizardForm.FileNameLabel.Parent := WizardForm;
  WizardForm.FileNameLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
  WizardForm.FileNameLabel.Left := ScaleX(10);
  WizardForm.FileNameLabel.Width := ScaleX(397);
  WizardForm.FileNameLabel.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
  SplashImage.Hide;

  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
  ListBox.Font.Size:= 9
  ListBox.Font.Style:= [fsBold]
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;
  baseDir:= WizardForm.DirEdit.Text
  baseDisk:= WizardForm.DirEdit.Text[1]
end;

procedure DeInitializeSetup();
begin
  KillTimer(0, TimerID);
end;


Krekerpro 13-06-2009 23:22 1142638

Serega,
А можно разделить прогресс-бар на две части,на подобии вот этого http://clip2net.com/clip/m19309/1244...-clip-22kb.png ?

Serega 14-06-2009 00:27 1142671

Цитата:

Цитата Krekerpro
А можно разделить прогресс-бар на две части »

это два отдельных прогрессбара

Krekerpro 14-06-2009 00:40 1142674

Serega,
Ясно.
Хотелось бы вставить картинку вместо надписи внизу слева http://clip2net.com/clip/m19309/1244...-clip-21kb.png

Serega 14-06-2009 01:11 1142690

Вложений: 1
Цитата:

Цитата Krekerpro
Хотелось бы вставить картинку вместо надписи »

Прикрепил пример, с библиотекой.

katok888 14-06-2009 09:56 1142793

InnoUnpacker одна из возможностей этой программы заключается в том, что можно просмотреть содержание CompiledCode.bin

ISTool 5.30 и Русификатор

чей-то бот 14-06-2009 17:34 1143032

Цитата:

Цитата BlackSelf
Вроде вот dll-ка (можете переименовать на unpack.dll, если очень надо) - http://narod.ru/disk/9755536000/arc.dll.html »

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

BlackSelf 14-06-2009 18:36 1143073

чей-то бот, пиши z1oyded, но исходники мне он не дал да и что-то править ради других он тоже вряд ли будет.
Вот ещё dll-ка со скриптом для распаковки freearc-архивов. Автор Bulat_Ziganshin. Скачать

чей-то бот 14-06-2009 18:41 1143076

BlackSelf, дай плиз контакты его

BlackSelf 14-06-2009 18:44 1143080

Вот лс на т.ру.

p3rf3ct1c 14-06-2009 23:21 1143262

Люди а как убрать надписи отмеченные красным?

Raf-9600 15-06-2009 12:33 1143630

p3rf3ct1c, добавь в скрипт:
Код:

[Messages]
WelcomeLabel1=
WelcomeLabel2=
ClickNext=
FinishedHeadingLabel=
FinishedLabelNoIcons=
ClickFinish=


volk1234 15-06-2009 12:48 1143645

Подскажет ли кто, как расшифровать на язык cmd следущие строки:

Код:

Source: "{sys}\msvcr71.dll"; DestDir: "{sys}"; MinVersion: 4.1,5.0.2195; Flags: uninsneveruninstall onlyifdoesntexist
Source: "{cf}\prog1\prog1.dll"; DestDir: "{cf}\prog1"; MinVersion: 4.1,5.0.2195; Flags: regserver sharedfile

если запускаю родной инсталлятор Inno - библиотеки регистрируются и работают. Сделал свой инсталятор, не регистрируются
библиотеки в коммандной строке.
Строка (во всех вариациях, с кавычками, без кавычек, из бат файла, из коммандной строки)
Код:

regsrv32  prog1.dll
вызывает ошибку
читать дальше »
Код:

---------------------------
RegSvr32
---------------------------
Ошибка при вызове LoadLibrary("G:\CREATION\prog1\beta.view\musor\temp\prog1.dll")  - Не найдена указанная процедура.

---------------------------
ОК 
---------------------------


Посмотрел DependencyWallker - нехватает msjava.dll (хотя ее и в Inno установке нет) подложил и ее - без толку, ругается уже на точку входа.

Как вообще расшифровывается regserver sharedfile
Что эта комманда делает, я в справке почитал.
Нечто вроде regsvr32 (вызов DllRegisterServer) и запись библиотеки в раздел реестра SharedFiles.
Кто знает подробнее??

Raf-9600 15-06-2009 13:38 1143672

Ктонить может доработать этот код, так чтобы для слайд-шоу можно было использовать JPG картинки, и само слайд-шоу показывало их не по порядку, а рандомно?

читать дальше »

Код:

#define TIME_FOR_VIEW 5

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=none
SolidCompression=yes

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

[Files]
Source: compiler:get_hw_caps.dll; DestDir: {tmp}; Flags: dontcopy
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_1.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_2.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_3.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_4.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_5.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_6.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_7.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_8.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_9.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: F:\ISSkin\TR\Slide_Img\Image_10.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak

[_Code]
var
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp')) end;
  9*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))end;
  end;
  if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;


procedure InitializeWizard;
begin
  ExtractTemporaryFile('Image_1.bmp');
  ExtractTemporaryFile('Image_2.bmp');
  ExtractTemporaryFile('Image_3.bmp');
  ExtractTemporaryFile('Image_4.bmp');
  ExtractTemporaryFile('Image_5.bmp');
  ExtractTemporaryFile('Image_6.bmp');
  ExtractTemporaryFile('Image_7.bmp');
  ExtractTemporaryFile('Image_8.bmp');
  ExtractTemporaryFile('Image_9.bmp');
  ExtractTemporaryFile('Image_10.bmp');

  currTime := 0;

  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
  WizardForm.ProgressGauge.Left := ScaleX(10);
  WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
  WizardForm.ProgressGauge.Height := 16;
  WizardForm.ProgressGauge.Hide;
 
  WizardForm.FileNameLabel.Parent := WizardForm;
  WizardForm.FileNameLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
  WizardForm.FileNameLabel.Left := ScaleX(10);
  WizardForm.FileNameLabel.Width := ScaleX(397);
  WizardForm.FileNameLabel.Hide;
 
  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
  SplashImage.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 5);
      TimerID := SetTimer(0, 0, 1000, pfunc);
      WizardForm.PageNameLabel.Visible:=false
      WizardForm.PageDescriptionLabel.Visible:=false
      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.ProgressGauge.Show;
      WizardForm.FileNameLabel.Show;
      SplashImage.Show;
      WizardForm.CancelButton.Enabled :=True
      WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100)
      end
  else
    begin
    WizardForm.ProgressGauge.Hide;
    SplashImage.Hide;
    WizardForm.FileNameLabel.Hide;
    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end
    If CurPageID=wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
 KillTimer(0, TimerID);
end;


Serega 15-06-2009 15:38 1143768

Цитата:

Цитата volk1234
запускаю родной инсталлятор Inno - библиотеки регистрируются и работают. Сделал свой инсталятор, не регистрируются библиотеки в коммандной строке »

Цитата:

Цитата volk1234
вызывает ошибку »

А скрипт распаковывали Unpaker'ом?
Если да, то попробуйте InnoUnPacker 2.6b3 от valeron87, Зеркало
По-моему, он более правильно показывает флаги и файлы в инсталляторе, в отличии от Unpaker'а, который иногда ошибается и корёжит файлы, хотя это бывает редко, но всё же.

Цитата:

Цитата volk1234
Как вообще расшифровывается regserver sharedfile »

Цитата:

Цитата из Справки
regserver

Регистрация OLE-сервера (он же ActiveX control). Если этот флаг установлен, инсталлятор найдет и выполнит DllRegisterServer для DLL/OCX. Деинсталлятор вызовет DllUnregisterServer. При использовании в комбинации с флагом sharedfile DLL/OCX будет только дерегистрирована, когда связывающий счетчик достигнет нуля.

Цитата:

Цитата volk1234
Нечто вроде regsvr32 (вызов DllRegisterServer) и запись библиотеки в раздел реестра SharedFiles. »

всё правильно, т.е. обычная регистрация библиотеки в системе.

P.S.
InnoUnPacker, я думаю нужно добавить в шапку и так же:
Цитата:

Цитата katok888
ISTool 5.30 и Русификатор »


p3rf3ct1c 15-06-2009 16:45 1143829

Raf-9600, Спасибо, в начале убралось но в завершении установки осталось вот это

И можешь пожалуйста подсказать как сверху убрать надписи на каждой странице?

Raf-9600 15-06-2009 16:55 1143839

Цитата:

Цитата p3rf3ct1c
в начале убралось но в завершении установки осталось вот это »

Заходишь в папку с установленным Inno Setup\Languages\Russian.isl его открываешь блокнотом, и ищешь нужную для удаления надпись, когда находишь, то "случай" при котором оно отображаеться, добавляешь в [Messages], в своем скрипте.

Цитата:

Цитата p3rf3ct1c
И можешь пожалуйста подсказать как сверху убрать надписи на каждой странице? »

Конкретного ответа даль не могу, но вот скрипт который мне дал serg_aka_lain, для SmallImage размерами 497х58, с удалением надписей.

Код:

[Сode]
procedure InitializeWizard();
begin
with WizardForm do begin
with MainPanel do
Height := Height - 1;
with WizardSmallBitmapImage do begin
Left := 0;
Top := 0;
Height := 58; //Размер рисунка
Width := 497; //
end;
with PageNameLabel do begin
Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст
Left := Left + 497; //
end;
with PageDescriptionLabel do begin
Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст
Left := Left + 497; //
end;
end;
end;


p3rf3ct1c 15-06-2009 17:44 1143915

Raf-9600, Спасибо!

Надписи сверху я убрал другим способом, добавил в скрипт вот это:
Код:

[Messages]
WizardSelectDir=
SelectDirDesc=
WizardSelectProgramGroup=
SelectStartMenuFolderDesc=
WizardReady=
ReadyLabel1=
WizardInstalling=
InstallingLabel=


semiono 15-06-2009 22:19 1144172

Помогите с кодом в InnoSetup!
Идея такова, хочу после работы секции [Run] выполнить экспорт некоторых параметров из реестра,
чтобы сразу получить файл {app}\BackUpApp.reg - что весьма удобно для пользователя должно быть!

Вообще это возможно - всмысле секция [C0de] до или после [Run] выполняется? Или можно указать?
Если есть такая возможность, пожалуста покажите мне пример кода, нужно зделать следующее...
Каким-то образом создать reg-файл, в который нужно записать некоторые value из реестра,
которые известны с самого начала установки.
Например,
Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Miranda]
"Install_Dir"="C:\\~\\Apps\\Miranda"


Но проблемма в том что не все аргументы заранее известны, так как после выполнения [Run]
некоторые ValueData: ""; будут содержать случайные записи.

Тут нужены наверное RegRead/RegWrite функции и с записью в файл.
Помогите, я не сумею код составить!

Вот это сразу же придётся отбросить, по той причине, что нам не нужен весь ключ, а только выборочные value
Код:

[Run]
Filename: "{tmp}\Setup.exe"; Flags: hidewizard
Filename: "reg.exe"; Parameters: "export ""HKLM\Software\Native Instruments\AkoustikPiano"" {sys}\Protoxp\AkoustikPiano\AkoustikPiano.reg"; Check: not IsWin64; Flags: hidewizard runhidden
Filename: "reg.exe"; Parameters: "export ""HKLM\Software\Native Instruments\AkoustikPiano"" {reg:HKLM\Software\VST,VSTPluginsPath|{sys}\Plugins}\AkoustikPiano\AkoustikPiano.reg"; Check: not IsWin64; Flags: hidewizard runhidden
Filename: "reg.exe"; Parameters: "export ""HKLM\Software\Wow6432Node\Native Instruments\AkoustikPiano"" {syswow64}\Protoxp\AkoustikPiano\AkoustikPiano.reg"; Check: IsWin64; Flags: hidewizard runhidden
Filename: "reg.exe"; Parameters: "export ""HKLM\Software\Wow6432Node\Native Instruments\AkoustikPiano"" {reg:HKLM32\Software\VST,VSTPluginsPath|{syswow64}\Plugins}\AkoustikPiano\AkoustikPiano.reg"; Check: IsWin64; Flags: hidewizard runhidden

хотя с команд строкой идея мне очень нравится

Если использовать автоит из временной папки, то ему тогда сложно указать куда сохранить regfile, так как это известно только инсталлеру. Сохранять скрипт в папке программы, тоже не хорошо, так как его тогда надо будет удалять оттуда каким-то образом. А оставлять темп-файлы я не люблю.

Serega 16-06-2009 17:12 1144850

Цитата:

Цитата semiono
хочу после работы секции [Run] выполнить экспорт некоторых параметров из реестра »

Я думаю можно таким образом:
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[code]
// считываем данные из реестра
procedure CurStepChanged(CurStep: TSetupStep);
var
  str: string;
begin
  if CurStep = ssDone then begin
    if RegValueExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Miranda', 'Install_Dir') = True then begin
      if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Miranda', 'Install_Dir', str) = True then begin
        str:= 'Windows Registry Editor Version 5.00' + #13#13 +
              '[HKEY_LOCAL_MACHINE\SOFTWARE\My Program\System]' + #13 +
              '"Path"=' + AddQuotes(str) + #13;
        // создаём файл BackUpApp.reg
        SaveStringToFile(ExpandConstant('{app}\BackUpApp.reg'), str, False);
      end;
    end;
  end;
end;


Berline 17-06-2009 13:15 1144991

Вопрос: страница выбора компонентов - сперва комбо список - где 3 типа установки фул кастом компакт - ниже компоненты, отмечаем нужные галочками
Можно ли с этой страницы в принципе убрать комбо бокс с выбором типа установки и оставить только выбор самих компонентов?

Serega 17-06-2009 21:55 1145454

Цитата:

Цитата Berline
убрать комбо бокс с выбором типа установки и оставить только выбор самих компонентов? »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
;ComponentsListTVStyle=True

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

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: a\a; Description: Руководство пользователя; Types: full
Name: a\a\a; Description: Русский; Flags: exclusive
Name: a\a\b; Description: English; Flags: exclusive
Name: a\b; Description: Справка; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\Readme-ru.txt; DestDir: {app}; Components: a\a\a
Source: compiler:Examples\Readme-en.txt; DestDir: {app}; Components: a\a\b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a\b

[code]
procedure InitializeWizard();
begin
  with WizardForm do begin
    TYPESCOMBO.Hide;
    ComponentsList.Height:= 155;
    ComponentsList.Top:= 50;
  end;
end;


Serega 17-06-2009 23:49 1145532

Здравствуйте, обновил программу Converter до версии 0.1.2.
Корректно читаются и конвертируются из HEX данных в читаемый вид, значения ключей REG_EXPAND_SZ (expandsz) и REG_MULTI_SZ (multisz).

Serega 18-06-2009 12:55 1145883

Цитата:

Цитата tem000
плюс у меня они движутся как то рывками т.е не плавно всплывают »

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

volk1234 18-06-2009 13:07 1145894

Шапку обновил, поднял ссылки на InnoUnpacker, IsTool, Converter...
Может старый Istool Удалить?

Serega 18-06-2009 13:11 1145901

Цитата:

Цитата volk1234
Может старый Istool Удалить? »

Я думаю, он не нужен, т.е. можно удалить.

p3rf3ct1c 20-06-2009 00:52 1147266

Здравствуйте. Может мне кто нибудь подсказать, что нужно указать в параметрах, чтобы на этой странице кнопка "next" сама нажималать и продолжалась установка дальше, а по окончанию установки чтобы кнопка finish сама нажалась.
Код:

Filename: {src}\PunkBuster\pbsvc.exe; Parameters:/i --i-accept-the-pb-eula; StatusMsg: Устанавливается PunkBuster...; Check: InstallDop

Cibersoft Prolex 20-06-2009 01:10 1147272

p3rf3ct1c
Не знаю можно ли это реализовать в Inno Setup, но это можно осуществить с помощью AutoIT.
Форум по AutoIT

Serega 20-06-2009 01:18 1147275

Цитата:

Цитата p3rf3ct1c
что нужно указать в параметрах, чтобы на этой странице »

нужно в коде прописать процедуру:
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
// wpWelcome - ID страницы
  If CurPageID = wpWelcome then
// соответственно нажимаем на кнопку на этой странице
  WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;


p3rf3ct1c 20-06-2009 11:54 1147435

Cibersoft Prolex, Спасибо конечно, но это для меня сложно.

Serega, Мб Вы меня не так поняли или я чтото не понял, я создал инсталлятор, и и отметил галочку чтобы после установки игры установилось дополнительное по (всякие DirectX (Parameters: /silent), vcredist_x86,x64 (Parameters: /Q), в том числе и PunkBuster), когда установка доходит до PunkBuster он начинает установку (Parameters:/i), сам принимает лицензионное соглашение (Parameters:/i --i-accept-the-pb-eula), а как сделать чтобы он кнопку "next" и в конце "finish" тоже сам нажимал?

Мне наверно надо тут чтото дописать
Код:

Filename: {src}\PunkBuster\pbsvc.exe; Parameters:/i --i-accept-the-pb-eula; StatusMsg: Устанавливается PunkBuster...; Check: InstallDop

Serega 20-06-2009 13:52 1147500

p3rf3ct1c, я не совсем понимаю, что вы хотите сделать.
Вы хотите установить инсталлятор автоматом? Если, да, то пользуйтесь командной строкой, т.е. запустите инсталлятор с ключом /silent - с отображением хода установки или /verysilent - установка в тихом режиме, без отображения на экране пользователя.
Пример:
setup.exe /verysilent

p3rf3ct1c 20-06-2009 14:39 1147522

Serega, мне надо чтобы после установки какой либо игры запустилась установка этого файла
Цитата:

Filename: {src}\PunkBuster\pbsvc.exe; Parameters:/silent; StatusMsg: Устанавливается PunkBuster...; Check: InstallDop
в тихом режиме, когда я указываю в параметрах /silent выдает сообщение

когда я нажимаю ок, выдает еще одно сообщение

Serega 20-06-2009 17:30 1147627

Цитата:

Цитата p3rf3ct1c
после установки какой либо игры запустилась установка этого файла »

Так и надо говорить, что запустить нужно сторонний файл, а не ваш инсталлятор.
Прежде всего, нужно определить из чего, с помощью какого инсталлятора он сделан и запускать с соответствующими ключами для этого инсталлятора.

p3rf3ct1c 20-06-2009 18:07 1147643

Serega, я даже не знаю из чего и с помощью чего он сделан, а про ключи я вообще не знаю куда писать и что делать.
Если я вам скину эту программку (653кб), то вы сможете помочь?

Serega 20-06-2009 18:15 1147648

p3rf3ct1c, давайте ссылку.

p3rf3ct1c 20-06-2009 18:19 1147652

Serega,

Скачать:
Slil.ru (653.5KB)

Serega 20-06-2009 18:40 1147666

p3rf3ct1c, этот инсталлятор сделан самим автором программы в Microsoft Visual C++ 7.0, но он позаботился о ключах установки. Попробуйте, так:
Код:

Filename: {src}\PunkBuster\pbsvc.exe; Parameters: /i --no-display --i-accept-the-pb-eula; WorkingDir: {src}\PunkBuster; StatusMsg: Устанавливается PunkBuster...; Check: InstallDop

p3rf3ct1c 20-06-2009 18:48 1147676

Serega, Спасибо огромное! Все работает!

grinda 20-06-2009 23:03 1147807

подскажите как поставить разделение на 2 диска,чтоб в конце установки 1 диска появилось сообщение-вставьте 2 диск.

Serega 21-06-2009 08:32 1147968

Цитата:

Цитата grinda
как поставить разделение на 2 диска,чтоб в конце установки 1 диска появилось сообщение-вставьте 2 диск »

Вам нужно добавить в секцию [Setup]:
Код:

...................................
DiskSpanning=yes
SlicesPerDisk=количество файлов .bin на одном диске
DiskSliceSize=размер файлов .bin в байтах, максимальный размер 2100000000 байт
..................................

DiskSpanning
Цитата:

Цитата из Справки
DiskSpanning

Возможные значения: yes or no

Значение по умолчанию:no

Опмсание:

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


SlicesPerDisk
Цитата:

Цитата из Справки
SlicesPerDisk

Возможные значения:1 through 26

Значение по умолчанию:1

Описание:

Число файлов SETUP-*.BIN, которые будут созданы на диске. Если равно значению по умолчанию (1), файлы будут проименованы SETUP-x.BIN, где х - номер диска. Если значение больше 1, файлы будут проименованы как SETUP-xy.BIN, где х - номер диска, y - номер файла на этом диске. Изменять значение по умолчанию придется только в случае, когда размер диска превышает 2,100,000,000 байт - это больше, чем может позволить директива DiskSliceSize секции [Setup]. Если, например, диск имеет размер 3,000,000,000 байт, можно избежать лимита на размер диска в 2,100,000,000 байт, задав директиве SlicesPerDisk значение 2 и DiskSliceSize значение 1500000000 (или меньше, в зависимости от возможностей системы).


DiskSliceSize
Цитата:

Цитата из Справки
DiskSliceSize

Возможные значения:262144 through 2100000000

Значение по умолчанию:1457664 (размер дискеты 1.44 Mб)

Описание:

Максимальное число байт, доступных на диске. Директива игнорируется, если разбиение на диски не включено (директива DiskSpanning).


p3rf3ct1c 21-06-2009 12:44 1148080

Подскажите, как сделать если система х86, то создавался бы ярлык на рабочем столе "ya86", а если х64, то "ya64"?

Serega 21-06-2009 13:44 1148110

Цитата:

Цитата p3rf3ct1c
если система х86, то создавался бы ярлык на рабочем столе "ya86", а если х64, то "ya64"? »

Код:

[Icons]
Name: {group}\ya86; Filename: {app}\MyProg.exe; WorkingDir: {app}; Check: not IsWin64
Name: {group}\ya64; Filename: {app}\MyProg.exe; WorkingDir: {app}; Check: IsWin64


DemonAk 22-06-2009 09:58 1148741

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

Serega 22-06-2009 11:07 1148781

Цитата:

Цитата DemonAk
Как сделать чтобы сначала выполнялся code, а потом уже копировались файлы и выполнялась установка из run »

Можно, только поподробней объясните, что вы хотите сделать и что должно выполниться из секции кода.

Berline 22-06-2009 11:27 1148804

Очередной вопрос ламера:

Каким образом мы можем сделать следущее - если ставим в 1й раз, и программа определила, что каталога назначения нету - все проходит на ура - а если ставим уже поверх установленной программы - чтоб сперва удалил ярлыки которые были выведены, удалил папку назначения - и уже поставил ка бы с 0(с учетом что настройки программы хранятся в реестре, их удалять нельзя)

DemonAk 22-06-2009 13:55 1148928

Цитата:

Цитата Serega
Можно, только поподробней объясните, что вы хотите сделать и что должно выполниться из секции кода. »

Распаковываются архивы freearc'a с помощью скрипта и dll Bulata Ziganshina. Дело в том что когда сначала копируются файлы и создаются ярлыки они выгледят на раб столе без картинок т.к. файлы содержащие их еще не распаковались а после распаковки приходится нажимать на рабочем столе обновить. А вообще сейчас сказав про это, возможно ли сделать что бы ярлыки создавались последними.

Serega 22-06-2009 14:20 1148954

Berline, а не проще поставить поверх программу?
Теоретически, конечно можно определить куда были установлены ярлыки в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\..._isl, удалить их и удалить всю папку приложения, но как быть с хвостами в реестре? т.е. после удаления второй программы, они так и останутся мусором в системе пользователя...

Цитата:

Цитата DemonAk
Дело в том что когда сначала копируются файлы и создаются ярлыки они выгледят на раб столе без картинок т.к. файлы содержащие их еще не распаковались а после распаковки приходится нажимать на рабочем столе обновить. »

Решается очень просто, добавьте в секцию [Setup]:
ChangesEnvironment=yes
Описание
Цитата:

Цитата из Справки
Возможные значения: yes или no

Значение по умолчанию: no

Описание:

При значении yes по завершению установки инсталлятор сообщит другим запущенным приложениям (в том числе Проводнику), чтобы они перезагрузили переменные среды (environment variables) из реестра.

На NT-платформах Windows, если инсталлятор создает или изменяет переменную среды (environment variable), а директиве ChangesEnvironment не присвоено значение yes, новая/обновленная переменная среды не будет доступна для приложений, запущенных из Проводника, до тех пор, пока пользователь не завершит сеанс или не перезагрузит компьютер.


Berline 22-06-2009 15:40 1149029

Serega, не, вот "мусор" в реестре как раз надо оставить... а ярлыки, и папку с программой снести

R.i.m.s.k.y. 22-06-2009 15:51 1149035

Искал, не нашел.

Подскажите пожалуйста, как можно сохранить в Inno изменяемые ветки реестра перед установкой программы (желательно автоматом, уж больно много), и восстановить реестр при деинсталляции программы?

Заранее спасибо.

Serega 22-06-2009 16:48 1149083

Цитата:

Цитата R.i.m.s.k.y.
Подскажите пожалуйста, как можно сохранить в Inno изменяемые ветки реестра перед установкой программы (желательно автоматом, уж больно много), и восстановить реестр при деинсталляции программы? »

Пример
Код:

[Setup]
AppName=RegBackup
AppVerName=Registry Backup
CreateAppDir=false

[Registry]
;если используется функция RegBackup, то желательно удалять ключ или параметр при деинсталляции (флаги deletevalue или uninsdeletekey), чтобы не оставались записи реестра, которых не было до установки.
Root: HKCU; SubKey: Control Panel\Desktop; ValueType: none; ValueName: Wallpaper; Flags: deletevalue uninsdeletevalue; BeforeInstall: RegBackup('HKCU\Control Panel\Desktop')

[Run]
Filename: {uninstallexe}; Flags: nowait postinstall; Description: Восстановить обои Рабочего стола; Parameters: /SILENT
Filename: {cmd}; Parameters: /C del /F /Q /AH IconCache.db; Flags: runhidden nowait; WorkingDir: {code:GetFolderByCSIDL|28}

[code]
function SystemParametersInfo(uAction, uParam: integer; pvParam: longint; fUpdateProfile: integer): boolean; external 'SystemParametersInfoA@user32';

// получить путь к папке. Пример: DestDir: {code:GetFolderByCSIDL|28}
function GetFolderByCSIDL(CSIDL: String): String;
begin
  Result:= GetShellFolderByCSIDL(StrToInt(CSIDL), true);
end;

// Зарезервировать параметры указанного раздела реестра или Восстановить записи реестра из резервной копии
Procedure RegBackup(Path: String);
var
  errCode, n: Integer;
  RegExe, isKey: String;
  Keys: TArrayOfString;
begin
  RegExe:= AddBackslash(GetSystemDir) + 'reg.exe'
  if not FileExists(RegExe) then begin
    MsgBox('Registry backup not created' #13#10 'File reg.exe not found!', mbError, MB_OK);
    Exit;
  end;
        isKey:= 'HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting('AppName')}_regBackup'        {! InnoSetup удаляет чужие ключи в AppName_is1}
        if Length(Path) > 0 then
                Exec(RegExe,'copy '+ AddQuotes(Path) +' '+ AddQuotes(AddBackslash(isKey) + Path) +' /s /f','',sw_HIDE, ewWaitUntilTerminated, errCode)
        else begin
                if not RegGetSubkeyNames(HKLM, Copy(isKey, 6,Length(isKey)), Keys) then Exit; { нет резервных записей}
        for n:= 0 to GetArrayLength(Keys) -1 do        { reg.exe не может сохранять в корень реестра}
                Exec(RegExe, 'copy '+ AddQuotes(AddBackslash(isKey) + Keys[n]) +' '+ Keys[n] +' /s /f','', sw_HIDE, ewWaitUntilTerminated, errCode)
          RegDeleteKeyIncludingSubkeys(HKLM, Copy(isKey, 6,Length(isKey)))
        end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then SystemParametersInfo(20,0,0,2) { update Desktop}
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
        if CurUninstallStep = usPostUninstall then begin
    RegBackup(''); SystemParametersInfo(20,0,0,2)
  end;
end;


R.i.m.s.k.y. 22-06-2009 17:25 1149107

Цитата:

Цитата Serega
Пример »

эээ, не совсем понятно какой кусок кода какой ключ сохраняет. Ну не силен я в Паскале.
Буду благодарен за простой кусок кода по сути в качестве примера, по аналогии я его размножу.

В принципе можно сделать reg export с параметрами, но выполнить его надо ДО секции [Registry]. Это второй вопрос - в какой последовательности выполняется скрипт Inno и как это сделать.

Serega 22-06-2009 21:55 1149326

Цитата:

Цитата Berline
вот "мусор" в реестре как раз надо оставить... а ярлыки, и папку с программой снести »

как говорят: хозяин - барин...
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
AllowNoIcons=yes
OutputDir=.
;отключаем сообщение о существовании папки
DirExistsWarning=no
;не использовать папку, которую выбрал пользователь в прошлый раз
UsePreviousAppDir=no
;не использовать группу меню Пуск, выбранную пользователем при предыдущей установке
UsePreviousGroup=no
;не использовать тип установки, выбранный пользователем в прошлый раз
UsePreviousSetupType=no
;не использовать задания, которые выбрал пользователь при прошлой установке
UsePreviousTasks=no
;имя пользователя, название организации и серийный номер, которые ввел пользователь при предыдущей установке
UsePreviousUserInfo=no
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[InstallDelete]
; делаем пустую команду, чтоб выполнить код перед установкой
Name: ''; Type: files; BeforeInstall: DeleteAppAndLnk

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {group}\{cm:ProgramOnTheWeb,My Program}; Filename: http://www.example.com/
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program; Filename: {app}\MyProg.exe; Tasks: quicklaunchicon

[Run]
Filename: {app}\MyProg.exe; Description: {cm:LaunchProgram,My Program}; Flags: nowait postinstall skipifsilent

[code]
// узнаём путь к папке
function GetGroupPath: string;
var
  i, k: Integer;
  s: string;
begin
  s:= ExpandConstant('{group}');
    repeat
      if s[Length(s)] <> '\' then
      Delete(s, Length(s), 1);
    until s[Length(s)] = '\';
  Result:= s;
end;

procedure DeleteAppAndLnk;
var
  RootKey: Integer;
  SubKeyName, ValueData: string;
begin
  RootKey:= HKEY_LOCAL_MACHINE;
  SubKeyName:= 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1';
  if RegKeyExists(RootKey, SubKeyName) = True then begin
    if RegValueExists(RootKey, SubKeyName, 'InstallLocation') = True then
    // проверяем, куда была установлена программа
      if RegQueryStringValue(RootKey, SubKeyName, 'InstallLocation', ValueData) = True then
      ValueData:= Copy(ValueData, 1, Length(ValueData)-1);
      // проверяем, существует ли папка
      if DirExists(ValueData) = True then
      // удаляем папку
      DelTree(ValueData, True, True, True);
      if RegValueExists(RootKey, SubKeyName, 'Inno Setup: Icon Group') = True then
      // узнаём название группы
      if RegQueryStringValue(RootKey, SubKeyName, 'Inno Setup: Icon Group', ValueData) = True then
      // проверяем, существует ли папка в меню Пуск
      if DirExists(GetGroupPath + ValueData) = True then
      // если да, то удаляем папку
      DelTree(GetGroupPath + ValueData, True, True, True);
      // проверим рабочий стол
      if FileExists(ExpandConstant('{commondesktop}\My Program.lnk')) = True then
      DeleteFile(ExpandConstant('{commondesktop}\My Program.lnk'));
      // проверим панель быстрого запуска
    if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program.lnk')) = True then
    DeleteFile(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program.lnk'));
  end;
end;


Serega 22-06-2009 22:49 1149363

Цитата:

Цитата R.i.m.s.k.y.
простой кусок кода по сути в качестве примера, по аналогии я его размножу. »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; AfterInstall: BackupReg; Flags: ignoreversion

[code]
procedure BackupReg;
var
  res: Integer;
  BackupDir, Key, RegEdit: string;
begin
  Key:= 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 5_is1';
        BackupDir:= ExpandConstant('{app}');
  RegEdit:= ExpandConstant('{win}\regedit.exe');
        Exec(RegEdit, '-ea backup.reg ' + AddQuotes(Key), BackupDir, SW_HIDE, ewWaitUntilTerminated, Res);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  res: Integer;
  reg: string;
begin
  reg:= ExpandConstant('{app}\backup.reg');
  if CurUninstallStep = usUninstall then begin
    // при деинсталляции, заносим ключ в реестр
    if FileExists(reg) = True then
    Exec('regedit.exe',' /s ' + AddQuotes(reg),ExpandConstant('{win}'),SW_HIDE,ewWaitUntilTerminated,res);
  end;
end;


Krekerpro 25-06-2009 12:17 1151329

Помогите пожалуйста:раньше использовал скрипт от z10y_ded,всё нормально работало,но после переустановки винды,почему то по не понятным причинам,при начале он мне выдаёт ошибку http://clip2net.com/page/m0/1228857

Serega 25-06-2009 13:01 1151364

Цитата:

Цитата Krekerpro
нормально работало,но после переустановки винды »

Это ошибка, не после переустановки, а просто вы стали пользоваться другой версией Inno Setup, а точнее 5.3...
Добавьте в начале секции кода:
Код:

type 
    PChar=PAnsiChar;

или заммеите все PChar на PAnsiChar.

Krekerpro 25-06-2009 13:06 1151370

Теперь тут пишет:Syntax error
Код:

case MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), setupmessage(msgExitSetupMessage), setupmessage(msgExitSetupTitle), MB_YESNO or MB_defbutton2 or MB_ICONQUESTION) of

Serega 25-06-2009 13:19 1151382

Krekerpro, так тяжело сказать, это ошибка синтаксиса, т.е. не хватает или лишние знаки препинания, (скобки)...
В сообщении об ошибке показывает строку и порядковый номер в строке. Посмотрите внимательней, где именно возникает ошибка.

Krekerpro 25-06-2009 13:23 1151387

Serega,
В ISTool'e была это ошибка,а Inno всё нормально скомпил :)

Krekerpro 26-06-2009 20:52 1152662

Хотелось бы узнать,как вот это реализовать http://clip2net.com/page/m0/1239208 и вот это http://clip2net.com/page/m0/1239224,на втором скрине на счёт свободного пространства,его возможно самому вписывать?

Raf-9600 26-06-2009 22:53 1152753

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

читать дальше »

Код:

var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpSelectDir then ListBoxRefresh
End;

Procedure InitializeWizard;
Begin
ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
ListBox.Font.Size:= 9
ListBox.Font.Style:= []
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;
End;


BlackSelf 26-06-2009 22:55 1152754

Krekerpro, примерно вот так:
читать дальше »

Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
DisableReadyPage=true
DisableProgramGroupPage=true
;Картинка сверху
WizardSmallImageFile=small.bmp

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

[Files]
;Картинка на WelcomePage
Source: welcome.bmp; DestDir: {tmp}; Flags: dontcopy solidbreak

[сode]
var
  Image1: TBitmapImage;
  NeedSize:Integer;
  FreeMB, TotalMB: Cardinal;
  NeedSpaceLabel,FreeSpaceLabel,WLabel1,WLabel2: TLabel;
 
procedure GetFreeSpaceCaption(Sender: TObject);                  /////Вычисление свободного места на диске
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB > 1024 then
  FreeSpaceLabel.Caption := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
  FreeSpaceLabel.Caption := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True; end;
 
procedure GetNeedSpaceCaption;                /////Вычисление требуемого места для установки
begin
  if NeedSize > 1024 then
  NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
  NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';end;

procedure InitializeWizard();
begin
  NeedSize := 6610;                  //Здесь указывается место для приложения
  WizardForm.DiskSpaceLabel.Hide;
  ExtractTemporaryFile('welcome.bmp')
  WizardForm.PageNameLabel.Hide;
  WizardForm.PageDescriptionLabel.Hide;
  WizardForm.WizardSmallBitmapImage.Left:= ScaleX(0);
  WizardForm.WizardSmallBitmapImage.Width:=WizardForm.ClientWidth;
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  Image1:=TBitmapImage.Create(WizardForm)
with Image1 do begin
  Left:=0
  Top:=0
  Width:=497
  Height:=313
  Parent:=WizardForm.WelcomePage
  Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\welcome.bmp')
  end;
  NeedSpaceLabel := TLabel.Create(WizardForm);
  with NeedSpaceLabel do
  begin
  Parent := WizardForm.SelectDirPage;
  Left := ScaleX(0);
  Top := ScaleY(202);
  Width := ScaleX(209);
  Height := ScaleY(13);
  end;
  FreeSpaceLabel := TLabel.Create(WizardForm);
  with FreeSpaceLabel do
  begin
  Parent := WizardForm.SelectDirPage;
  Left := ScaleX(0);
  Top := ScaleY(220);
  Width := ScaleX(209);
  Height := ScaleY(13);
  end;
  WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
  WLabel1 := TLabel.Create(WizardForm);
  WLabel1.Left := ScaleX(170);
  WLabel1.Top := ScaleY(16);
  WLabel1.Width := ScaleX(320);
  WLabel1.Height := ScaleY(100);
  WLabel1.AutoSize := False;
  WLabel1.WordWrap := True;
  WLabel1.Font.Size := 12;
  WLabel1.Font.Style := [fsBold];
  WLabel1.Font.Color:= clWhite;
  WLabel1.Font.Name:= 'Tahoma';
  WLabel1.ShowAccelChar := False;
  WLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WLabel1.Transparent := True;
  WLabel1.Parent := WizardForm.WelcomePage;

  WLabel2 :=TLabel.Create(WizardForm);
  WLabel2.Top := ScaleY(76);
  WLabel2.Left := ScaleX(170);
  WLabel2.Width := ScaleX(300);
  WLabel2.Height := ScaleY(234);
  WLabel2.AutoSize := False;
  WLabel2.WordWrap := True;
  WLabel2.Font.Color:= clWhite;
  WLabel2.ShowAccelChar := False;
  WLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  WLabel2.Transparent := True;
  WLabel2.Parent := WizardForm.WelcomePage;
  end;

procedure CurPageChanged(CurPageID: Integer);
begin
  begin
  if CurPageID=wpSelectDir then
  begin                                //если Свободное место на диске < требуемого, то кнопка "Установить" на PageSelectDir неактивна
  GetNeedSpaceCaption;
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled:=False
  WizardForm.NextButton.Caption:='Установить';  //Rename кнопки "Далее" на SelectDir
  end;
  end;
end;


Raf-9600 26-06-2009 22:55 1152756

Krekerpro, для WizardSmallImageFile размером 497х58.

читать дальше »
Код:

procedure InitializeWizard();
begin
with WizardForm do begin
with MainPanel do
Height := Height - 1;
with WizardSmallBitmapImage do begin
Left := 0;
Top := 0;
Height := 58; //Размер рисунка
Width := 497; //
end;
with PageNameLabel do begin
Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст
Left := Left + 497; //
end;
with PageDescriptionLabel do begin
Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст
Left := Left + 497; //
end;
end;
end;


Raf-9600 26-06-2009 23:52 1152782

BlackSelf, По-моему, ваш код не работает.
К слову: вы не могли бы написать код, чтоб в "Требуется как минимум Мб свободного дискового пространства." (на странице выбора папки) можно было указать собственное значение? И чтоб до тех пор пока не выбран винт с необходимым объемом, невозможно было нажать на кнопку "Далее".

P.S.
Деректива ExtraDiskSpaceRequired мне не подходит, ибо данные в ней, плюсуються с полученными на странице выбора компонентов. А мне нужно, чтоб просто отображались указанные мною данные о необходимом месте, на странице выбора компонентов. Но на данные, на странице выбора компонентов этот никак не влияло. Т.е. инсталлятор считал необходимые мегабайты как будто на странице выбора папки, он показывал истенное значение, а не то, которое я ему указал.

BlackSelf 27-06-2009 00:07 1152790

Raf-9600, напишите в моём скрипте слово "Code" правильно на англ. языке - всё будет работать.
В скрипте есть строчка, в кот. указывается собственное значение в мб:
Код:

  NeedSize := 6610;                  //Здесь указывается место для приложения
Также в процедуре CurPageChanged указывается, что, если Свободное место на диске меньше требуемого, то кнопка "Установить" на PageSelectDir неактивна:
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  begin
  if CurPageID=wpSelectDir then
  begin                                //если Свободное место на диске < требуемого, то кнопка "Установить" на PageSelectDir неактивна
  GetNeedSpaceCaption;
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled:=False
  WizardForm.NextButton.Caption:='Установить';  //Rename кнопки "Далее" на SelectDir
  end;
  end;
end;

Всё это есть в моём предыдущем скрипте.

Raf-9600 27-06-2009 00:30 1152804

1. В вашем скрипте не отображается страница выбора компонентов.
2. Шрифт на первой странице засвечен.
3. Строка "Доступно места на диске" мне не нужна, так как планирую ещё использовать скрипт для вывода данных о винчестерах.
4. Коды на welcome.bmp, и растянутый WizardSmallImageFile там лишние.


На всяк:
Скрипт для вывода данных о винчестерах:

читать дальше »
Код:

var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpSelectDir then ListBoxRefresh
End;

Procedure InitializeWizard;
Begin
ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
ListBox.Font.Size:= 9
ListBox.Font.Style:= []
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;
End;


BlackSelf 27-06-2009 01:02 1152825

Raf-9600, скрипт делался на примере скринов, кот. кинул Krekerpro.
Компоненты не указаны, поэтому страницы и нет.
Всё остальное учел:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
WizardSmallImageFile=small.bmp
WizardImageFile=Welcome.bmp

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

[_Сode]
var
  NeedSize:Integer;
  FreeMB, TotalMB: Cardinal;
  NeedSpaceLabel: TLabel;
  n: Integer;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;

procedure GetFreeSpaceCaption(Sender: TObject);           
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;               
begin
  if NeedSize > 1024 then
  NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
  NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';end;
 
const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

procedure InitializeWizard();
begin
  NeedSize := 66100;                  //Здесь указывается место для приложения
  WizardForm.DiskSpaceLabel.Hide;
  NeedSpaceLabel := TLabel.Create(WizardForm);
  with NeedSpaceLabel do
  begin
  Parent := WizardForm.SelectDirPage;
  Left := ScaleX(0);
  Top := ScaleY(220);
  Width := ScaleX(209);
  Height := ScaleY(13);
  end;
  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
  ListBox.Font.Size:= 9
  ListBox.Font.Style:= []
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;
  WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
  end;

procedure CurPageChanged(CurPageID: Integer);
  begin
  if CurPageID=wpSelectDir then
  begin
  GetNeedSpaceCaption;                                             
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled:=False
  ListBoxRefresh
  end;
  end;


Krekerpro 27-06-2009 15:09 1153080

Помогите соединить:
читать дальше »
[сode]
var
Image1: TBitmapImage;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel,FreeSpaceLabel,WLabel1,WLabel2: TLabel;

procedure GetFreeSpaceCaption(Sender: TObject); /////Вычисление свободного места на диске
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption; /////Вычисление требуемого места для установки
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';end;

procedure InitializeWizard();
begin
NeedSize := 6610; //Здесь указывается место для приложения
WizardForm.DiskSpaceLabel.Hide;
ExtractTemporaryFile('welcome.bmp')
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.WizardSmallBitmapImage.Left:= ScaleX(0);
WizardForm.WizardSmallBitmapImage.Width:=WizardForm.ClientWidth;
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
Image1:=TBitmapImage.Create(WizardForm)
with Image1 do begin
Left:=0
Top:=0
Width:=497
Height:=313
Parent:=WizardForm.WelcomePage
Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\welcome.bmp')
end;
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;
FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
WLabel1 := TLabel.Create(WizardForm);
WLabel1.Left := ScaleX(170);
WLabel1.Top := ScaleY(16);
WLabel1.Width := ScaleX(320);
WLabel1.Height := ScaleY(100);
WLabel1.AutoSize := False;
WLabel1.WordWrap := True;
WLabel1.Font.Size := 12;
WLabel1.Font.Style := [fsBold];
WLabel1.Font.Color:= clWhite;
WLabel1.Font.Name:= 'Tahoma';
WLabel1.ShowAccelChar := False;
WLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
WLabel1.Transparent := True;
WLabel1.Parent := WizardForm.WelcomePage;

WLabel2 :=TLabel.Create(WizardForm);
WLabel2.Top := ScaleY(76);
WLabel2.Left := ScaleX(170);
WLabel2.Width := ScaleX(300);
WLabel2.Height := ScaleY(234);
WLabel2.AutoSize := False;
WLabel2.WordWrap := True;
WLabel2.Font.Color:= clWhite;
WLabel2.ShowAccelChar := False;
WLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
WLabel2.Transparent := True;
WLabel2.Parent := WizardForm.WelcomePage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
begin
if CurPageID=wpSelectDir then
begin //если Свободное место на диске < требуемого, то кнопка "Установить" на PageSelectDir неактивна
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
WizardForm.NextButton.Caption:='Установить'; //Rename кнопки "Далее" на SelectDir
end;
end;
end;
читать дальше »
[code]
const
HALIGN_CENTER = 0;
HALIGN_LEFT = 1;
HALIGN_RIGHT = 2;

VALIGN_CENTER = 0;
VALIGN_TOP = 1;
VALIGN_BOTTOM = 2;

FIT_NONE = 0;
FIT_WIDTH = 1;
FIT_HEIGHT = 2;
FIT_BOTH = 3;

CLR_INVALID = $FFFFFFFF;

function InitGifCtrl(): Boolean; external 'initgifctrl@files:gifctrl.dll stdcall';
function UninitGifCtrl(): Boolean; external 'uninitgifctrl@files:gifctrl.dll stdcall';
function NewGifbWnd(hWndParent: HWND; X, Y, nWidth, nHeight: Integer): HWND; external 'newgifwnd@files:gifctrl.dll stdcall';
function FreeGifWnd(hWndGif: HWND): Boolean; external 'freegifwnd@files:gifctrl.dll stdcall';
function GifWndSetParent(hWndGif: HWND; hWndParent: HWND): Boolean; external 'gifwndsetparent@files:gifctrl.dll stdcall';
function GifWndSetBounds(hWndGif: HWND; X, Y, nWidth, nHeight: Integer): Boolean; external 'gifwndsetbounds@files:gifctrl.dll stdcall';
function GifWndLoadFromFile(hWndGif: HWND; HAlign, VAlign: Integer; BGColor: DWord; Fit: integer; GifFileName: PChar): Boolean; external 'gifwndloadfromfile@files:gifctrl.dll stdcall';

var
GIFHWND: HWND;

function InitializeSetup(): Boolean;
begin
InitGifCtrl();
GIFHWND := 0;
Result := True;
end;

procedure DeinitializeSetup();
begin
UninitGifCtrl();
end;

procedure LblOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExec('open', 'http://forum.ru-board.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;

procedure InitializeWizard();
var
GifFileName: String;
Lbl: TNewStaticText;
begin
ExtractTemporaryFile('www_oszone_net.gif');

GIFHWND := NewGifbWnd(WizardForm.Handle, ScaleX(30), WizardForm.Bevel.Top + ScaleY(8), 126, 31);
GifWndLoadFromFile(GIFHWND, HALIGN_CENTER, VALIGN_CENTER, CLR_INVALID, FIT_NONE, ExpandConstant('{tmp}\www_oszone_net.gif'));
Lbl := TNewStaticText.Create(WizardForm);
Lbl.Parent := WizardForm;
Lbl.AutoSize := False;
Lbl.SetBounds(ScaleX(30), WizardForm.Bevel.Top + ScaleY(8), 126, 31);
Lbl.OnClick := @LblOnClick;
Lbl.Cursor := crHand;
end;
читать дальше »
[сode]
procedure InitPBarz(wizpbhwnd,pbhwnd:THandle; pbLengt:integer);
external 'InitPBarz@files:arc.dll stdcall';

procedure StartArcExtract(freearc,params:pchar; var ReturnCode:integer);
external 'StartArcExtract@files:arc.dll stdcall';

procedure CancelExtract;
external 'CancelExtract@files:arc.dll stdcall';

procedure RepeatExtract;
external 'RepeatExtract@files:arc.dll stdcall';

procedure SuspendExtract;
external 'SuspendExtract@files:arc.dll stdcall';

procedure ResumeExtract;
external 'ResumeExtract@files:arc.dll stdcall';

procedure UpdateWizGauge;
external 'UpdateWizGauge@files:arc.dll stdcall';

procedure SkipError;
external 'SkipError@files:arc.dll stdcall';

function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';

const
MB_ICONQUESTION = $20;

var
SecondProgressBar: TNewProgressBar;

procedure InitializeWizard();
begin
SecondProgressBar := TNewProgressBar.Create(WizardForm);
with SecondProgressBar do
begin
Parent := wizardform.installingpage;
Top := 100
Width := 150;
Height := wizardform.progressgauge.height;
end;
WizardForm.ProgressGauge.Top:=ScaleY(100);
WizardForm.ProgressGauge.Width:=262;
WizardForm.ProgressGauge.Left:=155;
WizardForm.StatusLabel.Top:=ScaleY(80);
end;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
if curpage=wpInstalling then begin

Cancel:=False;
Confirm:=False;

SuspendExtract;

case MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), setupmessage(msgExitSetupMessage), setupmessage(msgExitSetupTitle), MB_YESNO or MB_defbutton2 or MB_ICONQUESTION) of

idyes: begin CancelExtract Cancel:=true end;

idno: ResumeExtract;
end
end
end;

procedure CurStepChanged(CurStep: TSetupStep);
var returnCode:integer;
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
ExtractTemporaryFile('arc.exe');
InitPBarz(wizardform.progressgauge.handle,secondprogressbar.Handle,200)
StartArcExtract(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(AddBackslash(ExpandConstant('{src}'))+'data-a.bin')+' -y -dp'+AddQuotes(ExpandConstant('{app}')), ReturnCode)

UpdateWizGauge;

end;
end;

Raf-9600 27-06-2009 16:54 1153151

BlackSelf, Спасибо, все идеально!

P.S.
Кстати, передал ваши наброски скрипта, для слайд-шоу на странице установки, в формате JPG, другому программеру, он утверждает что тщательно изучил isxbb.dll, и пришел к выводу, что через него невозможно сделать слайд-шоу в окне инсталлятора. :sorry:

Hotabich3 27-06-2009 19:08 1153250

Подскажите новичку скрипты для размещения картинки на последней странице установки и на всех остальных сверху. Зарание спс

Serega 28-06-2009 06:45 1153565

Цитата:

Цитата Krekerpro
Помогите соединить »

Подробнее
Код:

[code]
const
  MB_ICONQUESTION = $20;

  HALIGN_CENTER = 0;
  HALIGN_LEFT = 1;
  HALIGN_RIGHT = 2;

  VALIGN_CENTER = 0;
  VALIGN_TOP = 1;
  VALIGN_BOTTOM = 2;

  FIT_NONE = 0;
  FIT_WIDTH = 1;
  FIT_HEIGHT = 2;
  FIT_BOTH = 3;

  CLR_INVALID = $FFFFFFFF;

function InitGifCtrl(): Boolean; external 'initgifctrl@files:gifctrl.dll stdcall';
function UninitGifCtrl(): Boolean; external 'uninitgifctrl@files:gifctrl.dll stdcall';
function NewGifbWnd(hWndParent: HWND; X, Y, nWidth, nHeight: Integer): HWND; external 'newgifwnd@files:gifctrl.dll stdcall';
function FreeGifWnd(hWndGif: HWND): Boolean; external 'freegifwnd@files:gifctrl.dll stdcall';
function GifWndSetParent(hWndGif: HWND; hWndParent: HWND): Boolean; external 'gifwndsetparent@files:gifctrl.dll stdcall';
function GifWndSetBounds(hWndGif: HWND; X, Y, nWidth, nHeight: Integer): Boolean;
  external 'gifwndsetbounds@files:gifctrl.dll stdcall';
function GifWndLoadFromFile(hWndGif: HWND; HAlign, VAlign: Integer; BGColor: DWord; Fit: integer; GifFileName: PChar): Boolean;
  external 'gifwndloadfromfile@files:gifctrl.dll stdcall';

procedure InitPBarz(wizpbhwnd,pbhwnd:THandle; pbLengt:integer); external 'InitPBarz@files:arc.dll stdcall';
procedure StartArcExtract(freearc,params:pchar; var ReturnCode:integer);
 external 'StartArcExtract@files:arc.dll stdcall';
procedure CancelExtract; external 'CancelExtract@files:arc.dll stdcall';
procedure RepeatExtract; external 'RepeatExtract@files:arc.dll stdcall';
procedure SuspendExtract; external 'SuspendExtract@files:arc.dll stdcall';
procedure ResumeExtract; external 'ResumeExtract@files:arc.dll stdcall';
procedure UpdateWizGauge; external 'UpdateWizGauge@files:arc.dll stdcall';
procedure SkipError; external 'SkipError@files:arc.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
  external 'MessageBoxA@user32.dll stdcall';

var
  Image1: TBitmapImage;
  NeedSize:Integer;
  FreeMB, TotalMB: Cardinal;
  NeedSpaceLabel,FreeSpaceLabel,WLabel1,WLabel2: TLabel;
  GIFHWND: HWND;
  SecondProgressBar: TNewProgressBar;


procedure GetFreeSpaceCaption(Sender: TObject); /////Вычисление свободного места на диске
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB > 1024 then
  FreeSpaceLabel.Caption := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
  FreeSpaceLabel.Caption := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True;
end;

procedure GetNeedSpaceCaption; /////Вычисление требуемого места для установки
begin
  if NeedSize > 1024 then
  NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
  NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';
end;

function InitializeSetup(): Boolean;
begin
  InitGifCtrl();
  GIFHWND := 0;
  Result := True;
end;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
  if curpage=wpInstalling then begin
    Cancel:=False;
    Confirm:=False;
    SuspendExtract;
  case MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), setupmessage(msgExitSetupMessage),
      setupmessage(msgExitSetupTitle), MB_YESNO or MB_defbutton2 or MB_ICONQUESTION) of
  idyes:
      begin
        CancelExtract Cancel:=true;
      end;
  idno:
      begin
        ResumeExtract;
      end;
    end;
  end;
end;

procedure LblOnClick(Sender: TObject);
var
  ErrorCode: Integer;
begin
  ShellExec('open', 'http://forum.ru-board.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpSelectDir then begin //если Свободное место на диске < требуемого, то кнопка "Установить" на PageSelectDir неактивна
    GetNeedSpaceCaption;
    if FreeMB < NeedSize then
    WizardForm.NextButton.Enabled:=False
    WizardForm.NextButton.Caption:='Установить'; //Rename кнопки "Далее" на SelectDir
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  returnCode:integer;
begin
  if CurStep = ssInstall then begin
    WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
    ExtractTemporaryFile('arc.exe');
    InitPBarz(wizardform.progressgauge.handle,secondprogressbar.Handle,200)
    StartArcExtract(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(AddBackslash(ExpandConstant('{src}'))+'data-a.bin')+' -y -dp'+AddQuotes(ExpandConstant('{app}')), ReturnCode)
    UpdateWizGauge;
  end;
end;

procedure InitializeWizard();
var
  GifFileName: String;
  Lbl: TNewStaticText;
begin
  NeedSize := 6610; //Здесь указывается место для приложения
  WizardForm.DiskSpaceLabel.Hide;
  ExtractTemporaryFile('welcome.bmp')
  WizardForm.PageNameLabel.Hide;
  WizardForm.PageDescriptionLabel.Hide;
  WizardForm.WizardSmallBitmapImage.Left:= ScaleX(0);
  WizardForm.WizardSmallBitmapImage.Width:=WizardForm.ClientWidth;
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;

  Image1:=TBitmapImage.Create(WizardForm)
  with Image1 do begin
    Left:=0
    Top:=0
    Width:=497
    Height:=313
    Parent:=WizardForm.WelcomePage
    Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\welcome.bmp')
  end;

  NeedSpaceLabel := TLabel.Create(WizardForm);
  with NeedSpaceLabel do begin
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(0);
    Top := ScaleY(202);
    Width := ScaleX(209);
    Height := ScaleY(13);
  end;

  FreeSpaceLabel := TLabel.Create(WizardForm);
  with FreeSpaceLabel do begin
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(0);
    Top := ScaleY(220);
    Width := ScaleX(209);
    Height := ScaleY(13);
  end;

  WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;

  WLabel1 := TLabel.Create(WizardForm);
  WLabel1.Left := ScaleX(170);
  WLabel1.Top := ScaleY(16);
  WLabel1.Width := ScaleX(320);
  WLabel1.Height := ScaleY(100);
  WLabel1.AutoSize := False;
  WLabel1.WordWrap := True;
  WLabel1.Font.Size := 12;
  WLabel1.Font.Style := [fsBold];
  WLabel1.Font.Color:= clWhite;
  WLabel1.Font.Name:= 'Tahoma';
  WLabel1.ShowAccelChar := False;
  WLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WLabel1.Transparent := True;
  WLabel1.Parent := WizardForm.WelcomePage;

  WLabel2 :=TLabel.Create(WizardForm);
  WLabel2.Top := ScaleY(76);
  WLabel2.Left := ScaleX(170);
  WLabel2.Width := ScaleX(300);
  WLabel2.Height := ScaleY(234);
  WLabel2.AutoSize := False;
  WLabel2.WordWrap := True;
  WLabel2.Font.Color:= clWhite;
  WLabel2.ShowAccelChar := False;
  WLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  WLabel2.Transparent := True;
  WLabel2.Parent := WizardForm.WelcomePage;

  ExtractTemporaryFile('www_oszone_net.gif');

  GIFHWND := NewGifbWnd(WizardForm.Handle, ScaleX(30), WizardForm.Bevel.Top + ScaleY(8), 126, 31);
  GifWndLoadFromFile(GIFHWND, HALIGN_CENTER, VALIGN_CENTER, CLR_INVALID, FIT_NONE, ExpandConstant('{tmp}\www_oszone_net.gif'));
  Lbl := TNewStaticText.Create(WizardForm);
  Lbl.Parent := WizardForm;
  Lbl.AutoSize := False;
  Lbl.SetBounds(ScaleX(30), WizardForm.Bevel.Top + ScaleY(8), 126, 31);
  Lbl.OnClick := @LblOnClick;
  Lbl.Cursor := crHand;
  SecondProgressBar := TNewProgressBar.Create(WizardForm);
  with SecondProgressBar do begin
    Parent := wizardform.installingpage;
    Top := 100
    Width := 150;
    Height := wizardform.progressgauge.height;
  end;

  WizardForm.ProgressGauge.Top:=ScaleY(100);
  WizardForm.ProgressGauge.Width:=262;
  WizardForm.ProgressGauge.Left:=155;
  WizardForm.StatusLabel.Top:=ScaleY(80);
end;

procedure DeinitializeSetup();
begin
  UninitGifCtrl();
end;



Цитата:

Цитата Hotabich3
размещения картинки на последней странице установки »

Пример, пост №454.

Hotabich3 28-06-2009 14:25 1153746

Serega
а в какую строчку вставлять путь картинки?

Serega 28-06-2009 14:38 1153751

Цитата:

Цитата Hotabich3
в какую строчку вставлять путь картинки? »

В секции [Setup] добавьте:
WizardImageFile=...\путь до большой картинки
WizardSmallImageFile=...\путь до маленькой картинки

Hotabich3 28-06-2009 14:46 1153754

Serega
спс

p3rf3ct1c 28-06-2009 17:34 1153896

Искал не нашел.
Как вставить картинку сюда:
и чтобы она еще отображалась на странице установки.

И еще 1 вопрос
Как чтобы после установки в ярлыке прописалось вот это

МИШАНЧИК 28-06-2009 21:08 1154083

Подскажите пожалуйста как правильно объединить в скрипте несколько секций "Code" выложеных здесь?
Заранее спасибо!

МИШАНЧИК 28-06-2009 21:41 1154118

Serega, подскажите пожалуйста!
Использовал Ваш скрипт отсюда.
Но сохраняется наложение строчки с чекбоксом на текст расположенный выше как здесь.
Можно это как-то исправить?

Serega 28-06-2009 22:35 1154181

Цитата:

Цитата МИШАНЧИК
Можно это как-то исправить? »

сместите вниз чебокс и лейбл:
RunMyProg.Top := ScaleY(182);
и
RunLabel.Top := ScaleY(180);

МИШАНЧИК 28-06-2009 22:48 1154193

Serega, спасибо.
А не подскажите как правильно секции "Code" объединять друг с другом?
И ещё здесь Вы выложили скрипт, а что это за InnoCallback.dll, где её взять?

Serega 28-06-2009 23:33 1154235

Цитата:

Цитата МИШАНЧИК
А не подскажите как правильно секции "Code" объединять друг с другом? »

В секции кода могут быть процедуры (procedure) или функции (function), имена у них должны быть уникальные, т.е. два одинаковых имени не допускаются.
Если в какой-нибудь процедуре или функции (назовём её вызывающая функция) есть ссылка на другую процедуру или функцию (назовём её - вызываемая функция), то эта вызываемая функция должна быть расположена выше чем вызывающая функция.
Так же не надо забывать про структуру процедур и функций, т.е.:
Код:

procedure MyProc; // имя процедуры
begin // начало процедуры
  // тело процедуры, какой-то код
end; // конец процедуры

Одним словом, сколько begin в процедуре, столько должно быть и end;

Пример объединения двух процедур InitializeWizard:
Код:

procedure InitializeWizard;
var // так обозначают, что будут заданны переменные
  s: string; // задана переменная, только для этой процедуры
begin
  // код 1
end;

и вторая:
Код:

procedure InitializeWizard;
var
  i: Integer; // задана переменная, только для этой процедуры
begin
  // код 2
end;

Результат:
Код:

procedure InitializeWizard;
var
  s: string;
  i: Integer;
begin
  // код 1
  // код 2
end;

Если коротко, то вот так... :)

P.S.
Удобней всего объединять скрипты в редакторе от Restools, т.к. у него слева есть окно в котором отображаются имена всех процедур в скрипте и что самое важное, эти имена сортируются не по расположению в скрипте, а по имени, т.е. все дубликаты процедур или функций видны сразу.

МИШАНЧИК 29-06-2009 00:27 1154273

Serega, спасибо, а по поводу
Цитата:

Цитата МИШАНЧИК
InnoCallback.dll »


Serega 29-06-2009 00:48 1154284

Вложений: 1
Цитата:

Цитата МИШАНЧИК
что это за InnoCallback.dll, где её взять? »

Это дополнительная библиотека для Inno Setup, прикрепил к сообщению.

Drongo 29-06-2009 00:59 1154290

Цитата:

Цитата Serega
Это дополнительная библиотека для Inno Setup, прикрепил к сообщению. »

Да прикрепите её в шапку и все дела. :)

МИШАНЧИК 29-06-2009 01:43 1154306

Serega, Большое Вам спасибо. Буду пытаться.

p3rf3ct1c 29-06-2009 10:27 1154451

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

sanya007 29-06-2009 11:08 1154481

p3rf3ct1c,

Попробуй для ярлыка:

Код:

[Icons]
Name: {commondesktop}\xxx; Filename: {app}\xxx.exe; WorkingDir: {app}; Parameters: -nomaster -game strike


p3rf3ct1c 29-06-2009 11:27 1154500

sanya007, Спасибо помогло!

serg aka lain 29-06-2009 11:39 1154513

p3rf3ct1c,
Цитата:

Цитата p3rf3ct1c
или хотя бы помогите со вторым вопросом пожалуйста »

Код:

[Icons]
Name: "{userdesktop}\CStrike"; Filename: "{app}\hl.exe"; Parameters: "-nomaster -game cstrike"; WorkingDir: "{app}";


sanya007 29-06-2009 11:50 1154524

Serega в скрипте для распаковки FreeArc архивов через dll, есть возможность распаковывать несколько архивов.
Но возникла проблема, если эти архивы находятся на 2 DVD, как заставить распаковываться архивы со второго диска, ведь dll просканирует содержимое {src} первого диска, распакует их, и инсталятор завершит работу!
Есть какие-то соображения по этому поводу?

serg aka lain 29-06-2009 12:30 1154552

p3rf3ct1c,
А по первому вопросу можно
читать дальше »

[Setup]
AppName=test
AppVerName=test
DefaultDirName={pf}\test
outputdir=userdocs:.

[Files]
Source: "Bitmap Image.bmp"; Flags: dontcopy;
Source: "{sys}\*.dll"; DestDir: "{userdesktop}\DLL"; Flags: ignoreversion external;

[code]

var
BTMImage, BTMImage2: TBitmapImage;

procedure InitializeWizard();
begin
ExtractTemporaryFile('Bitmap Image.bmp');
BTMImage := TBitmapImage.Create(WizardForm);
BTMImage.SetBounds(0, ScaleY(59), WizardForm.Width, ScaleY(255));
BTMImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Bitmap Image.bmp'));
BTMImage.Stretch := True;
BTMImage.Parent := WizardForm.InnerPage;

BTMImage2 := TBitmapImage.Create(WizardForm);
BTMImage2.SetBounds( - ScaleX(40), - ScaleY(13), WizardForm.Width, BTMImage.Height);
BTMImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Bitmap Image.bmp'));
BTMImage2.Stretch := True;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then
begin
BTMImage2.Parent := WizardForm.SelectDirPage;
end;
if CurPageID = wpReady then
begin
BTMImage2.Parent := WizardForm.ReadyPage;
end;
if CurPageID = wpInstalling then
begin
BTMImage2.Parent := WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
DelTree(ExpandConstant('{userdesktop}\DLL'), True, True, True);
end;
, больше ни чего не придумал.

p3rf3ct1c 29-06-2009 15:43 1154730

serg aka lain, получилось, только еще надо как нибудь сделать прозрачность.

МИШАНЧИК 29-06-2009 20:44 1154961

Serega, помогите пожалуйста соединить.
А то не смотря на Вашу помощь и объяснения не получается.
Заранее большое спасибо.

serg aka lain 29-06-2009 20:54 1154967

Цитата:

Цитата p3rf3ct1c
только еще надо как нибудь сделать прозрачность. »

Это свойство есть у TLabel, следовательно, все элементы страницы нужно заменить на TLabel, ну, пожалуй, кроме TEdit, кнопок и ProgressBar.

p3rf3ct1c 29-06-2009 22:15 1155030

serg aka lain,
Можете показать где заменять пожалуйста?
Вот секция
code
Цитата:

const
HALIGN_CENTER = 0;
HALIGN_LEFT = 1;
HALIGN_RIGHT = 2;

VALIGN_CENTER = 0;
VALIGN_TOP = 1;
VALIGN_BOTTOM = 2;

FIT_NONE = 0;
FIT_WIDTH = 1;
FIT_HEIGHT = 2;
FIT_BOTH = 3;

CLR_INVALID = $FFFFFFFF;

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

// Importing UnloadSkin API from ISSkin.DLL
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

// Importing ShowWindow Windows API from User32.DLL
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

var
BmpFile: TBitmapImage;
BTMImage, BTMImage2: TBitmapImage;
bottom_img:TBitmapImage;
function InitializeSetup(): Boolean;
begin


ExtractTemporaryFile('GuiStyle.msstyles');
LoadSkin(ExpandConstant('{tmp}\GuiStyle.msstyles'), '');
Result := True;
end;
procedure DeinitializeSetup();
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();

end;

procedure LblOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin

end;
var
WLabel1, WLabel2,
FLabel1, FLabel2: TLabel;
PageNameLabel, PageDescriptionLabel: TLabel;
DesktopIcon,Dop:TCheckBox;
ResultStr: string;
ResultCode: Integer;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel,FreeSpaceLabel: TLabel;

Function MakeDesktopIcon:Boolean;
begin
Result:=DesktopIcon.Checked;
end;

Function InstallDop:Boolean;
begin
Result:=Dop.Checked;
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := 'Äîñòóïíî ìåñòà íà äèñêå: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
FreeSpaceLabel.Caption := 'Äîñòóïíî ìåñòà íà äèñêå: '+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := 'Òðåáóåòñÿ ìåñòà íà äèñêå: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
NeedSpaceLabel.Caption := 'Òðåáóåòñÿ ìåñòà íà äèñêå: '+ IntToStr(NeedSize)+ ' MB';
end;
var
ProgressBar1: TNewProgressBar;

procedure animateprogress;
begin ProgressBar1.Position := ProgressBar1.Position+1
end;
procedure InitializeWizard();
var
GifFileName: String;
Lbl: TNewStaticText;
begin

ExtractTemporaryFile('3.bmp');

ExtractTemporaryFile('1.bmp');
BTMImage := TBitmapImage.Create(WizardForm);
BTMImage.SetBounds(0, ScaleY(59), WizardForm.Width, ScaleY(255));
BTMImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
BTMImage.Stretch := True;
BTMImage.Parent := WizardForm.InnerPage;

BTMImage2 := TBitmapImage.Create(WizardForm);
BTMImage2.SetBounds( - ScaleX(40), - ScaleY(13), WizardForm.Width, BTMImage.Height);
BTMImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
BTMImage2.Stretch := True;


bottom_img:= TBitmapImage.Create(WizardForm);
bottom_img.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp'));
bottom_img.SetBounds(0, 315, 497, 45); {ïåðâûå 2 ïàðàìåòðà - êîîðäèíàòû ëåâîãîãî âåðõíåãî óãëà ïî ãîðèçîíòàëè è âåðòèêàëè, äàëüøå øèðèíà è âûñîòà, äî êîòîðîé ðàñòÿíóòü}
bottom_img.Parent:= WizardForm;
bottom_img.Stretch:= True;


begin
ProgressBar1 := TNewProgressBar.Create(wizardform);
with ProgressBar1 do
end;
begin
WizardForm.Caption:='Ïðîãðàììà óñòàíîâêè èãðû "Overlord II"';
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedHeadingLabel.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.WizardBitmapImage.Width := 497;
WizardForm.WizardBitmapImage.Height := 313;
WizardForm.WizardSmallBitmapImage.Left:=0;
WizardForm.WizardSmallBitmapImage.Width:=497;
WizardForm.WizardSmallBitmapImage.Height:=58;
WizardForm.PageDescriptionLabel.Width:=300;
WizardForm.PageNameLabel.Width:=300;
WizardForm.FileNameLabel.Visible:=False;
WizardForm.ProgressGauge.Top:=ScaleY(100);
WizardForm.StatusLabel.Top:=ScaleY(80);
WLabel1 := TLabel.Create(WizardForm);
WLabel1.Left := ScaleX(176);
WLabel1.Top := ScaleY(16);
WLabel1.Width := ScaleX(301);
WLabel1.Height := ScaleY(54);
WLabel1.AutoSize := False;
WLabel1.WordWrap := True;
WLabel1.Font.Size := 11;
WLabel1.Font.Style := [fsBold];
WLabel1.Font.Color:= clwhite;

WLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
WLabel1.Transparent := True;
WLabel1.Parent := WizardForm.WelcomePage;
WLabel2 :=TLabel.Create(WizardForm);
WLabel2.Top := ScaleY(76);
WLabel2.Left := ScaleX(176);
WLabel2.Width := ScaleX(301);
WLabel2.Height := ScaleY(234);
WLabel2.AutoSize := False;
WLabel2.WordWrap := True;
WLabel2.Font.Color:= clWhite;

WLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
WLabel2.Transparent := True;
WLabel2.Parent := WizardForm.WelcomePage;
WizardForm.WizardBitmapImage2.Width := 497;
WizardForm.WizardBitmapImage2.Height := 313;
FLabel1 := TLabel.Create(WizardForm);
FLabel1.Left := ScaleX(176);
FLabel1.Top := ScaleY(16);
FLabel1.Width := ScaleX(301);
FLabel1.Height := ScaleY(54);
FLabel1.AutoSize := False;
FLabel1.WordWrap := True;
FLabel1.Font.Size := 11;
FLabel1.Font.Style := [fsBold];
FLabel1.Font.Color:= clWhite;

FLabel1.Caption := WizardForm.FinishedHeadingLabel.Caption;
FLabel1.Transparent := True;
FLabel1.Parent := WizardForm.FinishedPage;
FLabel2 :=TLabel.Create(WizardForm);
FLabel2.Top := ScaleY(76);
FLabel2.Left := ScaleX(176);
FLabel2.Width := ScaleX(301);
FLabel2.Height := ScaleY(53);
FLabel2.AutoSize := False;
FLabel2.WordWrap := True;
FLabel2.Font.Color:= clWhite;

FLabel2.Caption := '' #13#13
'';
FLabel2.Transparent := True;
FLabel2.Parent := WizardForm.FinishedPage;
begin
PageNameLabel := TLabel.Create(WizardForm);
with PageNameLabel do
begin
Left := ScaleX(10);
Top := ScaleY(10);
Width := ScaleX(300);
Height := ScaleY(14);
AutoSize := False;
WordWrap := True;
Font.Color := clblack;
Font.Style := [fsBold];
Transparent := True;
Parent := WizardForm.MainPanel;
end;

PageDescriptionLabel := TLabel.Create(WizardForm);
with PageDescriptionLabel do
begin
Left := ScaleX(15);
Top := ScaleY(25);
Width := ScaleX(400);
Height := ScaleY(30);
AutoSize := False;
WordWrap := True;
Font.Color := clblack;
Transparent := True;
Parent := WizardForm.MainPanel;
end;

with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left := ScaleX(0);
Top := ScaleY(0);
Width := Mainpanel.Width;
Height := MainPanel.Height;
end;
end;
end;
end;
begin
DesktopIcon:=TCheckBox.Create(WizardForm);
with DesktopIcon do
begin
Parent:=WizardForm.SelectDirPage;
Caption:='Äîáàâèòü ÿðëûê íà ðàáî÷èé ñòîë'
Left:=ScaleX(0);
Top := WizardForm.DirEdit.Top+35;
Width := ScaleX(400);
Height := ScaleY(15);
TabOrder := 0;
Checked := True
end;
end;
begin
dop := TCheckBox.Create(WizardForm);
with Dop do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Óñòàíîâèòü PunkBuster (àíòè-÷èò äëÿ èãðû ïî èíòåðíåòó)';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top+55;
Width := ScaleX(400);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;
begin
NeedSize :=3800;
WizardForm.DiskSpaceLabel.Hide;
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;
FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin

begin
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
end;
begin
if CurPageID=wpSelectDir then
begin
WizardForm.NextButton.Caption:='Óñòàíîâèòü';
BTMImage2.Parent := WizardForm.SelectDirPage;
end;
if CurPageID = wpReady then
begin
BTMImage2.Parent := WizardForm.ReadyPage;
end;
if CurPageID = wpInstalling then
begin
BTMImage2.Parent := WizardForm.InstallingPage;
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
end;end;end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
DelTree(ExpandConstant('{userdesktop}\DLL'), True, True, True);
end;

serg aka lain 29-06-2009 22:47 1155055

Вложений: 1
МИШАНЧИК,
Цитата:

Цитата МИШАНЧИК
не получается. »


serg aka lain 29-06-2009 23:42 1155094

p3rf3ct1c,
Цитата:

Цитата p3rf3ct1c
Можете показать где заменять пожалуйста? »

Ну так примерно себе представляю ->
читать дальше »


[Setup]
AppName=test
AppVerName=test
DefaultDirName={pf}\test
DisableReadyPage=True
outputdir=userdocs:.

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

[Files]
Source: "Bitmap Image.bmp"; Flags: dontcopy;
Source: "{sys}\*.dll"; DestDir: "{userdesktop}\DLL"; Flags: ignoreversion external;

[code]

var
BTMImage, BTMImage2: TBitmapImage;
SelectDirLabel, SelectDirBrowseLabel, AddIconLabel: TLabel;
AddIcon: TCheckBox;

procedure InitializeWizard();
begin
ExtractTemporaryFile('Bitmap Image.bmp');

WizardForm.DiskSpaceLabel.Hide;
WizardForm.SelectDirLabel.Hide;
WizardForm.SelectDirBrowseLabel.Hide;

BTMImage := TBitmapImage.Create(WizardForm);
BTMImage.SetBounds(0, ScaleY(59), WizardForm.Width, ScaleY(255));
BTMImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Bitmap Image.bmp'));
BTMImage.Stretch := True;
BTMImage.Parent := WizardForm.InnerPage;

BTMImage2 := TBitmapImage.Create(WizardForm);
BTMImage2.SetBounds( - ScaleX(40), - ScaleY(13), WizardForm.Width, BTMImage.Height);
BTMImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Bitmap Image.bmp'));
BTMImage2.Stretch := True;

SelectDirLabel := TLabel.Create(WizardForm);
SelectDirLabel.SetBounds(0, WizardForm.SelectDirLabel.Top, WizardForm.SelectDirLabel.Width, WizardForm.SelectDirLabel.Height);
SelectDirLabel.AutoSize := False;
SelectDirLabel.WordWrap := True;
SelectDirLabel.Font.Color:= clWhite;
SelectDirLabel.Caption := WizardForm.SelectDirLabel.Caption;
SelectDirLabel.ShowAccelChar := False;

SelectDirBrowseLabel := TLabel.Create(WizardForm);
SelectDirBrowseLabel.SetBounds(WizardForm.SelectDirBrowseLabel.Left, WizardForm.SelectDirBrowseLabel.Top, WizardForm.SelectDirBrowseLabel.Width, WizardForm.SelectDirBrowseLabel.Height);
SelectDirBrowseLabel.AutoSize := False;
SelectDirBrowseLabel.WordWrap := True;
SelectDirBrowseLabel.Font.Color:= clWhite;
SelectDirBrowseLabel.Caption := WizardForm.SelectDirBrowseLabel.Caption;
SelectDirBrowseLabel.ShowAccelChar := False;

AddIcon := TCheckBox.Create(WizardForm);
AddIcon.Top := WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(15);
AddIcon.Width := ScaleX(14);

AddIconLabel := TLabel.Create(WizardForm);
AddIconLabel.SetBounds(AddIcon.Left + AddIcon.Width + ScaleX(5), AddIcon.Top + ScaleY(2), ScaleX(200), ScaleY(14));
AddIconLabel.AutoSize := False;
AddIconLabel.WordWrap := True;
AddIconLabel.Font.Color:= clWhite;
AddIconLabel.Caption := 'Добавить ярлык на рабочий стол';
AddIconLabel.ShowAccelChar := False;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then
begin
BTMImage2.Parent := WizardForm.SelectDirPage;
SelectDirLabel.Parent := WizardForm.SelectDirPage;
SelectDirBrowseLabel.Parent := WizardForm.SelectDirPage;
AddIcon.Parent := WizardForm.SelectDirPage;
AddIconLabel.Parent := WizardForm.SelectDirPage;

if ActiveLanguage = 'russian' then
WizardForm.NextButton.Caption := 'Установить'
else
WizardForm.NextButton.Caption := 'Install';
end;

if CurPageID = wpInstalling then
begin
BTMImage2.Parent := WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
if AddIcon.Checked then
CreateShellLink(ExpandConstant('{userdesktop}\Блокнот.lnk'), '',
ExpandConstant('{win}\notepad.exe'), '', ExpandConstant('{win}'), '', 0, SW_SHOWNORMAL);
DelTree(ExpandConstant('{userdesktop}\DLL'), True, True, True);
end;
end;


p3rf3ct1c 29-06-2009 23:59 1155112

serg aka lain, вставил себе это в код, пишет Unknown identifier 'SelectDirLabel'

serg aka lain 30-06-2009 00:29 1155128

p3rf3ct1c,
Цитата:

Цитата p3rf3ct1c
пишет Unknown identifier 'SelectDirLabel' »

переменные
var
SelectDirLabel, SelectDirBrowseLabel, AddIconLabel: TLabel;
AddIcon: TCheckBox;
нужно объявить глобально

Код:

[Setup]
AppName=test
AppVerName=test
DefaultDirName={pf}\test
DisableReadyPage=True
outputdir=userdocs:.

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

[Files]
Source: "Bitmap Image.bmp"; Flags: dontcopy;
Source: "{sys}\*.dll"; DestDir: "{userdesktop}\DLL"; Flags: ignoreversion external;

секция Коде:
{ походу в юникод-версиях inno, свойство Transparent у TLabel установлено по умолчанию,
  в Ansi версиях (обычных) нужно его указавать, типа SelectDirLabel.Transparent := True; }

const
  NeedSize = 4751;

var
  BTMImage, BTMImage2: TBitmapImage;
  SelectDirLabel, SelectDirBrowseLabel, AddIconLabel,
  NeedSpaceLabel, FreeSpaceLabel, StatusLabel: TLabel;
  AddIcon: TCheckBox;
  FreeMB, TotalMB: Cardinal;

procedure GetFreeSpaceCaption(Sender: TObject);
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB > 1024 then
    FreeSpaceLabel.Caption := Format('Доступно места на диске  %.2f GB', [FreeMB/1024.0] ) else
  FreeSpaceLabel.Caption := 'Доступно места на диске  ' + IntToStr(FreeMB) + ' MB';
  begin
    if FreeMB < NeedSize then
    begin
      WizardForm.NextButton.Enabled := False;
    end else
      WizardForm.NextButton.Enabled := True;
  end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('Bitmap Image.bmp');

  WizardForm.DiskSpaceLabel.Hide;
  WizardForm.SelectDirLabel.Hide;
  WizardForm.SelectDirBrowseLabel.Hide;
  WizardForm.StatusLabel.Hide;
  WizardForm.FilenameLabel.Hide;

  BTMImage := TBitmapImage.Create(WizardForm);
  BTMImage.SetBounds(0, ScaleY(59), WizardForm.Width, ScaleY(253));
  BTMImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Bitmap Image.bmp'));
  BTMImage.Stretch := True;
  BTMImage.Parent := WizardForm.InnerPage;

  BTMImage2 := TBitmapImage.Create(WizardForm);
  BTMImage2.SetBounds( - ScaleX(40), - ScaleY(13), WizardForm.Width, BTMImage.Height);
  BTMImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Bitmap Image.bmp'));
  BTMImage2.Stretch := True;

  SelectDirLabel := TLabel.Create(WizardForm);
  SelectDirLabel.SetBounds(0, WizardForm.SelectDirLabel.Top, WizardForm.SelectDirLabel.Width, WizardForm.SelectDirLabel.Height);
  SelectDirLabel.AutoSize := False;
  SelectDirLabel.WordWrap := True;
  SelectDirLabel.Font.Color:= clWhite;
  SelectDirLabel.Caption := WizardForm.SelectDirLabel.Caption;
  SelectDirLabel.ShowAccelChar := False;

  SelectDirBrowseLabel := TLabel.Create(WizardForm);
  SelectDirBrowseLabel.SetBounds(WizardForm.SelectDirBrowseLabel.Left, WizardForm.SelectDirBrowseLabel.Top, WizardForm.SelectDirBrowseLabel.Width, WizardForm.SelectDirBrowseLabel.Height);
  SelectDirBrowseLabel.AutoSize := False;
  SelectDirBrowseLabel.WordWrap := True;
  SelectDirBrowseLabel.Font.Color:= clWhite;
  SelectDirBrowseLabel.Caption := WizardForm.SelectDirBrowseLabel.Caption;
  SelectDirBrowseLabel.ShowAccelChar := False;

  AddIcon := TCheckBox.Create(WizardForm);
  AddIcon.Top := WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(15);
  AddIcon.Width := ScaleX(14);

  AddIconLabel := TLabel.Create(WizardForm);
  AddIconLabel.SetBounds(AddIcon.Left + AddIcon.Width + ScaleX(5), AddIcon.Top + ScaleY(2), ScaleX(200), ScaleY(14));
  AddIconLabel.AutoSize := False;
  AddIconLabel.WordWrap := True;
  AddIconLabel.Font.Color:= clWhite;
  AddIconLabel.Caption := 'Добавить ярлык на рабочий стол';
  AddIconLabel.ShowAccelChar := False;

  NeedSpaceLabel := TLabel.Create(WizardForm);
  NeedSpaceLabel.SetBounds(0, ScaleY(198), ScaleX(209), ScaleY(14));
  NeedSpaceLabel.Caption := 'Требуется места на диске  4.6 GB';
  NeedSpaceLabel.Font.Color := clWhite;

  FreeSpaceLabel := TLabel.Create(WizardForm);
  FreeSpaceLabel.SetBounds(0, ScaleY(216), ScaleX(209), ScaleY(14));
  FreeSpaceLabel.Font.Color := clWhite;

  StatusLabel := TLabel.Create(WizardForm);
  StatusLabel.SetBounds(WizardForm.FilenameLabel.Left, WizardForm.FilenameLabel.Top, WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
  StatusLabel.AutoSize := False;
  StatusLabel.WordWrap := True;
  StatusLabel.Font.Color:= clWhite;
  StatusLabel.ShowAccelChar := False;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then
  begin
    BTMImage2.Parent := WizardForm.SelectDirPage;
    SelectDirLabel.Parent := WizardForm.SelectDirPage;
    SelectDirBrowseLabel.Parent := WizardForm.SelectDirPage;
    AddIcon.Parent := WizardForm.SelectDirPage;
    AddIconLabel.Parent := WizardForm.SelectDirPage;
    NeedSpaceLabel.Parent := WizardForm.SelectDirPage;
    FreeSpaceLabel.Parent := WizardForm.SelectDirPage;

    if ActiveLanguage = 'russian' then
      WizardForm.NextButton.Caption := 'Установить'
    else
      WizardForm.NextButton.Caption := 'Install';

    WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
    WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;

    if FreeMB < NeedSize then
      WizardForm.NextButton.Enabled := False;
  end;

  if CurPageID = wpInstalling then
  begin
    BTMImage2.Parent := WizardForm.InstallingPage;
    StatusLabel.Parent := WizardForm.InstallingPage;

    if ActiveLanguage = 'russian' then
      StatusLabel.Caption := 'Распаковка файлов...' else
    StatusLabel.Caption := 'Extracting files...';
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    if AddIcon.Checked then
      CreateShellLink(ExpandConstant('{userdesktop}\Блокнот.lnk'), '',
      ExpandConstant('{win}\notepad.exe'), '', ExpandConstant('{win}'), '', 0, SW_SHOWNORMAL);
    DelTree(ExpandConstant('{userdesktop}\DLL'), True, True, True);
  end;
end;


Berline 30-06-2009 09:18 1155232

Может уже было:
А реально сделать на старнице выбора компонентов, чтоб это было не просто дерево, а раскрывающийся по +- список? Развернул группу элементов, отметил галочками, свернул и дальше пошел, а то если много опциональних элементов - там сочинение на странице листать надобно

Serega 30-06-2009 10:37 1155283

Цитата:

Цитата sanya007
Есть какие-то соображения по этому поводу? »

нет.
Цитата:

Цитата Berline
на старнице выбора компонентов, чтоб это было не просто дерево, а раскрывающийся по +- список? »

Для этого вам придётся использовать расширенную версию Inno Setup от Restools.
В секции [Setup] добавьте:
ComponentsListTVStyle=true

p3rf3ct1c 30-06-2009 11:53 1155338

serg aka lain, что то я ничего не понимаю что и куда надо вставлять и менять, мб есть другой способ сделать прозрачность?

МИШАНЧИК 30-06-2009 12:38 1155376

serg aka lain, большое спасибо за скрипт.

Serega 30-06-2009 17:59 1155654

Вложений: 2
Цитата:

Цитата user_123
ссылку на закачку файла istool-ru.lng »

Прикрепил к сообщению.

user_123 30-06-2009 18:05 1155663

Serega, спасибо.

-- Добавлено --

У меня Inno Script Generator "не видит" русификацию (в списке языков нет русского языка). Файл я извлёк в папку languages. Перезапускать Script Generator пробовал, устанавливать заново тоже... У меня версия 1.0.3.1. Операционная система: Win Vista Sp1 x32.

Serega 30-06-2009 21:41 1155862

Цитата:

Цитата user_123
У меня Inno Script Generator "не видит" русификацию (в списке языков нет русского языка). »

Это глюк Inno Script Generator. В каталоге с праграммой найдите файл Setting.isg, откройте его в текстовом редакторе.
Найдите секцию [Language] и запишите так:
Код:

[Language]
Last=6
0=1049

Цитата:

Цитата Tukash
вылазиет ошибка Syntax error... »

Попробуйте проверить в этой строке буквы схожие с русскими, у меня подозрение, что какая-то буква "с" в этой строке написана по-русски.

Tukash 30-06-2009 21:44 1155864

Serega
спасибо я уже разобрался!
причины бли таковы:
1. невставил #define TIME_FOR_VIEW 1 в начале думал там нету ничего))
2. нужен был inno setup с precompressor'ом!
и все!

Tukash 30-06-2009 22:14 1155891

люди добрые пытаюсь изменить шрифт но он не меняеться, увеличиваеться только размер окна)))
[LangOptions]
LanguageName=Russian
LanguageID=$0419
LanguageCodePage=1251
DialogFontName=Trebuchet MS
DialogFontSize=15
WelcomeFontName=Segoe Script
WelcomeFontSize=20
TitleFontName=Segoe Script
TitleFontSize=10
CopyrightFontName=Segoe Print
CopyrightFontSize=10
может кто-нибудь даст нормальные???кстате могу хоть 100 написать не измениться)))

и еще кто подскажет как изминить размер окна исталятора я хочу поменьше?!

Serega 30-06-2009 22:30 1155905

Цитата:

Цитата Tukash
пытаюсь изменить шрифт но он не меняеться, увеличиваеться только размер окна))) »

вы не правильно меняете, запишите в скрипте так:
Код:

procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Font.Size:= 15;
end;

и так для каждого Label'a...

Tukash 30-06-2009 22:32 1155906

Serega
спасибо, а как-нибудь можно размер инсталятора изменить?

Serega 30-06-2009 22:47 1155926

Цитата:

Цитата Tukash
а как-нибудь можно размер инсталятора изменить? »

Код:

  WizardForm.ClientHeight:= 360;
  WizardForm.ClientWidth:= 498;


Tukash 30-06-2009 23:52 1155973

Serega
что-то нефига не выходит, я это в [code] вношу или не туда? и можно целиком а то begin и end бесят...
Код:

procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Font.Size:= 15;
end;

это тоже в [code]? заранее спасибо! :) сори за нубство :bow:

Serega 01-07-2009 00:07 1155981

Цитата:

Цитата Tukash
нефига не выходит »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[code]
procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Font.Size:= 15;
  WizardForm.WelcomeLabel2.Font.Size:= 15;
end;


Tukash 01-07-2009 00:08 1155984

Serega
огромное спасибо!!!!

Tukash 01-07-2009 11:08 1156222

еще вопрос назрел) я наверно надоел!
как сделать что-бы показывало сколько места свободно на HDD! заранее спасибо!
вот покажите пожалуйста что надо здесь исправить что-бы убрать как убрать это?

Код:

type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  1{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp')) end;
  2{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp')) end;
  3{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\4.bmp')) end;
  4{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\5.bmp')) end;
  5{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\6.bmp')) end;
  6{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\7.bmp')) end;
  7{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\8.bmp')) end;
  8{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp')) end;
  end;
  if CurrTime = 2*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin
    if RunMyProg.Checked then
    ///Exec(ExpandConstant('{app}\MyProg.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('1.bmp')
  ExtractTemporaryFile('2.bmp')
  ExtractTemporaryFile('3.bmp')
  ExtractTemporaryFile('4.bmp')
  ExtractTemporaryFile('5.bmp')
  ExtractTemporaryFile('6.bmp')
  ExtractTemporaryFile('7.bmp')
  ExtractTemporaryFile('8.bmp')
  ExtractTemporaryFile('9.bmp')

  currTime := 0;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(150);
  WelcomeLabel1.Top := ScaleY(15);
  WelcomeLabel1.Width := ScaleX(320);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clBlack;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 25;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel2:=TLabel.Create(WizardForm);

  WelcomeLabel2.Left := ScaleX(150);
  WelcomeLabel2.Top := ScaleY(90);
  WelcomeLabel2.Width := ScaleX(320);
  WelcomeLabel2.Height := ScaleY(200);
  WelcomeLabel2.AutoSize := False;
  WelcomeLabel2.WordWrap := True;
  WelcomeLabel2.Font.Color := clred;
  WelcomeLabel2.Font.Size := 12;
  WelcomeLabel2.Transparent := True;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clRed;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;


      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clBlack;
      PageDescriptionLabel.Transparent := True;


  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(150);
  FinishedHeadingLabel.Top := ScaleY(15);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clRED;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
  FinishedHeadingLabel.Font.Name:='Segoe UI';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;


      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(150);
      FinishedLabel.Top := ScaleY(90);
      FinishedLabel.Width := ScaleX(320);
      FinishedLabel.Height := ScaleY(200);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clBlack;
      FinishedLabel.Font.Size := 12;
      FinishedLabel.Transparent := True;


  RunMyProg := TCheckBox.Create(WizardForm);
  RunMyProg.Parent := WizardForm.FinishedPage;
  RunMyProg.Left := ScaleX(150);
  RunMyProg.Top := ScaleY(152);
  RunMyProg.Width := ScaleX(14);
  RunMyProg.Height := ScaleX(14);
//  RunMyProg.Checked := true; // чтоб чебокс был отмечен, раскоментируй строку

      RunLabel:=TLabel.Create(WizardForm);
      RunLabel.Left := ScaleX(170);
      RunLabel.Top := ScaleY(150);
      RunLabel.Width := ScaleX(200);
      RunLabel.Height := ScaleY(20);
      RunLabel.AutoSize := False;
      RunLabel.WordWrap := True;
      RunLabel.Font.Color := clBlack;
      RunLabel.Font.Size := 10;
      RunLabel.OnClick := @RLabelOnClick;
      RunLabel.Transparent := True;
      RunLabel.Parent := WizardForm.FinishedPage;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  //RunLabel.Caption := 'Запустить программу';

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;


p3rf3ct1c 01-07-2009 12:16 1156272

Цитата:

Цитата Tukash
вот покажите пожалуйста что надо здесь исправить что-бы убрать как убрать это? »

Попробуйте вот так:
код
Код:

type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  1{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp')) end;
  2{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp')) end;
  3{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\4.bmp')) end;
  4{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\5.bmp')) end;
  5{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\6.bmp')) end;
  6{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\7.bmp')) end;
  7{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\8.bmp')) end;
  8{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp')) end;
  end;
  if CurrTime = 2*{#TIME_FOR_VIEW} then CurrTime := -1;
end;



procedure InitializeWizard();
begin
  ExtractTemporaryFile('1.bmp')
  ExtractTemporaryFile('2.bmp')
  ExtractTemporaryFile('3.bmp')
  ExtractTemporaryFile('4.bmp')
  ExtractTemporaryFile('5.bmp')
  ExtractTemporaryFile('6.bmp')
  ExtractTemporaryFile('7.bmp')
  ExtractTemporaryFile('8.bmp')
  ExtractTemporaryFile('9.bmp')

  currTime := 0;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(150);
  WelcomeLabel1.Top := ScaleY(15);
  WelcomeLabel1.Width := ScaleX(320);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clBlack;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 25;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel2:=TLabel.Create(WizardForm);

  WelcomeLabel2.Left := ScaleX(150);
  WelcomeLabel2.Top := ScaleY(90);
  WelcomeLabel2.Width := ScaleX(320);
  WelcomeLabel2.Height := ScaleY(200);
  WelcomeLabel2.AutoSize := False;
  WelcomeLabel2.WordWrap := True;
  WelcomeLabel2.Font.Color := clred;
  WelcomeLabel2.Font.Size := 12;
  WelcomeLabel2.Transparent := True;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clRed;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;


      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clBlack;
      PageDescriptionLabel.Transparent := True;


  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(150);
  FinishedHeadingLabel.Top := ScaleY(15);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clRED;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
  FinishedHeadingLabel.Font.Name:='Segoe UI';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;


      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(150);
      FinishedLabel.Top := ScaleY(90);
      FinishedLabel.Width := ScaleX(320);
      FinishedLabel.Height := ScaleY(200);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clBlack;
      FinishedLabel.Font.Size := 12;
      FinishedLabel.Transparent := True;




procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  //RunLabel.Caption := 'Запустить программу';

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;


Tukash 01-07-2009 12:20 1156275

p3rf3ct1c
сплошные ошибки пошли... но сейчас пошаманю

p3rf3ct1c 01-07-2009 12:42 1156297

Tukash,
Извиняюсь, а если вот так:
код
Код:

type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  1{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp')) end;
  2{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp')) end;
  3{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\4.bmp')) end;
  4{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\5.bmp')) end;
  5{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\6.bmp')) end;
  6{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\7.bmp')) end;
  7{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\8.bmp')) end;
  8{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp')) end;
  end;
  if CurrTime = 2*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin

  end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('1.bmp')
  ExtractTemporaryFile('2.bmp')
  ExtractTemporaryFile('3.bmp')
  ExtractTemporaryFile('4.bmp')
  ExtractTemporaryFile('5.bmp')
  ExtractTemporaryFile('6.bmp')
  ExtractTemporaryFile('7.bmp')
  ExtractTemporaryFile('8.bmp')
  ExtractTemporaryFile('9.bmp')

  currTime := 0;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(150);
  WelcomeLabel1.Top := ScaleY(15);
  WelcomeLabel1.Width := ScaleX(320);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clBlack;
// здесь можно поиграть шрифтом
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 25;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel2:=TLabel.Create(WizardForm);

  WelcomeLabel2.Left := ScaleX(150);
  WelcomeLabel2.Top := ScaleY(90);
  WelcomeLabel2.Width := ScaleX(320);
  WelcomeLabel2.Height := ScaleY(200);
  WelcomeLabel2.AutoSize := False;
  WelcomeLabel2.WordWrap := True;
  WelcomeLabel2.Font.Color := clred;
  WelcomeLabel2.Font.Size := 12;
  WelcomeLabel2.Transparent := True;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clRed;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;


      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clBlack;
      PageDescriptionLabel.Transparent := True;


  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(150);
  FinishedHeadingLabel.Top := ScaleY(15);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clRED;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
  FinishedHeadingLabel.Font.Name:='Segoe UI';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;


      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(150);
      FinishedLabel.Top := ScaleY(90);
      FinishedLabel.Width := ScaleX(320);
      FinishedLabel.Height := ScaleY(200);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clBlack;
      FinishedLabel.Font.Size := 12;
      FinishedLabel.Transparent := True;



end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  //RunLabel.Caption := 'Запустить программу';

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;


Ну а если все равно не получится, то больше не знаю как.

Tukash 01-07-2009 12:51 1156305

p3rf3ct1c
спасибо, теперь все хорошо!

p3rf3ct1c 01-07-2009 13:12 1156325

Tukash,
Чтобы еще показывало сколько места свободно на HDD, то вот:
код
Код:

type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;
  NeedSize:Integer;
  FreeMB, TotalMB: Cardinal;
  NeedSpaceLabel,FreeSpaceLabel: TLabel;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  1{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp')) end;
  2{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp')) end;
  3{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\4.bmp')) end;
  4{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\5.bmp')) end;
  5{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\6.bmp')) end;
  6{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\7.bmp')) end;
  7{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\8.bmp')) end;
  8{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp')) end;
  end;
  if CurrTime = 2*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB > 1024 then
  FreeSpaceLabel.Caption := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
  FreeSpaceLabel.Caption := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
  if NeedSize > 1024 then
  NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
  NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// ôóíêöèÿ äëÿ çàïóñêà ïðîãðàììû åñëè îòìå÷åí ÷åáîêñ
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin

  end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('1.bmp')
  ExtractTemporaryFile('2.bmp')
  ExtractTemporaryFile('3.bmp')
  ExtractTemporaryFile('4.bmp')
  ExtractTemporaryFile('5.bmp')
  ExtractTemporaryFile('6.bmp')
  ExtractTemporaryFile('7.bmp')
  ExtractTemporaryFile('8.bmp')
  ExtractTemporaryFile('9.bmp')

  currTime := 0;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // íèçíàþ ïî÷åìó, íî Hide íå äåéñòâóåò. Ïîýòîìó ïðîñòî óìåíüøèë ðàçìåð
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(150);
  WelcomeLabel1.Top := ScaleY(15);
  WelcomeLabel1.Width := ScaleX(320);
  WelcomeLabel1.Height := ScaleY(75);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := True;
  WelcomeLabel1.Font.Color := clBlack;
// çäåñü ìîæíî ïîèãðàòü øðèôòîì
//  WelcomeLabel1.Font.Style := [fsBold];
//  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 25;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel2:=TLabel.Create(WizardForm);

  WelcomeLabel2.Left := ScaleX(150);
  WelcomeLabel2.Top := ScaleY(90);
  WelcomeLabel2.Width := ScaleX(320);
  WelcomeLabel2.Height := ScaleY(200);
  WelcomeLabel2.AutoSize := False;
  WelcomeLabel2.WordWrap := True;
  WelcomeLabel2.Font.Color := clred;
  WelcomeLabel2.Font.Size := 12;
  WelcomeLabel2.Transparent := True;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clRed;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;


      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clBlack;
      PageDescriptionLabel.Transparent := True;


  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left := ScaleX(150);
  FinishedHeadingLabel.Top := ScaleY(15);
  FinishedHeadingLabel.Width := ScaleX(320);
  FinishedHeadingLabel.Height := ScaleY(75);
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clRED;
// çäåñü òîæå ìîæíî ïîèãðàòü øðèôòîì
//  FinishedHeadingLabel.Font.Style := [fsBold];
  FinishedHeadingLabel.Font.Name:='Segoe UI';
  FinishedHeadingLabel.Font.Size := 14;
  FinishedHeadingLabel.Transparent := True;


      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(150);
      FinishedLabel.Top := ScaleY(90);
      FinishedLabel.Width := ScaleX(320);
      FinishedLabel.Height := ScaleY(200);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clBlack;
      FinishedLabel.Font.Size := 12;
      FinishedLabel.Transparent := True;

 begin
  NeedSize :=3800;
  WizardForm.DiskSpaceLabel.Hide;
  NeedSpaceLabel := TLabel.Create(WizardForm);
  with NeedSpaceLabel do
  begin
  Parent := WizardForm.SelectDirPage;
  Left := ScaleX(0);
  Top := ScaleY(202);
  Width := ScaleX(209);
  Height := ScaleY(13);
  end;
  FreeSpaceLabel := TLabel.Create(WizardForm);
  with FreeSpaceLabel do
  begin
  Parent := WizardForm.SelectDirPage;
  Left := ScaleX(0);
  Top := ScaleY(220);
  Width := ScaleX(209);
  Height := ScaleY(13);
  end;
  WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;

end;


procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  if CurPageID=wpSelectDir then begin
  WizardForm.NextButton.Caption:='Далее >';
  GetNeedSpaceCaption;
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled:=False
end;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// çäåñü ïðèä¸òñÿ âðó÷íóþ ââîäèòü òðåáóåìûé òåêñò
  //RunLabel.Caption := 'Çàïóñòèòü ïðîãðàììó';

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;
end;
procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;


Tukash 01-07-2009 13:14 1156328

p3rf3ct1c
вообще спасибо)) спасибо что совместил!

R.i.m.s.k.y. 01-07-2009 14:12 1156398

Serega

Доброе время суток!

Спасибо за подсказку с функцией RegBackup, но вот что делать с procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep)?
Как она работает я приблизительно догадываюсь, но видимо она не отрабатывает - не восстанавливает файлы из папки сохранения.

Если Вас не затруднит, подскажите, пожалуйста в чем ошибка

читать дальше »


Код:


[Files]

Source: RimPack\Program Files\RimPack\Uninstall\*; DestDir: {win}\$UninstallRimPack$\; AfterInstall: BackupReg; Flags: ignoreversion recursesubdirs createallsubdirs uninsrestartdelete setntfscompression


[_Code]

procedure BackupReg();

var
res: Integer;
BackupDir, Key, RegEdit: string;

begin
RegEdit:= ExpandConstant('{win}\regedit.exe');
BackupDir:= ExpandConstant('{win}\$UninstallRimPack$\');

Key:= 'HKEY_LOCAL_MACHINE\SOFTWARE\GNU';
Exec(RegEdit, ' -ea 00.reg ' + AddQuotes(Key), BackupDir, SW_HIDE, ewWaitUntilTerminated, Res);

Key:= 'HKEY_CURRENT_USER\SOFTWARE\GNU';
Exec(RegEdit, ' -ea 01.reg ' + AddQuotes(Key), BackupDir, SW_HIDE, ewWaitUntilTerminated, Res);

end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);

var
reg,RegEdit: string;
res: integer;

begin
if CurUninstallStep = usUninstall then begin

reg:= ExpandConstant('{win}\$UninstallRimPack$\00.reg');
if FileExists(reg) = True then
Exec('regedit.exe',' /s ' + AddQuotes(reg),ExpandConstant('{win}'),SW_HIDE,ewWaitUntilTerminated,res);

reg:= ExpandConstant('{win}\$UninstallRimPack$\01.reg');
if FileExists(reg) = True then
Exec(RegEdit, ' import ' + AddQuotes(reg),ExpandConstant('{win}'),SW_HIDE,ewWaitUntilTerminated,res);

end; end;

[UninstallDelete]

Name: {app}\*; Type: filesandordirs


Serega 01-07-2009 17:23 1156545

Цитата:

Цитата R.i.m.s.k.y.
видимо она не отрабатывает »

Я думаю 00.reg у вас должен востанавливаться, а 01.reg нет.
Замените запуск второго рег-файла (01.reg) на команду для первого (00.reg), т.е. замените:
Код:

Exec(RegEdit, ' import ' + AddQuotes(reg),ExpandConstant('{win}'),SW_HIDE,ewWaitUntilTerminated,res);
на:
Код:

Exec('regedit.exe',' /s ' + AddQuotes(reg),ExpandConstant('{win}'),SW_HIDE,ewWaitUntilTerminated,res);

Tukash 01-07-2009 18:41 1156614

добрый день! вот скрипт сделал все по нему но инсталлятор тупо виснит и не запускаеться... надеюсь на вашу помощь!
читать дальше »
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define TIME_FOR_VIEW 1
#define MyAppName "Call of Juarez - Bound in Blood"
#define MyAppVerName "Call of Juarez - Bound in Blood v1.0"
#define MyAppPublisher "Ubisoft"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{FC3AFBDD-4969-4D22-991F-015173A92550}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
DefaultDirName=D:\Games\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
InfoBeforeFile=D:\Games\Call of Juarez - Bound in Blood\Readme.txt
OutputDir=D:\22\juarez222
OutputBaseFilename=setup
SetupIconFile=C:\Icon #1.ico
Compression=lzma/ultra64
InternalCompressLevel=ultra64
ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64 x86
SolidCompression=yes
SlicesPerDisk=1
DiskSliceSize=2034000000
DiskClusterSize=4096
ReserveBytes=0
DiskSpanning=yes
WizardImageFile=C:\WizardImage.bmp
WizardSmallImageFile=C:\WizardSmallImage.bmp
UninstallFilesDir={app}\Uninstall


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

[Files]
Source: D:\Games\Call of Juarez - Bound in Blood\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
Source: C:\1.bmp; Flags: dontcopy
Source: C:\2.bmp; Flags: dontcopy
Source: C:\3.bmp; Flags: dontcopy
Source: C:\4.bmp; Flags: dontcopy
Source: C:\5.bmp; Flags: dontcopy
Source: C:\6.bmp; Flags: dontcopy
Source: C:\7.bmp; Flags: dontcopy
Source: C:\8.bmp; Flags: dontcopy
Source: C:\9.bmp; Flags: dontcopy
Source: C:\InnoCallback.dll; Flags: dontcopy

[Run]
Filename: {src}\DirectX\DXSETUP.exe; Parameters: /silent; WorkingDir: {src}\DirectX; Tasks: DirectX; StatusMsg: Установка DirectX® подождите ...; Flags: waituntilterminated
Filename: {src}\Redist\vcredist_x86.exe; Parameters: /q; WorkingDir: {src}Redist\; Tasks: VCRedist; StatusMsg: Установка Visual C++ 2005 Redistributable подождите ...; Flags: waituntilterminated shellexec


[Tasks]
Name: DirectX; Description: DirectX®; GroupDescription: Необходимые компоненты:
Name: Vcredist; Description: Visual C++ 2005 Redistributable; GroupDescription: Необходимые компоненты:

[Icons]
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {userdesktop}\Call of Juarez - Bound in Blood; Filename: {app}\CoJBiBGame_x86.exe; WorkingDir: {app}\
[code]
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
RunMyProg: TCheckBox;
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
case currTime of
1{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp')) end;
2{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp')) end;
3{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\4.bmp')) end;
4{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\5.bmp')) end;
5{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\6.bmp')) end;
6{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\7.bmp')) end;
7{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\8.bmp')) end;
8{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp')) end;
end;
if CurrTime = 2*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure RLabelOnClick(Sender: TObject);
begin
if RunMyProg.Checked=false then
begin
RunMyProg.Checked := true;
end else
RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
ErrorCode: Integer;
begin
if CurStep = ssDone then
begin

end;
end;

procedure InitializeWizard();
begin
ExtractTemporaryFile('1.bmp')
ExtractTemporaryFile('2.bmp')
ExtractTemporaryFile('3.bmp')
ExtractTemporaryFile('4.bmp')
ExtractTemporaryFile('5.bmp')
ExtractTemporaryFile('6.bmp')
ExtractTemporaryFile('7.bmp')
ExtractTemporaryFile('8.bmp')
ExtractTemporaryFile('9.bmp')

currTime := 0;

WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
WizardForm.FinishedLabel.Hide;
// низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
WizardForm.RunList.Height := 0;
WizardForm.RunList.Width := 0;
WizardForm.FilenameLabel.Hide;

WizardForm.StatusLabel.Parent := WizardForm;
WizardForm.StatusLabel.Top := ScaleY(315);
WizardForm.StatusLabel.Left := ScaleX(10);
WizardForm.StatusLabel.Width := ScaleX(200);
WizardForm.StatusLabel.Hide;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := ScaleY(330);
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := ScaleX(380);
WizardForm.ProgressGauge.Height := ScaleX(18);
WizardForm.ProgressGauge.Hide;

SplashImage := TBitmapImage.Create(WizardForm);
SplashImage.Top := 0;
SplashImage.Left := 0;
SplashImage.Width := WizardForm.MainPanel.Width;
SplashImage.Height := WizardForm.Bevel.Top;
SplashImage.Parent := WizardForm.InnerPage;
SplashImage.Stretch := True;
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
SplashImage.Hide;

WizardForm.WizardBitmapImage.Align:=true;
WizardForm.WizardBitmapImage2.Align:=true;
WizardForm.WizardSmallBitmapImage.Align:=true;

WelcomeLabel1:=TLabel.Create(WizardForm);
WelcomeLabel1.Left:=ScaleX(25);
WelcomeLabel1.Top := ScaleY(75);
WelcomeLabel1.Width := ScaleX(450);
WelcomeLabel1.Height := ScaleY(95);
WelcomeLabel1.AutoSize := False;
WelcomeLabel1.WordWrap := true;
WelcomeLabel1.Font.Color := clred;
// здесь можно поиграть шрифтом
WelcomeLabel1.Font.Style := [fsBold];
WelcomeLabel1.Font.Name:='MS Sans Serif';
WelcomeLabel1.Font.Size := 16;
WelcomeLabel1.Transparent := True;
WelcomeLabel1.Parent := WizardForm.WelcomePage;

WelcomeLabel2:=TLabel.Create(WizardForm);
WelcomeLabel2.Left := ScaleX(150);
WelcomeLabel2.Top := ScaleY(90);
WelcomeLabel2.Width := ScaleX(320);
WelcomeLabel2.Height := ScaleY(200);
WelcomeLabel2.AutoSize := False;
WelcomeLabel2.WordWrap := True;
WelcomeLabel2.Font.Color := clBlack;
WelcomeLabel2.Font.Size := 8;
WelcomeLabel2.Transparent := True;
//WelcomeLabel2.Parent := WizardForm.WelcomePage;

PageNameLabel := TLabel.Create(WizardForm);
PageNameLabel.Left := ScaleX(25);
PageNameLabel.Top := ScaleY(10);
PageNameLabel.Width := ScaleX(300);
PageNameLabel.Height := ScaleY(14);
PageNameLabel.AutoSize := False;
PageNameLabel.WordWrap := True;
PageNameLabel.Font.Color := clBlack;
PageNameLabel.Font.Style := [fsBold];
PageNameLabel.Transparent := True;
//PageNameLabel.Parent := WizardForm.MainPanel;

PageDescriptionLabel := TLabel.Create(WizardForm);
PageDescriptionLabel.Left := ScaleX(40);
PageDescriptionLabel.Top := ScaleY(25);
PageDescriptionLabel.Width := ScaleX(475);
PageDescriptionLabel.Height := ScaleY(30);
PageDescriptionLabel.AutoSize := False;
PageDescriptionLabel.WordWrap := True;
PageDescriptionLabel.Font.Color := clBlack;
PageDescriptionLabel.Transparent := True;
//PageDescriptionLabel.Parent := WizardForm.MainPanel;

FinishedHeadingLabel:=TLabel.Create(WizardForm);
FinishedHeadingLabel.Left:=ScaleX(25);
FinishedHeadingLabel.Top := ScaleY(75);
FinishedHeadingLabel.Width := ScaleX(450);
FinishedHeadingLabel.Height := ScaleY(95);;
FinishedHeadingLabel.AutoSize := False;
FinishedHeadingLabel.WordWrap := True;
FinishedHeadingLabel.Font.Color := clblue;
// здесь тоже можно поиграть шрифтом
FinishedHeadingLabel.Font.Style := [fsBold];
FinishedHeadingLabel.Font.Name:='MS Sans Serif';
FinishedHeadingLabel.Font.Size := 16;
FinishedHeadingLabel.Transparent := True;
FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

FinishedLabel:=TLabel.Create(WizardForm);
FinishedLabel.Left := ScaleX(450);
FinishedLabel.Top := ScaleY(90);
FinishedLabel.Width := ScaleX(320);
FinishedLabel.Height := ScaleY(200);
FinishedLabel.AutoSize := False;
FinishedLabel.WordWrap := True;
FinishedLabel.Font.Color := clBlack;
FinishedLabel.Font.Size := 8;
FinishedLabel.Transparent := True;
//FinishedLabel.Parent := WizardForm.FinishedPage;

end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;

begin
WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
//RunLabel.Caption := 'Запустить программу';

if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 4);
TimerID := SetTimer(0, 0, 1000, pfunc);

WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;

WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
SplashImage.Show;
end
else
begin
WizardForm.ProgressGauge.Hide;
WizardForm.StatusLabel.Hide;
SplashImage.Hide;

if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
end;
end;
end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;


[Registry]
Root: HKLM; SubKey: SOFTWARE\Techland\CallofJuarez2; ValueType: string; ValueName: AlreadyRunningCaption; ValueData: Information
Root: HKLM; SubKey: SOFTWARE\Techland\CallofJuarez2; ValueType: string; ValueName: AlreadyRunningText; ValueData: Call of Juarez - Bound in Blood is already running.
Root: HKLM; SubKey: SOFTWARE\Techland\CallofJuarez2; ValueType: string; ValueName: FreeDiskSpaceWarningCaption; ValueData: Warning!
Root: HKLM; SubKey: SOFTWARE\Techland\CallofJuarez2; ValueType: string; ValueName: FreeDiskSpaceWarningText; ValueData: "Out of disk space - volume: %s; required space: %d MB. Free some disk space and retry."
Root: HKLM; SubKey: SOFTWARE\Techland\CallofJuarez2; ValueType: string; ValueName: RemoteSessionCaption; ValueData: Call of Juarez - Bound in Blood
Root: HKLM; SubKey: SOFTWARE\Techland\CallofJuarez2; ValueType: string; ValueName: RemoteSessionText; ValueData: Launching game in a remote session is not allowed!
Root: HKLM; SubKey: SOFTWARE\Techland\CallofJuarez2; ValueType: string; ValueName: WriteDir; ValueData: Call of Juarez - Bound in Blood\
Root: HKLM; SubKey: SOFTWARE\Techland\CallofJuarez2; ValueType: string; ValueName: DestinationDir; ValueData: "{app}\";
Root: HKLM; SubKey: SOFTWARE\Techland\CallofJuarez2; ValueType: string; ValueName: ISGUID; ValueData: {{FEFAF112-4DA8-479C-89E2-7DE25091711A}

Serega 01-07-2009 19:24 1156647

Цитата:

Цитата Tukash
но инсталлятор тупо виснит и не запускаеться »

Может у вас картинки большого размера?
Как вариант, ещё может быть, если используете упакованную InnoCallback.dll, то может антивирус блокировать запуск.
Да, поправьте, т.е. добавьте звёздочку:
1*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp')) end;
и т.д.

Tukash 01-07-2009 19:27 1156651

Может у вас картинки большого размера?
а это сколько? 800:600 много?
забыл сказать что если упаковать не целую папку т.е вес получиться меньше то запуститься без проблем!

Serega 01-07-2009 20:59 1156719

Цитата:

Цитата Tukash
800:600 много? »

Нет, нормально.
Цитата:

Цитата Tukash
забыл сказать что если упаковать не целую папку т.е вес получиться меньше то запуститься без проблем! »

Видимо из-за того, что у вас размер стоит DiskSliceSize=2034000000, а максимально поддерживаемый - 2100000000, т.е. у вас практически на пределе. Попробуйте уменьшить размер, разбив на два файла .bin.

Tukash 01-07-2009 21:07 1156727

Serega,
дело в том что раньше у меня 7340000(ну сколько 0 не помню но разбит был по 699мб), думал что в этом проблема. сделал потом такой!!!ладно, остальное сейчас опробую и отпишусь! спасибо!!!

R.i.m.s.k.y. 02-07-2009 09:33 1156998

Цитата:

Цитата Serega
Я думаю 00.reg у вас должен востанавливаться, а 01.reg нет.
Замените запуск второго рег-файла (01.reg) на команду для первого (00.reg), т.е. замените: »

Индейская хижина. Не восстанавливает.
После деинсталляции ключи удаляются (в секции [Registry] стоит удаление этих ключей дабы если их не было до установки - они не забэкапятся и удалятся (это работает, создаются файлы только на существующие ключи), а если были - удалятся и восстановятся в состоянии до установки)

Как вообще работает эта процедура CurUninstallStepChanged(CurUninstallStep: TUninstallStep)?
Её надо откуда-то вызывать как процедуру BackupReg или она автоматом отрабатывает в процессе деинсталляции?
При деинсталляции она работает до секции [Registry] или после? Должна после секции чтобы восстановились удаленные ключи.

Serega 02-07-2009 17:30 1157456

Цитата:

Цитата R.i.m.s.k.y.
Как вообще работает эта процедура CurUninstallStepChanged(CurUninstallStep: TUninstallStep)? »

CurUninstallStepChanged - стандартная процедура при деинсталляции, она отрабатывает автоматом при деинсталляции программы. Возможные значения:
usAppMutexCheck – не знаю...;
usUninstall - отрабатывает в момент движения прогрессбара при деинсталляции;
usPostUninstall - отрабатывает после страницы с прогрессбаром, но до появления сообщения о том, что программа удалена;
usDone - отрабатывает после нажатия на кнопку ОК в сообщении о том, что программа удалена.
Цитата:

Цитата R.i.m.s.k.y.
Должна после секции чтобы восстановились удаленные ключи »

для этого нужно использовать значения usPostUninstall или usDone.

R.i.m.s.k.y. 02-07-2009 17:31 1157458

Цитата:

Цитата Serega
для этого нужно использовать значения usPostUninstall или usDon »

Эти ключи тоже ничего не решают, пробовал.

Serega 02-07-2009 17:59 1157477

Цитата:

Цитата R.i.m.s.k.y.
Эти ключи тоже ничего не решают, пробовал. »

Что вы пробовали и что они не решают?
Вы спашивали:
Цитата:

Цитата R.i.m.s.k.y.
Как вообще работает эта процедура CurUninstallStepChanged(CurUninstallStep: TUninstallStep)? »

Я вам написал как она работает и её возможные значения...

МИШАНЧИК 02-07-2009 21:41 1157634

Serega, подскажите пожалуйста, можно ли как-то сделать чтоб инсталятор одну и ту же папку с подпапками и файлами при установке скопировал в 2 места?
Допустим папка1, папка2, папка3 установил в Program Files\Program\Program1 и в Program Files\Program\Program2.

serg aka lain 03-07-2009 01:58 1157801

Цитата:

Цитата МИШАНЧИК
подскажите пожалуйста, можно ли как-то сделать чтоб инсталятор одну и ту же папку с подпапками и файлами при установке скопировал в 2 места? »

А что мешает заюзать xcopy?
Или ещё проще:
Код:

[Files]
Source: "файлы\*"; DestDir: "{app}\Program1"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "файлы\*"; DestDir: "{app}\Program2"; Flags: ignoreversion recursesubdirs createallsubdirs;


R.i.m.s.k.y. 03-07-2009 08:36 1157874

Цитата:

Цитата Serega
Я вам написал как она работает и её возможные значения »

Я подставлял все возможные значения, кроме usAppMutexCheck потому как мне ее название ни о чем не говорит и в хелпе про нее ни слова, про остальные хоть из названия понятно. Ни при каких значениях (usUninstall, usPostUninstall, usDone) выкат из бэкапа ключей при деинсталляции не делается.
Такое ощущение будто процедурка CurUninstallStepChanged не отрабатывает. Может ей вывод на экран поставить (да хоть 'Hello, World') чтоп она себя обозначила в процессе.

Оффтоп - а и правда, как вывести на экран сообщение из этой процедуры? Поставить в начало и конец - будет видно что-где-когда делается...

Вопрос снят, нашел как делать сообщения, процедура CurUninstallStepChanged, судя по выводу на экран, запускается.

МИШАНЧИК 03-07-2009 11:39 1158003

serg aka lain, большое спасибо. Подскажите пожалйста как правильно указать:
Цитата:

Цитата serg aka lain
А что мешает заюзать xcopy? »

И ещё вопрос. Можно как-то задать нахождение файлов деинсталятора и их имена, допустим чтоб не в основной папке, а в подпапке и не unins000.dat, unins000.exe, а uninstall.dat и uninstall.exe?

R.i.m.s.k.y. 03-07-2009 14:04 1158121

Вопрос решен. Всем спасибо!
Решение

Tukash 03-07-2009 18:17 1158367

Господа в чем проблема? стоит в инсталляторе 9bmp изображений он использует их как слайд шоу, но во время установки он показыват лишь 2 из них это 2 и 3 слайды помогите прошу вас, и как всегда надеюсь на вас!
[code]
Код:

type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  1*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\4.bmp')) end;
  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\5.bmp')) end;
  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\6.bmp')) end;
  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\7.bmp')) end;
  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\8.bmp')) end;
  8*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\9.bmp')) end;
  end;
  if CurrTime = 7*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked=false then
  begin
    RunMyProg.Checked := true;
  end else
    RunMyProg.Checked := false;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
if CurStep = ssDone then
  begin

  end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('1.bmp')
  ExtractTemporaryFile('2.bmp')
  ExtractTemporaryFile('3.bmp')
  ExtractTemporaryFile('4.bmp')
  ExtractTemporaryFile('5.bmp')
  ExtractTemporaryFile('6.bmp')
  ExtractTemporaryFile('7.bmp')
  ExtractTemporaryFile('8.bmp')
  ExtractTemporaryFile('9.bmp')

  currTime := 5;

      WizardForm.WelcomeLabel1.Hide;
      WizardForm.WelcomeLabel2.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.FinishedHeadingLabel.Hide;
      WizardForm.FinishedLabel.Hide;
    // низнаю почему, но Hide не действует. Поэтому просто уменьшил размер
      WizardForm.RunList.Height := 0;
      WizardForm.RunList.Width := 0;
      WizardForm.FilenameLabel.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := ScaleY(315);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(200);
  WizardForm.StatusLabel.Hide;

      WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.ProgressGauge.Top := ScaleY(330);
      WizardForm.ProgressGauge.Left := ScaleX(10);
      WizardForm.ProgressGauge.Width := ScaleX(380);
      WizardForm.ProgressGauge.Height := ScaleX(18);
      WizardForm.ProgressGauge.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  SplashImage.Hide;

      WizardForm.WizardBitmapImage.Align:=true;
      WizardForm.WizardBitmapImage2.Align:=true;
      WizardForm.WizardSmallBitmapImage.Align:=true;

  WelcomeLabel1:=TLabel.Create(WizardForm);
  WelcomeLabel1.Left:=ScaleX(255);
  WelcomeLabel1.Top := ScaleY(15);
  WelcomeLabel1.Width := ScaleX(250);
  WelcomeLabel1.Height := ScaleY(95);
  WelcomeLabel1.AutoSize := False;
  WelcomeLabel1.WordWrap := true;
  WelcomeLabel1.Font.Color := clgreen;
// здесь можно поиграть шрифтом
  WelcomeLabel1.Font.Style := [fsBold];
  WelcomeLabel1.Font.Name:='MS Sans Serif';
  WelcomeLabel1.Font.Size := 13;
  WelcomeLabel1.Transparent := True;
  WelcomeLabel1.Parent := WizardForm.WelcomePage;

      WelcomeLabel2:=TLabel.Create(WizardForm);
      WelcomeLabel2.Left := ScaleX(150);
      WelcomeLabel2.Top := ScaleY(90);
      WelcomeLabel2.Width := ScaleX(320);
      WelcomeLabel2.Height := ScaleY(200);
      WelcomeLabel2.AutoSize := False;
      WelcomeLabel2.WordWrap := True;
      WelcomeLabel2.Font.Color := clBlack;
      WelcomeLabel2.Font.Size := 8;
      WelcomeLabel2.Transparent := True;
      //WelcomeLabel2.Parent := WizardForm.WelcomePage;

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.Left := ScaleX(25);
  PageNameLabel.Top := ScaleY(10);
  PageNameLabel.Width := ScaleX(300);
  PageNameLabel.Height := ScaleY(14);
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clBlack;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.Transparent := True;
  //PageNameLabel.Parent := WizardForm.MainPanel;

      PageDescriptionLabel := TLabel.Create(WizardForm);
      PageDescriptionLabel.Left := ScaleX(40);
      PageDescriptionLabel.Top := ScaleY(25);
      PageDescriptionLabel.Width := ScaleX(475);
      PageDescriptionLabel.Height := ScaleY(30);
      PageDescriptionLabel.AutoSize := False;
      PageDescriptionLabel.WordWrap := True;
      PageDescriptionLabel.Font.Color := clBlack;
      PageDescriptionLabel.Transparent := True;
      //PageDescriptionLabel.Parent := WizardForm.MainPanel;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  FinishedHeadingLabel.Left:=ScaleX(275);
  FinishedHeadingLabel.Top := ScaleY(15);
  FinishedHeadingLabel.Width := ScaleX(250);
  FinishedHeadingLabel.Height := ScaleY(95);;
  FinishedHeadingLabel.AutoSize := False;
  FinishedHeadingLabel.WordWrap := True;
  FinishedHeadingLabel.Font.Color := clgreen;
// здесь тоже можно поиграть шрифтом
  FinishedHeadingLabel.Font.Style := [fsBold];
  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
  FinishedHeadingLabel.Font.Size := 13;
  FinishedHeadingLabel.Transparent := True;
  FinishedHeadingLabel.Parent := WizardForm.FinishedPage;

      FinishedLabel:=TLabel.Create(WizardForm);
      FinishedLabel.Left := ScaleX(225);
      FinishedLabel.Top := ScaleY(15);
      FinishedLabel.Width := ScaleX(250);
      FinishedLabel.Height := ScaleY(95);
      FinishedLabel.AutoSize := False;
      FinishedLabel.WordWrap := True;
      FinishedLabel.Font.Color := clBlack;
      FinishedLabel.Font.Size := 13;
      FinishedLabel.Transparent := True;
      //FinishedLabel.Parent := WizardForm.FinishedPage;

end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;

begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  //RunLabel.Caption := 'Запустить программу';

  if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 4);
      TimerID := SetTimer(0, 0, 1000, pfunc);

      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;

      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      WizardForm.StatusLabel.Hide;
      SplashImage.Hide;

    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
  end;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;

и еще, что надо исправить, что-бы не так быстро менялся слайд?

Raf-9600 03-07-2009 18:57 1158401

1. Ктонить может сделать скрипт, чтоб в папке, которую выбрал юзер, для установки игры, проверялось наличие файлов "Install.exe" и "StarCraft.mpq", если хоть один файл найден, то никаких сообщений об ошибке выводиться не должно, если же не найдено ни одного, то выводилось сообщение "Install.exe не найден в папке назначения, скопируйте его с лицензионного диска StarCraft, в папку, для начала инсталляции". Но этот скрипт должен работать только если выбран компонент "Game\Lokal".
2. Возможно ли сделать чтоб в этом слайд-шоу, слайды менялись не по порядку, а рандомно?
читать дальше »
Код:

#define TIME_FOR_VIEW 5

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=zip
SolidCompression=yes

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

[Files]
Source: InnoCallback.dll; Flags: dontcopy noencryption nocompression solidbreak;
Source: *.bmp; Flags: dontcopy noencryption nocompression solidbreak;

[-code]
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

var
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;
StatusMessages: TNewStaticText;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
case currTime of
{#TIME_FOR_VIEW}: begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp'))
end;
2*{#TIME_FOR_VIEW}: begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp'))
end;
3*{#TIME_FOR_VIEW}: begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp'))
end;
4*{#TIME_FOR_VIEW}: begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp'))
end;
5*{#TIME_FOR_VIEW}: begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp'))
end;
6*{#TIME_FOR_VIEW}: begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp'))
end;
7*{#TIME_FOR_VIEW}: begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp'))
end;
8*{#TIME_FOR_VIEW}: begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_9.bmp'))
end;
9*{#TIME_FOR_VIEW}: begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'))
end;
end;
if CurrTime = 9*{#TIME_FOR_VIEW} then CurrTime := -1;
end;


procedure InitializeWizard;
begin
ExtractTemporaryFile('Image_1.bmp');


currTime := 0;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
WizardForm.ProgressGauge.Height := 16;
WizardForm.ProgressGauge.Hide;

WizardForm.StatusLabel.Parent := WizardForm;
WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
WizardForm.StatusLabel.Left := ScaleX(10);
WizardForm.StatusLabel.Width := ScaleX(397);
WizardForm.StatusLabel.Hide;

SplashImage := TBitmapImage.Create(WizardForm);
SplashImage.Top := 0;
SplashImage.Left := 0;
SplashImage.Width := WizardForm.MainPanel.Width;
SplashImage.Height := WizardForm.Bevel.Top;
SplashImage.Parent := WizardForm.InnerPage;
SplashImage.Stretch := True;
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
SplashImage.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
ExtractTemporaryFile('Image_2.bmp');
ExtractTemporaryFile('Image_3.bmp');
ExtractTemporaryFile('Image_4.bmp');
ExtractTemporaryFile('Image_5.bmp');
ExtractTemporaryFile('Image_6.bmp');
ExtractTemporaryFile('Image_7.bmp');
ExtractTemporaryFile('Image_8.bmp');
ExtractTemporaryFile('Image_9.bmp');
ExtractTemporaryFile('Image_10.bmp');
end;
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 5);
TimerID := SetTimer(0, 0, 1000, pfunc);
WizardForm.PageNameLabel.Visible := False;
WizardForm.PageDescriptionLabel.Visible := False;
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
SplashImage.Show;
WizardForm.CancelButton.Enabled := True;
WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100);
end else
begin
WizardForm.ProgressGauge.Hide;
SplashImage.Hide;
WizardForm.FileNameLabel.Hide;
WizardForm.StatusLabel.Hide;
if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
end;
If CurPageID = wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
KillTimer(0, TimerID);


serg aka lain 03-07-2009 20:56 1158486

МИШАНЧИК
Цитата:

Цитата МИШАНЧИК
Можно как-то задать нахождение файлов деинсталятора и их имена, допустим чтоб не в основной папке, а в подпапке »

UninstallFilesDir={app}\uninstall
Цитата:

Цитата МИШАНЧИК
и не unins000.dat, unins000.exe, а uninstall.dat и uninstall.exe? »

Думаю, без ковыряния исходников инно - нет.

Raf-9600
Цитата:

Цитата Raf-9600
1. Ктонить может сделать скрипт, чтоб в папке, которую выбрал юзер, для установки игры, проверялось наличие файлов "Install.exe" и "StarCraft.mpq", если хоть один файл найден, то никаких сообщений об ошибке выводиться не должно, если же не найдено ни одного, то выводилось сообщение "Install.exe не найден в папке назначения, скопируйте его с лицензионного диска StarCraft, в папку, для начала инсталляции". Но этот скрипт должен работать только если выбран компонент "Game\Lokal". »

Поскольку страница с выбором компонентов идёт после страницы выбора папки установки, данную проверку, думаю целесообразнее делать на странице "Всё готово к установке" (wpReady),
проверяй …

Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;

  if CurPageID = wpReady then
  begin
    if IsComponentSelected('Game\Lokal') then
      if (FileSearch('Install.exe', ExpandConstant('{app}')) = '') then
        if (FileSearch('StarCraft.mpq', ExpandConstant('{app}')) = '') then
      begin
        SuppressibleMsgBox('"Install.exe не найден в папке назначения, скопируйте его с лицензионного диска StarCraft, в папку, для начала инсталляции".', mbCriticalError, MB_OK, MB_OK);
        Result := False;
      end else
        Result := True;
  end;
end;


BlackSelf 03-07-2009 21:19 1158494

Цитата:

Цитата МИШАНЧИК
и не unins000.dat, unins000.exe, а uninstall.dat и uninstall.exe? »

Код:

[_Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
RenameFile(ExpandConstant('{app}\unins000.exe'), ExpandConstant('{app}\uninstall.exe'))
RenameFile(ExpandConstant('{app}\unins000.dat'), ExpandConstant('{app}\uninstall.dat'))
RegWriteStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Моя Прога_is1','UninstallString', ExpandConstant('{app}\uninstall.exe'))
RegWriteStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Моя Прога_is1','QuietUninstallString', ExpandConstant('{app}\uninstall.exe /SILENT'))
end;


Tukash 03-07-2009 21:43 1158509

прошу прощение за беспокойства, разобрался сам, надо было всего-то в #define TIME_FOR_VIEW 1 изменить на цифру больше!!!

serg aka lain 03-07-2009 21:51 1158511

BlackSelf
И чего толку от переименования?
При повторной установке реестр перезапишется как нужно, а в папке будет создан ещё один unins000.exe и unins000.dat.
Ну, если только целью этого действия является лишь бы получить эти uninstall любой ценой, то пойдёт.
ИМХО Думаю, спрашивали как заставить инсталлятор создавать деинсталлятор uninstall.exe изначально.

Serega 03-07-2009 22:02 1158513

Цитата:

Цитата serg aka lain
как заставить инсталлятор создавать деинсталлятор uninstall.exe изначально. »

От перемены мест слагаемых, сумма не меняется, т.е. в итоге будет получен требуемый результат... ;)

serg aka lain 03-07-2009 22:11 1158517

Цитата:

Цитата Serega
От перемены мест слагаемых, сумма не меняется, т.е. в итоге будет получен требуемый результат... »

согласен

Raf-9600 03-07-2009 23:21 1158560

Цитата:

Цитата serg aka lain
Поскольку страница с выбором компонентов идёт после страницы выбора папки установки, данную проверку, думаю целесообразнее делать на странице "Всё готово к установке" (wpReady),
проверяй … »

Сенкс! Полет отличный.

Raf-9600 05-07-2009 17:54 1159511

Интересует ещё один важный вопрос: можно ли как-то заставить прогу, при запуске (в данный момент, она через [Run]) работать в "невидимом" режиме? ИспробЫвал и RunHidden и RunMinimized, ничего не подействовало. Может через [code] это можно реализовать? В данный момент эта строчка выглядит так:
Код:

Filename: "{app}\WinMPQ-SU.exe"; Flags: runhidden; Parameters: s Sound.txt; StatusMsg: "Встраивание озвучки юнитов..."; Components: inMPQ; Flags: skipifdoesntexist
И она должна работать только после того, как отработает эта:
Код:

Filename: "{app}\del Ogg [SoundUnit].bat"; Flags: runhidden; StatusMsg: "Удаление лишних файлов..."; Components: SoundUnit;

p3rf3ct1c 06-07-2009 02:22 1159800

Здравствуйте! Подскажите как добавить чекбокс на странице завершения, вниз около кнопки завершить? И чтобы когда была отмечена галочка, началась установка какой либо программы.

Serega 06-07-2009 20:59 1160506

Цитата:

Цитата p3rf3ct1c
как добавить чекбокс на странице завершения »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[code]
var
  RunProg: TCheckBox;

procedure CheckBoxChecked;
begin
  if RunProg.Checked then
  MsgBox('CheckBox отмечен...', mbInformation, MB_OK);
end;

procedure GreatCheckBox;
begin
  RunProg:= TCheckBox.Create(WizardForm);
  with RunProg do
    begin
      Parent := WizardForm;
      Caption := 'Запустить программу?';
      SetBounds(140,330,150,15);
      Cursor:= crHand;
      Checked:= True;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpFinished then GreatCheckBox;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then CheckBoxChecked;
end;



Цитата:

Цитата Raf-9600
можно ли как-то заставить прогу, при запуске (в данный момент, она через [Run]) работать в "невидимом" режиме? »

Всё зависит от программы.
Если она небольшая (просто у меня интернет платный), то дайте ссылку, можно глянуть...

Raf-9600 06-07-2009 22:06 1160547

Serega, В архиве - 152 КБ. Но требует наличия Visual Basic 4 (832 КБ)

p3rf3ct1c 06-07-2009 22:49 1160585

Serega,
Спасибо, вот только я не могу догадаться что надо добавить там где я отметил жирным и подчеркнул
Цитата:

FileName: {src}\Redistributables\gfwlivesetup.exe; WorkingDir: {src}\Redistributables; Check:
чтобы при отмеченном чекбоксе началась установка программы.

Можете еще помочь вставить этот код в мой, а то я все вставил и при при компиляции, запуске, установке ошибок нет, но в конце чекбокс всеравно не отображается.
код
Цитата:

[Setup]
SourceDir=.
OutputDir=Setup
AppName=FUEL
AppVerName=FUEL
AppVersion=FUEL
DefaultDirName={pf}\FUEL
DefaultGroupName=FUEL
AllowNoIcons=yes
OutputBaseFilename=setup
UninstallFilesDir={app}\Uninstall
WizardImageFile=C:\Users\p3rf3ct1c\Desktop\big.bmp
WizardSmallImageFile=C:\Users\p3rf3ct1c\Desktop\small.bmp
SetupIconFile=C:\Users\p3rf3ct1c\Desktop\icon.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/ultra
DiskSpanning=yes
DiskSliceSize=692060160
SlicesPerDisk=1
DisableProgramGroupPage=true
DisableReadyPage=true

[Messages]
WelcomeLabel1=
WelcomeLabel2=
ClickNext=
WizardSelectDir=
SelectDirDesc=
WizardInstalling=
InstallingLabel=
FinishedHeadingLabel=
SelectDirBrowseLabel=Íàæìèòå «Óñòàíîâèòü», ÷òîáû íà÷àòü óñòàíîâêó. Åñëè Âû õîòèòå âûáðàòü äðóãóþ ïàïêó, íàæìèòå «Îáçîð».


[CustomMessages]
rus.ArcCancel=Îòìåíèòü ðàñïàêîâêó
rus.ArcBreak=Óñòàíîâêà ïðåðâàíà!
rus.ArcInfo=Ðàñïàêîâàíî %1 Ìá èç %2 Ìá (%3%%). Àðõèâ: %4 èç %5.
rus.ArcTitle=Ðàñïàêîâêà àðõèâîâ FreeArc
rus.ArcError=Ðàñïàêîâùèê FreeArc âåðíóë êîä îøèáêè: %1
rus.ArcFail=Ðàñïàêîâêà íå çàâåðøåíà!
rus.AllProgress=Îáùèé ïðîãðåññ ðàñïàêîâêè: %1%%
rus.ArcBroken=Âîçìîæíî, àðõèâ %1 ïîâðåæä¸í%nèëè íåäîñòàòî÷íî ìåñòà íà äèñêå íàçíà÷åíèÿ.
rus.Extracting=Ðàñïàêîâûâàåòñÿ: %1
rus.remains=%1%%, æäè %2
rus.LongTime=âå÷íî
rus.ending=çàâåðøåíèå


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

[Files]
Source: C:\Program Files\Codejock Software\ISSkin\ISSkin.dll; DestDir: {tmp}; Flags: dontcopy
Source: C:\Program Files\Codejock Software\ISSkin\Styles\GuiStyle.msstyles; DestDir: {tmp}; Flags: dontcopy

Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: "C:\Users\p3rf3ct1c\Desktop\unp\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Icons]
Name: {group}\Óäàëèòü èãðó; Filename: {uninstallexe}
Name: {group}\FUEL; Filename: {app}\GameSetup.exe; WorkingDir: {app};
Name: {commondesktop}\FUEL; Filename: {app}\GameSetup.exe; WorkingDir: {app}; Check: MakeDesktopIcon;



[Registry]
Root: HKLM; Subkey: "SOFTWARE\FUEL"; ValueType: string; ValueName: "Uninstall"; ValueData: "\""{pf}\InstallShield Installation Information\{{F51FF206-2273-4B3E-A90A-4752AE288C12}\setup.exe\"""
Root: HKLM; Subkey: "SOFTWARE\FUEL"; ValueType: string; ValueName: "GamePath"; ValueData: "{app}"
Root: HKLM; Subkey: "SOFTWARE\FUEL"; ValueType: string; ValueName: "UserLanguageID"; ValueData: "1033"
Root: HKLM; Subkey: "SOFTWARE\FUEL"; ValueType: string; ValueName: "InstanceGUID"; ValueData: "{{7D50D94D-1DCA-4951-A73A-3B25B1425345}"


[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[code]
const
Archives = '{src}\*.arc'; // óêàæèòå ðàñïîëîæåíèå àðõèâîâ FreeArc; äëÿ âíåøíèõ ôàéëîâ ñòðîêó â [Files] äîáàâëÿòü íåîáÿçàòåëüíî

PM_REMOVE = 1;
CP_ACP = 0; CP_UTF8 = 65001;

HALIGN_CENTER = 0;
HALIGN_LEFT = 1;
HALIGN_RIGHT = 2;

VALIGN_CENTER = 0;
VALIGN_TOP = 1;
VALIGN_BOTTOM = 2;

FIT_NONE = 0;
FIT_WIDTH = 1;
FIT_HEIGHT = 2;
FIT_BOTH = 3;

CLR_INVALID = $FFFFFFFF;

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

// Importing UnloadSkin API from ISSkin.DLL
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

// Importing ShowWindow Windows API from User32.DLL
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

function InitializeSetup(): Boolean;
begin

ExtractTemporaryFile('GuiStyle.msstyles');
LoadSkin(ExpandConstant('{tmp}\GuiStyle.msstyles'), '');
Result := True;
end;
procedure DeinitializeSetup();
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();

end;
type
#ifdef UNICODE ; åñëè ó âàñ îøèáêà íà ýòîé ñòðîêå, òî óñòàíîâèòå ïðåïðîöåññîð èëè èñïðàâüòå ñêðèïò äëÿ âàøåé âåðñèè Inno Setup
#define A "W"
#else
#define A "A" ; òî÷êà âõîäà â SetWindowText, {#A} ìåíÿåòñÿ íà A èëè W â çàâèñèìîñòè îò âåðñèè
PAnsiChar = PChar; // Required for Inno Setup 5.3.0 and higher. (òðåáóåòñÿ äëÿ Inno Setup âåðñèè 5.3.0 è íèæå)
#endif
#if Ver < 84018176
AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and below (äëÿ Inno Setup âåðñèé 5.2.4 è âûøå ýòà ñòðîêà íå íóæíà)
#endif

TMyMsg = record
hwnd: HWND;
message: UINT;
wParam: Longint;
lParam: Longint;
time: DWORD;
pt: TPoint;
end;

TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
TArc = record Path: string; Size: Extended; end;

var
FreeMB, TotalMB: Cardinal;
DesktopIcon,Dop: TCheckBox;
ProgressBar: TNewProgressBar;
ExtractFile: TNewStaticText;
PageNameLabel, PageDescriptionLabel,NeedSpaceLabel,FreeSpaceLabel,lblExtractFileName: TLabel;
btnCancelUnpacking: TButton;
NeedSize,CancelCode, n, UnPackError, StartInstall: Integer;
Arcs: array of TArc;
msgError: string;
m: Extended;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := 'Äîñòóïíî ìåñòà íà äèñêå: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
FreeSpaceLabel.Caption := 'Äîñòóïíî ìåñòà íà äèñêå: '+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := 'Òðåáóåòñÿ ìåñòà íà äèñêå: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
NeedSpaceLabel.Caption := 'Òðåáóåòñÿ ìåñòà íà äèñêå: '+ IntToStr(NeedSize)+ ' MB';
end;

function MakeDesktopIcon: Boolean;
begin
Result:=DesktopIcon.Checked;
end;

Function InstallDop:Boolean;
begin
Result:=Dop.Checked;
end;


Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

procedure AppProcessMessage;
var
Msg: TMyMsg;
begin
while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

Function NumToStr(Float: Extended): String; {Ïåðåâîä ÷èñëà â ñòðîêó ñ òî÷íîñòüþ 3 çíàêà (%.3n) ñ îêðóãëåíèåì äðîáíîé ÷àñòè, åñëè îíà åñòü}
Begin
Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.'); while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do SetLength(Result, Length(Result)-1);
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;

Function Size64(Hi, Lo: Integer): Extended;
Begin
Result:= Lo; if Lo< 0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2; for Hi:= Hi-1 Downto 0 do Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
End;

// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
CancelCode:= -127;
end;

// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
FSR: TFindRec;
Begin
if FindFirst(ExpandConstant(dir), FSR) then
try
repeat
// Skip everything but the folders
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
n:= GetArrayLength(Arcs);
// Expand the folder list
SetArrayLength(Arcs, n +1);
Arcs[n].Path:= ExtractFilePath(ExpandConstant(Archives)) + FSR.Name;
Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
Result:= Result + Arcs[n].Size;
until not FindNext(FSR);
finally
FindClose(FSR);
end;
End;

// Converts OEM encoded string into ANSI
// Ïðåîáðàçóåò OEM ñòðîêó â ANSI êîäèðîâêó
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
nRet : longint;
begin
SetLength( Result, Length( strSource ) );
nRet:= OemToChar( strSource, Result );
end;

// Converts ANSI encoded string into UTF-8
// Ïðåîáðàçóåò ñòðîêó èç ANSI â UTF-8 êîäèðîâêó
function AnsiToUtf8( strSource: string ): string;
var
nRet : integer;
WideCharBuf: string;
MultiByteBuf: string;
begin
strSource:= strSource + chr(0);
SetLength( WideCharBuf, Length( strSource ) * 2 );
SetLength( MultiByteBuf, Length( strSource ) * 2 );

nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

Result:= MultiByteBuf;
end;

// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;

// Converts milliseconds to standart time
Function TicksToTime(Ticks: DWord; detail: Boolean): String; Begin {ìèëèñåêóíäû â ñòàíäàðòíîå âðåìÿ}
if detail or (Ticks/3600 >= 1000) {hour} then if Ticks/3600000 > 23 then Result:= cm('LongTime') else Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) else if Ticks/60 < 1000 {min} then Result:= IntToStr(Ticks/1000) +'.'+ NumToStr(trunc((Ticks/1000 - trunc(Ticks/1000))*10)) +'s' else Result:= IntToStr(Ticks/60000) +'m '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +'s';
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
percents, Elapsed: Integer;
begin
if string(what)='filename' then

else
if (string(what)='progress') and (sizeArc>0) then
// Update progress bar with additional info
with WizardForm.ProgressGauge do
begin
// Calculate current percents
percents:= (Mb*1000) div sizeArc;
ProgressBar.Position:= percents;
ExtractFile.Caption:= FmtMessage(cm('ArcInfo'), [IntToStr(Mb), IntToStr(sizeArc), Format('%.1n', [Abs(percents/10)]), IntToStr(n+1), IntToStr(GetArrayLength(Arcs)) ]);
Position:= Tag + round(ProgressBar.Position * m)

percents:= (Position-Min)/((Max - Min)/1000)
WizardForm.FileNameLabel.Caption:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
if position > 0 then Elapsed:= trunc((GetTickCount - StartInstall) * Abs((max - position)/position)) else Elapsed:= 0;
// Update the taskbar title
if Elapsed = 0 then SetTaskBarTitle(cm('ending')) else SetTaskBarTitle(FmtMessage(cm('remains'), [IntToStr(percents/10), TicksToTime(Elapsed, false)]));
end;
AppProcessMessage;
Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
allSize: Extended;
callback: longword;
FreeMB, TotalMB: Cardinal;
begin
// Show the 'Cancel unpacking' button and set it as default button
btnCancelUnpacking.Show;
WizardForm.ActiveControl:= btnCancelUnpacking;
WizardForm.ProgressGauge.Position:= 0;
WizardForm.ProgressGauge.Max:= 1000;
// Get the size of all archives
allSize:= FindArcs(Archives);

for n:= 0 to GetArrayLength(Arcs) -1 do
begin
m:= Arcs[n].Size/allSize; // Size of the current archive (îáú¸ì òåêóùåãî àðõèâà)
WizardForm.ProgressGauge.Tag:= WizardForm.ProgressGauge.Position;
CancelCode:= 0;
AppProcessMessage;
callback:= WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4 arguments
try
// Pass the specified arguments to 'unarc.dll'
Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', Arcs[n].Path, '', '', '', '', '');
if Result = 0 then Result:= CancelCode;
except
Result:= -63; // ArcFail
end;

// Error occured
if Result <> 0 then
begin
msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
case Result of
-1: if FreeMB < 32 {Ìá íà äèñêå} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
-127: msgError:= cm('ArcBreak'); //Cancel button
-63: msgError:= cm('ArcFail');
end;
// MsgBox(msgError, mbInformation, MB_OK); //ñîîáùåíèå ïîêàçûâàåòñÿ íà ñòðàíèöå çàâåðøåíèÿ
Log(msgError);
Break; //ïðåðâàòü öèêë ðàñïàêîâêè
end;
end;
// Hide the button
btnCancelUnpacking.visible:= false;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode:integer;
begin
if CurStep = ssInstall then StartInstall:= GetTickCount; {âðåìÿ íà÷àëà ðàñïàêîâêè}
if CurStep = ssPostInstall then
begin
UnPackError:= UnPack(Archives)
if UnPackError = 0 then begin
{--------------------------------------------------------------------------Äîáàâèë DeKaN(DeKaNszn)--------------------------------------------------------------------------}

{--------------------------------------------------------------------------Äîáàâèë DeKaN(DeKaNszn)--------------------------------------------------------------------------}
SetTaskBarTitle(SetupMessage(msgSetupAppTitle)); end
else
begin
// Error occured, uninstall it then
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n); //îòêàò óñòàíîâêè èç-çà îøèáêè unarc.dll
SetTaskBarTitle(SetupMessage(msgErrorTitle))
WizardForm.Caption:= SetupMessage(msgErrorTitle) +' — '+ cm('ArcBreak')
end;
end;
end;

// ñòàíäàðòíûé ñïîñîá îòêàòà (íå íóæíà CurPageChanged), íî àðõèâû ðàñïàêîâûâàþòñÿ äî èçâëå÷åíèÿ ôàéëîâ èíñòàëëÿòîðà
// if CurStep = ssInstall then
// if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged(CurPageID: Integer);
Begin
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
if (CurPageID = wpFinished) and (UnPackError <> 0) then
begin // ðàñïàêîâùèê âåðíóë îøèáêó
WizardForm.FinishedLabel.Font.Color:= $0000C0; //êðàñíûé
WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
end;
begin
If CurPageID=wpSelectDir then
begin
WizardForm.BackButton.Enabled := False;
end;

if CurPageID=wpSelectDir then begin
WizardForm.NextButton.Caption:='Óñòàíîâèòü';
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
end;
End;
end;
procedure InitializeWizard();
var
WLabel1, WLabel2,
FLabel1, FLabel2: TLabel;
begin
WizardForm.BorderStyle := bsDialog;
ProgressBar:= TNewProgressBar.Create(WizardForm);
ExtractFile:=TNewStaticText.Create(WizardForm);
lblExtractFileName:= TLabel.Create( WizardForm );
with WizardForm.ProgressGauge do
begin
// Create a label to show current FileName being extracted
lblExtractFileName.parent:=WizardForm.InstallingPage;
lblExtractFileName.autosize:=false;
lblExtractFileName.Width:= Width;
lblExtractFileName.top:=Top + ScaleY(35);
lblExtractFileName.Caption:= '';

// Create a label to show percentage
ExtractFile.parent:=WizardForm.InstallingPage;
ExtractFile.autosize:=false;
ExtractFile.Width:= Width;
ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
ExtractFile.caption:=cm('ArcTitle');

// Create a separate progress bar
ProgressBar.SetBounds(Left, ExtractFile.Top + ScaleY(16), Width, Height);
ProgressBar.Parent:= WizardForm.InstallingPage;
ProgressBar.max:= 1000;
ProgressBar.Position:= 0;
end;

// Create a 'Cancel unpacking' button and hide it for now.
btnCancelUnpacking:=TButton.create(WizardForm);
btnCancelUnpacking.Parent:= WizardForm;
btnCancelUnpacking.SetBounds(260, WizardForm.cancelbutton.top, 135, WizardForm.cancelbutton.Height);
btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
btnCancelUnpacking.Caption:= cm('ArcCancel');
btnCancelUnpacking.Hide;

DesktopIcon := TCheckBox.Create(WizardForm);
with DesktopIcon do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Äîáàâèòü ÿðëûê íà ðàáî÷èé ñòîë';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top+35;
Width := ScaleX(400);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;


dop := TCheckBox.Create(WizardForm);
with Dop do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Óñòàíîâèòü Game for Windows -LIVE (òðåáóåòñÿ ïîäêëþ÷åíèå ê èíòåðíåòó)';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top+55;
Width := ScaleX(400);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;


NeedSize := 3220;

WizardForm.DiskSpaceLabel.Hide;

NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;

FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;

PageNameLabel := TLabel.Create(WizardForm);
with PageNameLabel do
begin
Left := ScaleX(10);
Top := ScaleY(10);
Width := ScaleX(300);
Height := ScaleY(14);
AutoSize := False;
WordWrap := True;
Font.Color := clWhite;
Font.Style := [fsBold];
Transparent := True;
Parent := WizardForm.MainPanel;
end;

PageDescriptionLabel := TLabel.Create(WizardForm);
with PageDescriptionLabel do
begin
Left := ScaleX(15);
Top := ScaleY(25);
Width := ScaleX(475);
Height := ScaleY(30);
AutoSize := False;
WordWrap := True;
Font.Color := clWhite;
Transparent := True;
Parent := WizardForm.MainPanel;
end;

with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left := ScaleX(0);
Top := ScaleY(0);
Width := Mainpanel.Width;
Height := MainPanel.Height;
end;
end;
end;

WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedHeadingLabel.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.WizardBitmapImage.Width := WizardForm.Width;
WizardForm.WizardBitmapImage.Height := WizardForm.Height;
WizardForm.WizardBitmapImage.Width := 497;
WizardForm.WizardBitmapImage.Height := 313;
WizardForm.WizardSmallBitmapImage.Width:=497;
WizardForm.WizardSmallBitmapImage.Height:=58;

WLabel1 := TLabel.Create(WizardForm);
WLabel1.Left := ScaleX(176);
WLabel1.Top := ScaleY(16);
WLabel1.Width := ScaleX(301);
WLabel1.Height := ScaleY(54);
WLabel1.AutoSize := False;
WLabel1.WordWrap := True;
WLabel1.Font.Size := 12;
WLabel1.Font.Style := [fsBold];
WLabel1.Font.Color:= clBlack;
WLabel1.ShowAccelChar := False;
WLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
WLabel1.Transparent := True;
WLabel1.Parent := WizardForm.WelcomePage;

WLabel2 :=TLabel.Create(WizardForm);
WLabel2.Top := ScaleY(76);
WLabel2.Left := ScaleX(176);
WLabel2.Width := ScaleX(301);
WLabel2.Height := ScaleY(234);
WLabel2.AutoSize := False;
WLabel2.WordWrap := True;
WLabel2.Font.Color:= clBlack;
WLabel2.ShowAccelChar := False;
WLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
WLabel2.Transparent := True;
WLabel2.Parent := WizardForm.WelcomePage;

WizardForm.WizardBitmapImage2.Width := WizardForm.Width;
WizardForm.WizardBitmapImage2.Height := WizardForm.Height;

FLabel1 := TLabel.Create(WizardForm);
FLabel1.Left := ScaleX(176);
FLabel1.Top := ScaleY(16);
FLabel1.Width := ScaleX(301);
FLabel1.Height := ScaleY(54);
FLabel1.AutoSize := False;
FLabel1.WordWrap := True;
FLabel1.Font.Size := 12;
FLabel1.Font.Style := [fsBold];
FLabel1.Font.Color:= clBlack;
FLabel1.ShowAccelChar := False;
FLabel1.Caption := WizardForm.FinishedHeadingLabel.Caption;
FLabel1.Transparent := True;
FLabel1.Parent := WizardForm.FinishedPage;

FLabel2 :=TLabel.Create(WizardForm);
FLabel2.Top := ScaleY(76);
FLabel2.Left := ScaleX(176);
FLabel2.Width := ScaleX(301);
FLabel2.Height := ScaleY(53);
FLabel2.AutoSize := False;
FLabel2.WordWrap := True;
FLabel2.Font.Color:= clBlack;
FLabel2.ShowAccelChar := False;
FLabel2.Caption := '' #13#13
'';
FLabel2.Transparent := True;
FLabel2.Parent := WizardForm.FinishedPage;

FLabel1.Caption := WizardForm.FinishedHeadingLabel.Caption;
FLabel1.Transparent := True;
FLabel1.Parent := WizardForm.FinishedPage;
WizardForm.WizardBitmapImage2.Width := 497;
WizardForm.WizardBitmapImage2.Height := 313;
FLabel2 :=TLabel.Create(WizardForm);
FLabel2.Top := ScaleY(76);
FLabel2.Left := ScaleX(176);
FLabel2.Width := ScaleX(301);
FLabel2.Height := ScaleY(53);
FLabel2.AutoSize := False;
FLabel2.WordWrap := True;
FLabel2.Font.Color:= clWhite;
end;



procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Res: Integer;
begin
case CurUninstallStep of
usPostUninstall:
begin
//Ïðîâåðÿåì ïðèñóòñòâèå ïàïêè ïîñëå óäàëåíèÿ
If DirExists(ExpandConstant('{userappdata}\FUEL')) then
//Ñîçäàåì äèàëîã ñ òðåìÿ êíîïêàìè
case MsgBox('Óäàëèòü ñîõðàíåíèÿ è íàñòðîéêè èãðû ?', mbInformation, MB_YESNO) of
IDYES:
begin
if not DelTree(ExpandConstant('{userappdata}\FUEL'), True, True, True) then
MsgBox('Ïàïêà íå óäàëåíà.' #13#13 'Ïàïêà èëè îäèí èç ôàéëîâ â íåé çàäåéñòâîâàíû äðóãèì ïðèëîæåíèåì.', mbError, MB_OK);
end;
IDCANCEL:
begin
Exit;
end;
end;
end;
end;
end;

Serega 06-07-2009 23:37 1160622

Raf-9600, объясните поподробней, как понять работать в невидимом режиме? т.е. вы её запускаете и что вы собрались с ней сделать?

Цитата:

Цитата p3rf3ct1c
вот только я не могу догадаться что надо добавить там где я отметил жирным и подчеркнул »

Конкретно для вашего случая:
пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[code]
var
  RunProg: TCheckBox;

procedure CheckBoxChecked;
var
  res: Integer;
begin
  if RunProg.Checked then
  // запускаем gfwlivesetup.exe
  Exec(ExpandConstant('{src}\Redistributables\gfwlivesetup.exe'), '',
      ExpandConstant('{src}\Redistributables'), SW_HIDE, ewWaitUntilTerminated, res);
end;

procedure GreatCheckBox;
begin
  RunProg:= TCheckBox.Create(WizardForm);
  with RunProg do
    begin
      Parent := WizardForm;
      Caption := 'Установить программу?';
      SetBounds(140,330,150,15);
      Cursor:= crHand;
      Checked:= True;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpFinished then GreatCheckBox;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then CheckBoxChecked;
end;


p3rf3ct1c 07-07-2009 00:28 1160651

Serega,
Когда я вставляю ваш код в обычный инсталлятор (только что сделанный) без всяких картинок и т.п. то все работает, а тогда я склеиваю ваш код с моим (я его выложил в моем предыдущем сообщении), то в конце все равно не отображается чекбокс.
Не знаете в чем проблема?

Serega 07-07-2009 00:53 1160663

Цитата:

Цитата p3rf3ct1c
Не знаете в чем проблема? »

Вы совмещайте с одноимёнными процедурами, т.е. CurPageChanged из моего примера с CurPageChanged из вашего скрипта и CurStepChanged соответственно...
читать дальше »
Код:

/////////////////////////////////////////////////////////////////////////////
procedure CheckBoxChecked;
var
  res: Integer;
begin
  if RunProg.Checked then
  // запускаем gfwlivesetup.exe
  Exec(ExpandConstant('{src}\Redistributables\gfwlivesetup.exe'), '',
      ExpandConstant('{src}\Redistributables'), SW_HIDE, ewWaitUntilTerminated, res);
end;

procedure GreatCheckBox;
begin
  RunProg:= TCheckBox.Create(WizardForm);
  with RunProg do
    begin
      Parent := WizardForm;
      Caption := 'Установить программу?';
      SetBounds(140,330,150,15);
      Cursor:= crHand;
      Checked:= True;
    end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: Integer;
begin
  if CurStep = ssInstall then
  StartInstall:= GetTickCount; {a?aiy ia?aea ?aniaeiaee}
  if CurStep = ssPostInstall then
  begin
    UnPackError:= UnPack(Archives)
    if UnPackError = 0 then
      begin
        SetTaskBarTitle(SetupMessage(msgSetupAppTitle));
      end
    else
    begin
      // Error occured, uninstall it then
      Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n); //ioeao onoaiiaee ec-ca ioeaee unarc.dll
      SetTaskBarTitle(SetupMessage(msgErrorTitle))
      WizardForm.Caption:= SetupMessage(msgErrorTitle) +' — '+ cm('ArcBreak')
    end;
  end;
  if CurStep = ssDone then CheckBoxChecked;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;

  if CurPageID = wpSelectDir then
  begin
    WizardForm.BackButton.Enabled := False;
    WizardForm.NextButton.Caption:='Onoaiiaeou';
    GetNeedSpaceCaption;
    if FreeMB < NeedSize then
    WizardForm.NextButton.Enabled:=False
  end;

  if (CurPageID = wpFinished) and (UnPackError <> 0) then
  begin // ?aniaeiauee aa?ioe ioeaeo
    WizardForm.FinishedLabel.Font.Color:= $0000C0; //e?aniue
    WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
    WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
  end;

  if CurPageID = wpFinished then GreatCheckBox;
end;
//////////////////////////////////////////////////////////////


Serega 07-07-2009 01:21 1160681

Raf-9600,
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[code]
////////////////////////////////////////////
//  Данный скрипт прячет чужую программу   
////////////////////////////////////////////

// Отобpажает или пpячет окно обpазом, указанным паpаметpом CmdShow
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';

procedure HideWindow;
var
  Wnd, WndEx: THandle;
  res, i: Integer;
begin
  if FileExists('winmpq\WinMPQ.exe') = True then // проверям наличие файла рядом с инсталлятором
    begin
      // запускаем файл
      if Exec('winmpq\WinMPQ.exe', '', ExpandConstant('{src}\winmpq'), SW_HIDE, ewNoWait, res) then
        repeat
          if FindWindowByWindowName('WinMPQ') > 0 then
            begin
              Wnd:= FindWindowByWindowName('WinMPQ');
              ShowWindow(Wnd, SW_HIDE); // прячем программу... :)
              Break;
            end
          else i:= i+1;
          Sleep(50);
        until (Wnd > 0) or (i = 100); // выходим из цикла, если нашли окно или после пяти секунд
//      ShowWindow(Wnd, SW_HIDE); // прячем программу... :)
    end;
  if Wnd > 0 then ShowWindow(Wnd, SW_HIDE); // с первого раза почему-то не всегда срабатывает... :(
end;

procedure InitializeWizard();
begin
  HideWindow;
end;


p3rf3ct1c 07-07-2009 01:36 1160687

Serega,
Спасибо все получилось!

Raf-9600 07-07-2009 09:07 1160809

Цитата:

Цитата Serega
объясните поподробней, как понять работать в невидимом режиме?»

Нужно чтобы окно программы не отображалось. Т.е. чтоб юзер вобще не подозревал что она сечас работает.

Цитата:

Цитата Serega
т.е. вы её запускаете и что вы собрались с ней сделать? »

Это:
Код:

Filename: "{app}\WinMPQ-SU.exe"; Flags: runhidden; Parameters: s Sound.txt; StatusMsg: "Встраивание озвучки юнитов..."; Components: inMPQ; Flags: skipifdoesntexist
Т.е. как минимум, она будет находиться в {app} :)
И под конец инсталляции, будет несколько раз вызываться, для редактирования MPQ архивов. К примеру, с параметром "s Sound.txt" она должна вызываться только после того как отработает:
Код:

Filename: "{app}\del Ogg [SoundUnit].bat"; Flags: runhidden; StatusMsg: "Удаление лишних файлов..."; Components: SoundUnit;
и т.д.

Цитата:

Цитата Serega
Пример »

Нужно чтобы WinMPQ запускался не вместе с инсталлятором, а так, какбудто его запуск прописан в [Run]. Просто, как минимум, инсталлятор должен сначала установить, и зарегать библиотеки VB4, чтоб WinMPQ мог запуститься.
И кстати, на данный момент, окно WinMPQ таки отображается.

STRATEG-1992 07-07-2009 16:21 1161153

Подскажите пожалуйста 1 как поменять здесь фон
,
(просто у меня в предыдущем стоит и сюда такоеже надо)
И 2 как переименовать эту кнопку?

Serega 07-07-2009 23:22 1161555

Raf-9600, ещё вопрос, программа запускается с ключами и после завершения работы закрывается сама? или её надо принудительно закрывать?

Raf-9600 08-07-2009 07:57 1161715

Serega, закрывается сама.

upd
Ещё одна просьба: ктонить может объединить эти коды:

Слайд-шоу в окне инсталляции
читать дальше »
Код:

#define TIME_FOR_VIEW 10

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
SolidCompression=yes

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

[Files]
Source: InnoCallback.dll; Flags: dontcopy noencryption nocompression solidbreak;
Source: *.bmp; Flags: dontcopy noencryption nocompression solidbreak;

Source: D:\Games\StarCraft enGB\StarDat.mpq; DestDir: {app}

[_code]
const
n=21; //количество слайдов
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TRandNumbers = array[1..N] of byte;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

function get_unique_random_number(X:byte):TRandNumbers;
var
A,b,c: string;
i,j,k:byte;
begin
 For i:=1 to X do A:=A+chr(i);
 B:='';
 For i:=1 to X do begin
  j:=Random(Length(A)-1)+1;
  C:='';
  B:=B + A[j];
  for k:=1 to Length(A) do
  if k<>j then C:=C+A[k];
  A:=C;
 end;
 for i:=1 to X do Result[i]:=ord(B[i]);
end;

var
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;
StatusMessages: TNewStaticText;
bmp: TRandNumbers;
z:byte;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
if (currTime mod {#TIME_FOR_VIEW} = 0)
 then begin
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[currTime/{#TIME_FOR_VIEW}])+'.bmp'));
  if (currTime/{#TIME_FOR_VIEW} = N) then currTime:=0;
 end;
end;


procedure InitializeWizard;
begin
bmp:=get_unique_random_number(N);
ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp');

currTime := 0;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
WizardForm.ProgressGauge.Height := 16;
WizardForm.ProgressGauge.Hide;

WizardForm.StatusLabel.Parent := WizardForm;
WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
WizardForm.StatusLabel.Left := ScaleX(10);
WizardForm.StatusLabel.Width := ScaleX(397);
WizardForm.StatusLabel.Hide;

SplashImage := TBitmapImage.Create(WizardForm);
SplashImage.Top := 0;
SplashImage.Left := 0;
SplashImage.Width := WizardForm.MainPanel.Width;
SplashImage.Height := WizardForm.Bevel.Top;
SplashImage.Parent := WizardForm.InnerPage;
SplashImage.Stretch := True;
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[1])+'.bmp'));
SplashImage.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
for z:=2 to N do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp');
end;
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 5);
TimerID := SetTimer(0, 0, 1000, pfunc);
WizardForm.PageNameLabel.Visible := False;
WizardForm.PageDescriptionLabel.Visible := False;
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
SplashImage.Show;
WizardForm.CancelButton.Enabled := True;
WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100);
end else
begin
WizardForm.ProgressGauge.Hide;
SplashImage.Hide;
WizardForm.FileNameLabel.Hide;
WizardForm.StatusLabel.Hide;
if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
end;
If CurPageID = wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
KillTimer(0, TimerID);
end;


Скрипт для вывода данных о винтах
читать дальше »
Код:

var
  NeedSize:Integer;
  FreeMB, TotalMB: Cardinal;
  NeedSpaceLabel: TLabel;
  n: Integer;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;

procedure GetFreeSpaceCaption(Sender: TObject);
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
  if NeedSize > 1024 then
  NeedSpaceLabel.Caption := 'Требуется как минимум '+ FloatToStr(round(NeedSize/1024*100)/100) + ' Гб свободного дискового пространства.' else
  NeedSpaceLabel.Caption := 'Требуется как минимум '+ IntToStr(NeedSize)+ ' Мб свободного дискового пространства.';end;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

procedure InitializeWizard();
begin
  NeedSize := 6100;                  //Здесь указывается место для приложения
  WizardForm.DiskSpaceLabel.Hide;
  NeedSpaceLabel := TLabel.Create(WizardForm);
  with NeedSpaceLabel do
  begin
  Parent := WizardForm.SelectDirPage;
  Left := ScaleX(0);
  Top := ScaleY(220);
  Width := ScaleX(209);
  Height := ScaleY(13);
  end;
  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
  ListBox.Font.Size:= 9
  ListBox.Font.Style:= []
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;
  WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
  end;

procedure CurPageChanged(CurPageID: Integer);
  begin
  if CurPageID=wpSelectDir then
  begin
  GetNeedSpaceCaption;
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled:=False
  ListBoxRefresh
  end;
  end;


Описания компонентов
читать дальше »
Код:

function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';

function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

var
  Info: TNewStaticText;
  InfoCaption: TNewStaticText;
  InfoPanel: TPanel;

procedure DeinitializeSetup();
begin
  disabledesc();
end;

procedure InitializeWizard();
begin
  WizardForm.TYPESCOMBO.Visible:= false;
  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);
  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;
  InfoPanel.Left := ScaleX(216);
  InfoPanel.Width := ScaleX(200);
  InfoPanel.Height := WizardForm.ComponentsList.Height;
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;
  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := 'ГиКц';
  InfoCaption.Left := ScaleX(224);
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);
  InfoCaption.Font.Color := clActiveCaption;
  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188);
  Info.Top := ScaleY(12);
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
  Info.Caption := 'Переместите ваш указатель мыши на компоненты чтобы увидеть их описание.';
  Info.WordWrap := true;
  enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
      'Английская озвучка;'+ // SoundUnit\eng
      'Французская озвучка;'+ // SoundUnit\fra
      'Немецкая озвучка;'+ // SoundUnit\deu
      'Итальянская озвучка;'+ // SoundUnit\ita
      'Испанская озвучка;' // SoundUnit\spa
      );
end;


Запрет установки в папку Windows
читать дальше »
Код:

Function NextButtonClick(CurPageID: Integer): Boolean; Begin
    Result:= True
    if (CurPageID = wpSelectDir) and (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'), 'Установка в системную папку', MB_YESNO or $30) = idYes;
End;


Поиск нужных файлов
читать дальше »
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;

  if CurPageID = wpReady then
  begin
    if IsComponentSelected('Game\Lokal') then
      if (FileSearch('Install.exe', ExpandConstant('{app}')) = '') then
        if (FileSearch('StarCraft.mpq', ExpandConstant('{app}')) = '') then
      begin
        SuppressibleMsgBox('Файл Install.exe не найден в папке назначения, скопируйте его с' #13 'лицензионного диска StarCraft, в папку, для начала инсталляции.', mbCriticalError, MB_OK, MB_OK);
        Result := False;
      end else
        Result := True;
  end;
end;



upd
И ещё, можно ли заставить Inno, в начале инсталляции, если выбран компонент "Game\Lokal\Backup", заставить запустить виндовское окно копирования файлов, которое бы скопировало некоторые файлы в {app}\Backup?

ALTAIR OC 08-07-2009 20:08 1162351

Вот мой скрипт:
читать дальше »
Код:

[Setup]
AppName=Fallout 3
AppVerName=Fallout 3
DefaultDirName={pf}\My Program
OutputDir=C:\
WizardImageFile=E:\WizardImageFile.bmp
WizardSmallImageFile=E:\WizardSmallImageFile.bmp
 
 
[Languages]
Name: "ENG"; MessagesFile: "compiler:Default.isl"
Name: "RUS"; MessagesFile: "compiler:Languages\Russian.isl"
 
 
[Files]
Source: icon.ico; DestDir: {tmp}; Flags: dontcopy
 
[_code]
Procedure InitializeWizard();
begin
with WizardForm do begin
  Position:=poScreenCenter
  ClientWidth:=690
  ClientHeight:=496
  Font.Color:=clWindow
  Font.Name:='MS Sans Serif'
  Font.Style:=[]
  with Bevel do begin
    Left:=0
    Top:=313
    Width:=497
    Height:=3
    Visible:=False
  end
  with CancelButton do begin
    Left:=600
    Top:=462
    Width:=77
    Height:=25
    BringToFront
  end
  with NextButton do begin
    Left:=500
    Top:=462
    Width:=77
    Height:=25
    BringToFront
  end
  with BackButton do begin
    Left:=206
    Top:=462
    Width:=77
    Height:=25
    BringToFront
  end
  with OuterNotebook do begin
    Left:=0
    Top:=0
    Width:=690
    Height:=496
    with WelcomePage do begin
      Color:=11232829
      with WizardBitmapImage do begin
        Left:=0
        Top:=0
        Width:=690
        Height:=496
      end
      with WelcomeLabel2 do begin
        Left:=205
        Top:=230
        Width:=465
        Height:=100        //ïåðâîå îêíî
      end
      with WelcomeLabel1 do begin
        Left:=205
        Top:=190
        Width:=465
        Height:=28
        Font.Color:=clWindow
        Font.Size:=8
      end
    end
    with InnerPage do begin
      with Bevel1 do begin
        Left:=0
        Top:=58
        Width:=499
        Height:=3
        Visible:=False
      end
      with InnerNotebook do begin
        Left:=205
        Top:=79
        Width:=465
        Height:=354
        BringToFront
        Color:=11232829                      // âòîðîå îêíî(ïóòü óñòàíîâêè)
        with LicensePage do begin
          with LicenseNotAcceptedRadio do begin
            Left:=0
            Top:=338
            Width:=465
            Height:=17
            Checked:=True
          end
          with LicenseAcceptedRadio do begin
            Left:=0
            Top:=130
            Width:=465
            Height:=17
          end
          with LicenseMemo do begin
            Left:=0
            Top:=38
            Width:=465
            Height:=266
            ReadOnly:=True
            ScrollBars:=ssVertical
          end
          with LicenseLabel1 do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=28
          end
        end
        with PasswordPage do begin
          with PasswordEdit do begin
            Left:=0
            Top:=50
            Width:=465
            Height:=21
            Font.Color:=clWindowText
          end
          with PasswordEditLabel do begin
            Left:=0
            Top:=34
            Width:=465
            Height:=14
          end
          with PasswordLabel do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=28
          end
        end
        with InfoBeforePage do begin
          with InfoBeforeMemo do begin
            Left:=0
            Top:=24
            Width:=465
            Height:=327
            ScrollBars:=ssVertical
          end
          with InfoBeforeClickLabel do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=14
          end
        end
        with UserInfoPage do begin
          with UserInfoSerialEdit do begin
            Left:=0
            Top:=120
            Width:=465
            Height:=21
            Font.Color:=clWindowText
          end
          with UserInfoSerialLabel do begin
            Left:=0
            Top:=104
            Width:=465
            Height:=14
          end
          with UserInfoOrgEdit do begin
            Left:=0
            Top:=68
            Width:=465
            Height:=21
            Font.Color:=clWindowText
          end
          with UserInfoOrgLabel do begin
            Left:=0
            Top:=52
            Width:=465
            Height:=14
          end
          with UserInfoNameEdit do begin
            Left:=0
            Top:=16
            Width:=465
            Height:=21
            Font.Color:=clWindowText
          end
          with UserInfoNameLabel do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=14
          end
        end
        with SelectDirPage do begin
          with SelectDirBitmapImage do begin
            Left:=0
            Top:=0
            Width:=32
            Height:=32
            Visible:=False
          end
          with DiskSpaceLabel do begin
            Left:=0
            Top:=340
            Width:=465
            Height:=14
          end
          with DirBrowseButton do begin
            Left:=388
            Top:=288
            Width:=77
            Height:=25
          end
          with DirEdit do begin
            Left:=0
            Top:=290
            Width:=378
            Height:=21
            Font.Color:=clWindowText
          end
          with SelectDirBrowseLabel do begin
            Left:=0
            Top:=24
            Width:=465
            Height:=28
          end
          with SelectDirLabel do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=14
          end
        end
        with SelectComponentsPage do begin
          with ComponentsDiskSpaceLabel do begin
            Left:=0
            Top:=340
            Width:=417
            Height:=14
          end
          with ComponentsList do begin
            Left:=0
            Top:=48
            Width:=465
            Height:=275
            Font.Color:=clWindow
            Color:=11232829
          end
          with TypesCombo do begin
            Left:=0
            Top:=24
            Width:=465
            Height:=21
            Font.Color:=clWindow
            Color:=11232829
          end
          with SelectComponentsLabel do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=14
          end
        end
        with SelectProgramGroupPage do begin
          with SelectGroupBitmapImage do begin
            Left:=0
            Top:=0
            Width:=32
            Height:=32
            Visible:=False
          end
          with NoIconsCheck do begin
            Left:=0
            Top:=337
            Width:=465
            Height:=17
          end
          with GroupBrowseButton do begin
            Left:=388
            Top:=288
            Width:=77
            Height:=25
          end
          with GroupEdit do begin
            Left:=0
            Top:=290
            Width:=378
            Height:=21
            Font.Color:=clWindowText
          end
          with SelectStartMenuFolderBrowseLabel do begin
            Left:=0
            Top:=24
            Width:=465
            Height:=28
          end
          with SelectStartMenuFolderLabel do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=14
          end
        end
        with SelectTasksPage do begin
          with TasksList do begin
            Left:=0
            Top:=34
            Width:=465
            Height:=317
            Color:=11232829
          end
          with SelectTasksLabel do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=28
          end
        end
        with ReadyPage do begin
          with ReadyMemo do begin
            Left:=0
            Top:=34
            Width:=465
            Height:=317
            Color:=11232829
          end
          with ReadyLabel do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=28
          end
        end
        with PreparingPage do begin
          with PreparingErrorBitmapImage do begin
            Left:=0
            Top:=0
            Width:=16
            Height:=16
            Visible:=False
          end
          with PreparingLabel do begin
            Left:=24
            Top:=0
            Width:=393
            Height:=14
            Visible:=False
          end
        end
        with InstallingPage do begin
          with FilenameLabel do begin
            Left:=0
            Top:=16
            Width:=465
            Height:=16
          end
          with StatusLabel do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=16
          end
          with ProgressGauge do begin
            Left:=0
            Top:=42
            Width:=465
            Height:=21
            Min:=0
            Max:=100
          end
        end
        with InfoAfterPage do begin
          with InfoAfterMemo do begin
            Left:=0
            Top:=24
            Width:=465
            Height:=327
            ScrollBars:=ssVertical
          end
          with InfoAfterClickLabel do begin
            Left:=0
            Top:=0
            Width:=465
            Height:=14
          end
        end
      end
      with MainPanel do begin
        Left:=0
        Top:=0
        Width:=690
        Height:=496
        Color:=clWindow
        with WizardSmallBitmapImage do begin
          Left:=0
          Top:=0
          Width:=690
          Height:=496
          BackColor:=clWindow
        end
        with PageDescriptionLabel do begin
          Left:=25
          Top:=25
          Width:=500
          Height:=14
          Color:=6697728
          Font.Color:=clWindow
        end
        with PageNameLabel do begin
          Left:=15
          Top:=7
          Width:=500
          Height:=14
          Color:=6697728
          Font.Color:=clWindow
        end
      end
    end
    with FinishedPage do begin
      Color:=11232829
      with WizardBitmapImage2 do begin
        Left:=0
        Top:=0
        Width:=690
        Height:=496
      end
      with NoRadio do begin
        Left:=205
        Top:=227
        Width:=465
        Height:=17
      end
      with YesRadio do begin
        Left:=205
        Top:=199
        Width:=465
        Height:=17
      end
      with RunList do begin
        Left:=205
        Top:=199
        Width:=465
        Height:=149
        BorderStyle:=bsNone
      end
      with FinishedLabel do begin
        Left:=205
        Top:=119
        Width:=465
        Height:=53
      end
      with FinishedHeadingLabel do begin
        Left:=205
        Top:=79
        Width:=465
        Height:=24
        Font.Color:=clWindow
        Font.Size:=8
      end
    end
  end
  with BeveledLabel do begin
    Left:=10
    Top:=468
    Width:=150
    Height:=14
    Enabled:=False
    Color:=14405068
  end
end
end;



Помогите мне его обьединить со след скриптами:

Запуск фоновой картинки во время инстяляции
читать дальше »
Код:

[Setup]
AppName=Background Image
AppVerName=Background Image
CreateAppDir=false
 
[Files]
Source: BackgroundImage.bmp; DestDir: embedded; Flags: dontcopy noencryption
 
[_code]
function ShowWindow(hWnd, nCmdShow: LongWord): LongWord; external 'ShowWindow@user32.dll stdcall';
 
Procedure BackgroundOnActivate(Sender: TObject); Begin if WizardForm.Visible then WizardForm.Show End;
 
Procedure InitializeWizard;
var BackgroundForm: TForm; BackgroundImage: TBitmapImage;
    Begin
BackgroundForm:= TForm.Create(nil)
    BackgroundForm.BorderStyle:= bsNone
    BackgroundForm.OnActivate:= @BackgroundOnActivate;
    ShowWindow(BackgroundForm.Handle, sw_ShowMaximized)    // ôîíîâîå îêíî íà ïîëíûé ýêðàí
BackgroundImage:= TBitmapImage.Create(BackgroundForm)
    BackgroundImage.Align:= alClient
    BackgroundImage.Stretch:= True
ExtractTemporaryFile('BackgroundImage.bmp')
    BackgroundImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\BackgroundImage.bmp'))
    BackgroundImage.Parent:= BackgroundForm
end;



Позволяет выбрать иконку инсталятора
читать дальше »
Код:

[Setup]
AppName=CheckFile
AppVerName=CheckFile
DefaultDirName={pf}\CheckFile
OutputDir=.
DirExistsWarning=no
 
[Files]
Source: icon.ico; DestDir: {tmp}; Flags: dontcopy
 
[_code]
function LoadImage(hInst: THandle; ImageName: PChar; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle; external 'LoadImageA@user32.dll stdcall delayload';
 
Procedure InitializeWizard;
Begin
  ExtractTemporaryFile('icon.ico');
  SendMessage(WizardForm.Handle, $80, 0, LoadImage(0,ExpandConstant('{tmp}')+'\icon.ico',1,16,16,$1010));
End;


ALTAIR OC 08-07-2009 20:16 1162355

Cкрипт для распаковки arc архивов
читать дальше »
Код:

;[English] 
;Example of using unarc.dll for decompression of FreeArc archives with displaying of progress indicator in Inno Setup window 

;[Russian] 
;Пример распаковки FreeArc архива при помощи unarc.dll, с отображением прогресс бара в окне Inno Setup. 
;Один архив можно слить с инсталятором, если их общий размер не более 2Гб, через "copy /b setup.exe+xxx.arc newsetup.exe" и указать в коде Archives = '{srcexe}' 

; Изменения от Victor_Dobrov, 02-07-2009 
;  - Кнопка инсталлятора в панели задач отображает время до завершения обработки всех архивов и общий процент распаковки. 
;  - в Unicode-версиях инсталлятора правильно отображаются имена файлов. 

; Изменения от CTACKo & SotM'а. 01-07-2009 
;  - Правильно создаются папки, если в пути установки встречаются русские буквы 
;  - При компиляции определяется использование PAnsiChar/PChar. Можно использовать как обычную так и UNICODE версию с установленным препроцессором. 

; Изменения от SotM'а. 23-06-2009 
;  - Нижний прогресс бар сместил чуть-чуть вниз, чтобы было видно имя распаковываемого файла. 
;  - Русские имена файлов теперь правильно отображаются. 
;  - При нажатии "отмены" при распаковке теперь появляется запрос на подтверждение отмены. 
;  - Переименовал некоторые переменные, чтобы их имена несли больше информации. 
;  - Немного переформатировал сам исходный код для более удобного и понятного чтения. 
;  - Исправил пару сообщений на английском языке. 
 
; Изменения от Victor_Dobrov, 15-06-2009 
;  - оптимизация и локализация скрипта, более подробная строка статуса, общий прогресс-бар, при неудачной распаковке выполняется откат (деинсталляция) и показывается текст ошибки. 
 
; Bulat Ziganshin, 13-06-2009 
;  - создание библиотеки unarc.dll и скрипта распаковки freearc_example.iss. 
 
[Setup] 
AppName=FreeArc Example 
AppVerName=FreeArc Example 1.2 
DefaultDirName={pf}\FreeArc Example 
UsePreviousAppDir=false 
DirExistsWarning=no 
ShowLanguageDialog=auto 
OutputBaseFilename=FreeArcExample 
OutputDir=. 
VersionInfoCopyright=Bulat Ziganshin, Victor Dobrov, SotM, CTACKo 
 
[Languages] 
Name: eng; MessagesFile: compiler:Default.isl 
Name: rus; MessagesFile: compiler:Languages\Russian.isl 
 
[CustomMessages] 
eng.ArcCancel=Cancel installation 
eng.ArcBreak=Installation cancelled! 
eng.ArcInfo=Extracted %1 Mb of %2 Mb (%3%%). Archive: %4 of %5. 
eng.ArcTitle=Extracting FreeArc archive 
eng.ArcError=Decompression failed with error code %1 
eng.ArcFail=Decompression failed! 
eng.AllProgress=Overall extraction progress: %1%% 
eng.ArcBroken=Archive %1 is damaged%nor not enough free space. 
eng.Extracting=Extracting: %1 
eng.remains=%1%%, %2 elapsed 
eng.LongTime=at no time 
eng.ending=ending 
 
rus.ArcCancel=Отменить распаковку 
rus.ArcBreak=Установка прервана! 
rus.ArcInfo=Распаковано %1 Мб из %2 Мб (%3%%). Архив: %4 из %5. 
rus.ArcTitle=Распаковка архивов FreeArc 
rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1 
rus.ArcFail=Распаковка не завершена! 
rus.AllProgress=Общий прогресс распаковки: %1%% 
rus.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения. 
rus.Extracting=Распаковывается: %1 
rus.remains=%1%%, жди %2 
rus.LongTime=вечно 
rus.ending=завершение 
 
[Files] 
;Source: *.arc; DestDir: {app}; Flags: nocompression 
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall 
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy 
 
[UninstallDelete] 
Type: filesandordirs; Name: {app} 
 
[_code] 
const 
    Archives = '{src}\*.arc';    // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно 
 
    PM_REMOVE = 1; 
    CP_ACP = 0; CP_UTF8 = 65001; 
 
type 
#ifdef UNICODE  ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup 
    #define A "W" 
#else 
    #define A "A"  ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии 
    PAnsiChar = PChar;  // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже) 
#endif 
#if Ver < 84018176 
    AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and below (для Inno Setup версий 5.2.4 и выше эта строка не нужна) 
#endif 
 
    TMyMsg = record 
        hwnd: HWND; 
        message: UINT; 
        wParam: Longint; 
        lParam: Longint; 
        time: DWORD; 
        pt: TPoint; 
    end; 
 
    TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer; 
    TArc = record Path: string; Size: Extended; end; 
 
var 
    ProgressBar: TNewProgressBar; 
    ExtractFile: TNewStaticText; 
    lblExtractFileName: TLabel; 
    btnCancelUnpacking:    TButton; 
    CancelCode, n, UnPackError, StartInstall: Integer; 
    Arcs: array of TArc; 
    msgError: string; 
    m: Extended; 
 
Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall'; 
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall'; 
 
function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall'; 
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall'; 
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall'; 
 
Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall'; 
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload'; 
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload'; 
 
function GetTickCount: DWord; external 'GetTickCount@kernel32'; 
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall'; 
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl'; 
 
procedure AppProcessMessage; 
var 
    Msg: TMyMsg; 
begin 
    while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do begin 
        TranslateMessage(Msg); 
        DispatchMessage(Msg); 
    end; 
end; 
 
Function NumToStr(Float: Extended): String; {Перевод числа в строку с точностью 3 знака (%.3n) с округлением дробной части, если она есть} 
Begin 
    Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.'); while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do SetLength(Result, Length(Result)-1); 
End; 
 
function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End; 
 
Function Size64(Hi, Lo: Integer): Extended; 
Begin 
    Result:= Lo; if Lo< 0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2; for Hi:= Hi-1 Downto 0 do Result:= Result + $7FFFFFFF + $7FFFFFFF + 2; 
End; 
 
// OnClick event function for btnCancel 
procedure btnCancelUnpackingOnClick(Sender: TObject); 
begin 
    if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then 
        CancelCode:= -127; 
end; 
 
// Scans the specified folders for archives and add them to list 
function FindArcs(dir: string): Extended; 
var 
    FSR: TFindRec; 
Begin 
    if FindFirst(ExpandConstant(dir), FSR) then 
    try 
        repeat 
            // Skip everything but the folders 
            if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE; 
            n:= GetArrayLength(Arcs); 
            // Expand the folder list 
            SetArrayLength(Arcs, n +1); 
            Arcs[n].Path:= ExtractFilePath(ExpandConstant(Archives)) + FSR.Name; 
            Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow); 
            Result:= Result + Arcs[n].Size; 
        until not FindNext(FSR); 
    finally 
        FindClose(FSR); 
    end; 
End; 
 
// Converts OEM encoded string into ANSI 
// Преобразует OEM строку в ANSI кодировку 
function OemToAnsiStr( strSource: AnsiString): AnsiString; 
var 
    nRet : longint; 
begin 
    SetLength( Result, Length( strSource ) ); 
    nRet:= OemToChar( strSource, Result ); 
end; 
 
// Converts ANSI encoded string into UTF-8 
// Преобразует строку из ANSI в UTF-8 кодировку 
function AnsiToUtf8( strSource: string ): string; 
var 
    nRet : integer; 
    WideCharBuf: string; 
    MultiByteBuf: string; 
begin 
    strSource:= strSource + chr(0); 
    SetLength( WideCharBuf, Length( strSource ) * 2 ); 
    SetLength( MultiByteBuf, Length( strSource ) * 2 ); 
 
    nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) ); 
    nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0); 
 
    Result:= MultiByteBuf; 
end; 
 
// Sets the TaskBar title 
Procedure SetTaskBarTitle(Title: String); var h: Integer; 
Begin 
    h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title); 
End; 
 
// Converts milliseconds to standart time 
Function TicksToTime(Ticks: DWord; detail: Boolean): String; Begin {милисекунды в стандартное время} 
    if detail or (Ticks/3600 >= 1000) {hour} then if Ticks/3600000 > 23 then Result:= cm('LongTime') else Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)  else if Ticks/60 < 1000 {min} then Result:= IntToStr(Ticks/1000) +'.'+ NumToStr(trunc((Ticks/1000 - trunc(Ticks/1000))*10)) +'s' else Result:= IntToStr(Ticks/60000) +'m '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +'s'; 
End; 
 
// The main callback function for unpacking FreeArc archives 
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer; 
var 
    percents, Elapsed: Integer; 
begin 
    if string(what)='filename' then 
        // Update FileName label 
        lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] ) 
    else 
        if (string(what)='progress') and (sizeArc>0) then 
            // Update progress bar with additional info 
            with WizardForm.ProgressGauge do 
            begin 
                // Calculate current percents 
                percents:= (Mb*1000) div sizeArc; 
                ProgressBar.Position:= percents; 
                ExtractFile.Caption:= FmtMessage(cm('ArcInfo'), [IntToStr(Mb), IntToStr(sizeArc), Format('%.1n', [Abs(percents/10)]), IntToStr(n+1), IntToStr(GetArrayLength(Arcs)) ]); 
                Position:= Tag + round(ProgressBar.Position * m) 
                 
                percents:= (Position-Min)/((Max - Min)/1000) 
                WizardForm.FileNameLabel.Caption:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]); 
                if position > 0 then Elapsed:= trunc((GetTickCount - StartInstall) * Abs((max - position)/position)) else Elapsed:= 0; 
                // Update the taskbar title 
                if Elapsed = 0 then SetTaskBarTitle(cm('ending')) else SetTaskBarTitle(FmtMessage(cm('remains'), [IntToStr(percents/10), TicksToTime(Elapsed, false)])); 
            end; 
    AppProcessMessage; 
    Result:= CancelCode; 
end; 
 
// Extracts all found archives 
function UnPack(Archives: string): Integer; 
var 
    allSize: Extended; 
    callback: longword; 
    FreeMB, TotalMB: Cardinal; 
begin 
    // Show the 'Cancel unpacking' button and set it as default button 
    btnCancelUnpacking.Show; 
    WizardForm.ActiveControl:= btnCancelUnpacking; 
    WizardForm.ProgressGauge.Position:= 0; 
    WizardForm.ProgressGauge.Max:= 1000; 
    // Get the size of all archives 
    allSize:= FindArcs(Archives); 
 
    for n:= 0 to GetArrayLength(Arcs) -1 do 
    begin 
        m:= Arcs[n].Size/allSize;    // Size of the current archive (объём текущего архива) 
        WizardForm.ProgressGauge.Tag:= WizardForm.ProgressGauge.Position; 
        CancelCode:= 0; 
        AppProcessMessage; 
        callback:= WrapFreeArcCallback(@FreeArcCallback,4);  //FreeArcCallback has 4 arguments 
        try 
            // Pass the specified arguments to 'unarc.dll' 
            Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', Arcs[n].Path, '', '', '', '', ''); 
            if Result = 0 then Result:= CancelCode; 
        except 
            Result:= -63;  //    ArcFail 
        end; 
 
        // Error occured 
        if Result <> 0 then 
        begin 
            msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]); 
            GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB); 
            case Result of 
                -1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle) 
                    else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]); 
                -127:  msgError:= cm('ArcBreak');    //Cancel button 
                -63:    msgError:= cm('ArcFail'); 
            end; 
//          MsgBox(msgError, mbInformation, MB_OK);    //сообщение показывается на странице завершения 
            Log(msgError); 
            Break;    //прервать цикл распаковки 
        end; 
    end; 
    // Hide the button 
    btnCancelUnpacking.visible:= false; 
end; 
 
procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    if CurStep = ssInstall then StartInstall:= GetTickCount;    {время начала распаковки} 
    if CurStep = ssPostInstall then 
    begin 
        UnPackError:= UnPack(Archives) 
        if UnPackError = 0 then 
            SetTaskBarTitle(SetupMessage(msgSetupAppTitle)) 
        else 
        begin 
            // Error occured, uninstall it then 
            Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);    //откат установки из-за ошибки unarc.dll 
            SetTaskBarTitle(SetupMessage(msgErrorTitle)) 
            WizardForm.Caption:= SetupMessage(msgErrorTitle) +' — '+ cm('ArcBreak') 
        end; 
    end; 
end; 
 
//    стандартный способ отката (не нужна CurPageChanged), но архивы распаковываются до извлечения файлов инсталлятора 
//    if CurStep = ssInstall then 
//      if UnPack(Archives) <> 0 then Abort; 
 
Procedure CurPageChanged(CurPageID: Integer); 
Begin 
    if (CurPageID = wpFinished) and (UnPackError <> 0) then 
    begin // распаковщик вернул ошибку 
        WizardForm.FinishedLabel.Font.Color:= $0000C0;    //красный 
        WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2; 
        WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError; 
    end; 
End; 
 
procedure InitializeWizard(); 
begin 
    ProgressBar:= TNewProgressBar.Create(WizardForm); 
    ExtractFile:=TNewStaticText.Create(WizardForm); 
    lblExtractFileName:= TLabel.Create( WizardForm ); 
    with WizardForm.ProgressGauge do 
    begin 
        // Create a label to show current FileName being extracted 
        lblExtractFileName.parent:=WizardForm.InstallingPage; 
        lblExtractFileName.autosize:=false; 
        lblExtractFileName.Width:= Width; 
        lblExtractFileName.top:=Top + ScaleY(35); 
        lblExtractFileName.Caption:= ''; 
 
        // Create a label to show percentage 
        ExtractFile.parent:=WizardForm.InstallingPage; 
        ExtractFile.autosize:=false; 
        ExtractFile.Width:= Width; 
        ExtractFile.top:=lblExtractFileName.Top + ScaleY(16); 
        ExtractFile.caption:=cm('ArcTitle'); 
 
        // Create a separate progress bar 
        ProgressBar.SetBounds(Left, ExtractFile.Top + ScaleY(16), Width, Height); 
        ProgressBar.Parent:= WizardForm.InstallingPage; 
        ProgressBar.max:= 1000; 
        ProgressBar.Position:= 0; 
    end; 
 
    // Create a 'Cancel unpacking' button and hide it for now. 
    btnCancelUnpacking:=TButton.create(WizardForm); 
    btnCancelUnpacking.Parent:= WizardForm; 
    btnCancelUnpacking.SetBounds(260, WizardForm.cancelbutton.top, 135, WizardForm.cancelbutton.Height); 
    btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick; 
    btnCancelUnpacking.Caption:= cm('ArcCancel'); 
    btnCancelUnpacking.Hide; 
end;



Скрипт для вывода данных о винтах
читать дальше »
Код:

var
  NeedSize:Integer;
  FreeMB, TotalMB: Cardinal;
  NeedSpaceLabel: TLabel;
  n: Integer;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;

procedure GetFreeSpaceCaption(Sender: TObject);
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
  if NeedSize > 1024 then
  NeedSpaceLabel.Caption := 'Требуется как минимум '+ FloatToStr(round(NeedSize/1024*100)/100) + ' Гб свободного дискового пространства.' else
  NeedSpaceLabel.Caption := 'Требуется как минимум '+ IntToStr(NeedSize)+ ' Мб свободного дискового пространства.';end;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

procedure InitializeWizard();
begin
  NeedSize := 6100;                  //Здесь указывается место для приложения
  WizardForm.DiskSpaceLabel.Hide;
  NeedSpaceLabel := TLabel.Create(WizardForm);
  with NeedSpaceLabel do
  begin
  Parent := WizardForm.SelectDirPage;
  Left := ScaleX(0);
  Top := ScaleY(220);
  Width := ScaleX(209);
  Height := ScaleY(13);
  end;
  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
  ListBox.Font.Size:= 9
  ListBox.Font.Style:= []
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;
  WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
  end;

procedure CurPageChanged(CurPageID: Integer);
  begin
  if CurPageID=wpSelectDir then
  begin
  GetNeedSpaceCaption;
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled:=False
  ListBoxRefresh
  end;
  end;



Этот скрипт нужен для того чтобы можно было ставить чекбоксы(создания ярлыка на раб столе, установка DX и.т.д)
читать дальше »
Код:

[_code]
// Эти знчения привязываются к файлам и иконкам
function InstallDirectX: Boolean;
begin
  Result:= DirectX.Checked;
end;
 
function InstallRedist: Boolean;
begin
  Result:=Redist.Checked;
end;
 
function CreateIcons: Boolean;
begin
  Result:=Icons.Checked;
end;
 
function GroupIcons: Boolean;
begin
  Result:=Group.Checked;
end;
// задал процедуру, чтоб отмечался чебокс еси кликнуть по надписи lblCheckBox
procedure lblRedistOnClick(Sender: TObject);
begin
  if Redist.Checked = False then
    Redist.Checked:= True else
  Redist.Checked:= False;
end;
 
procedure lblDirectXOnClick(Sender: TObject);
begin
  if DirectX.Checked = False then
    DirectX.Checked:= True else
  DirectX.Checked:= False;
end;
 
procedure IconsOnClick(Sender: TObject);
begin
  if Icons.Checked = False then
    Icons.Checked:= True else
  Icons.Checked:= False;
end;
 
procedure GroupOnClick(Sender: TObject);
begin
  if Group.Checked = False then
    Group.Checked:= True else
  Group.Checked:= False;
end;
// Сами чекбоксы и лейблы к ним
procedure InitializeWizard();
  DirectX:= TCheckBox.Create(WizardForm);
  with DirectX do
  begin
    Parent:= WizardForm.SelectDirPage;
    Left:= WizardForm.DirEdit.Left + 200;
    Top:= WizardForm.DirEdit.Top + 35;
    Width:= ScaleX(14);
    Height:= ScaleY(14);
    TabOrder:= 0;
    Checked:= False;
  end;
 
  // создаём надпись для CheckBox'а
  lblDirectX:= TLabel.Create(WizardForm);
  with lblDirectX do
  begin
    Caption:= ExpandConstant('{cm:DRT}');
    Left:= WizardForm.DirEdit.Left + 220;
    Top:= WizardForm.DirEdit.Top + 35;
    Width:= ScaleX(150);
    Height:= ScaleY(13);
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
    OnClick:= @lblDirectXOnClick;
  end;
 
Redist:= TCheckBox.Create(WizardForm);
  with Redist do
  begin
    Parent:= WizardForm.SelectDirPage;
    Left:= WizardForm.DirEdit.Left + 200;
    Top:= WizardForm.DirEdit.Top + 70;
    Width:= ScaleX(14);
    Height:= ScaleY(14);
    TabOrder:= 1;
    Checked:= False;
  end;
 
lblRedist:= TLabel.Create(WizardForm);
  with lblRedist do
  begin
    Caption:='Установить MS Visual C++ 2005';
    Left:= WizardForm.DirEdit.Left + 220;
    Top:= WizardForm.DirEdit.Top + 70;
    Width:= ScaleX(150);
    Height:= ScaleY(13);
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
    OnClick:= @lblRedistOnClick;
  end;
 
Icons:= TCheckBox.Create(WizardForm);
  with Icons do
  begin
    Parent:= WizardForm.SelectDirPage;
    Left:= WizardForm.DirEdit.Left;
    Top:= WizardForm.DirEdit.Top + 35;
    Width:= ScaleX(14);
    Height:= ScaleY(14);
    TabOrder:= 2;
    Checked:= False;
  end;
 
lblIcons:= TLabel.Create(WizardForm);
  with lblIcons do
  begin
    Caption:='Создать ярлык на рабочем столе';
    Left:= WizardForm.DirEdit.Left + 20;
    Top:= WizardForm.DirEdit.Top + 35;
    Width:= ScaleX(150);
    Height:= ScaleY(13);
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
    OnClick:= @IconsOnClick;
  end;
 
Group:= TCheckBox.Create(WizardForm);
  with Group do
  begin
    Parent:= WizardForm.SelectDirPage;
    Left:= WizardForm.DirEdit.Left;
    Top:= WizardForm.DirEdit.Top + 70;
    Width:= ScaleX(14);
    Height:= ScaleY(14);
    TabOrder:= 3;
    Checked:= False;
  end;
 
lblGroup:= TLabel.Create(WizardForm);
  with lblGroup do
  begin
    Caption:='Создать ярлыки в меню "Пуск"';
    Left:= WizardForm.DirEdit.Left + 20;
    Top:= WizardForm.DirEdit.Top + 70;
    Width:= ScaleX(150);
    Height:= ScaleY(13);
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
    OnClick:= @GroupOnClick;
  end;



Как сделать чтоб под текстом был не синий фон а прозрачный
http://imageshost.ru/links/64f37ed02...61ef008858a88a

И как нибудь прикруть проверку системы(что за проц, ОС, ОЗУ)
http://victor-dobrov.narod.ru/InnoSe..._SystemTest.7z

Помогите пожалуйста!!!

Сори за два поста подряд, просто в один пост все скрипты не помещаются.

Serega 08-07-2009 22:52 1162479

Raf-9600,
Попробуйте
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: SoundUnit; Description: Описание SoundUnit; Types: full custom
Name: inMPQ; Description: Описание inMPQ; Types: full

[Run]
Filename: {app}\del Ogg [SoundUnit].bat; StatusMsg: Удаление лишних файлов...; Components: SoundUnit; Afterinstall: Ext; Flags: runhidden

[code]
////////////////////////////////////////////
//  Данный скрипт прячет чужую программу   
////////////////////////////////////////////

type
  _TMsg = record
    hwnd: HWND;
    message: LongWord;
    wParam: Longint;
    lParam: Longint;
    time: LongWord;
    pt: TPoint;
  end;

const
  WM_CLOSE            = $0010;
  WM_QUIT            = $0012;
  PM_REMOVE          = 1;

// отобpажает или пpячет окно обpазом, указанным паpаметpом CmdShow
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';
// запускает указанный файл, с параметрами указанными в CmdShow
function WinExec(lpCmdLine: PChar; uCmdShow: Cardinal): Cardinal;
  external 'WinExec@kernel32.dll stdcall';

// пpовеpяет очеpедь пpикладной задачи на сообщение и копиpует его в Msg,
// если в очеpеди нет сообщений, функция выполняет немедленный возвpат и пеpедает упpавление Windows.
function PeekMessage(var lpMsg: _TMsg; hWnd: HWND;
  wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
// пеpеводит комбинации  wm_KeyDown/Up в wm_Char или wm_DeadChar и комбинации wm_SysKeyDown/Up в wm_SysChar или
// wm_SysDeadChar и напpавляет символьное сообщение в очеpедь пpикладной задачи.
function TranslateMessage(const lpMsg: _TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
// пеpедает в Msg сообщение оконной функции окна
function DispatchMessage(const lpMsg: _TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

var
  cap_win: string;
  _res: Boolean;
// сообщаем, что уже можно запускать RunProg
procedure Ext;
begin
  _res:= True;
end;

procedure Application_ProcessMessages;
var
  Msg: _TMsg;
begin
  while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end;

procedure RunProg(file, param, capt, mes: string; wait: Boolean);
var
  Wnd: THandle;
  i, ID: Integer;
begin
  cap_win:= capt;
  if FileExists(file) = True then // проверям наличие файла рядом с инсталлятором
    begin
      // показываем своё сообщение
      if mes <> '' then WizardForm.StatusLabel.Caption:= mes;
      // запускаем файл
      ID:= WinExec(AddQuotes(file + param), SW_HIDE);
      if ID > 32 then
        repeat
          if FindWindowByWindowName(capt) > 0 then
            begin
              Wnd:= FindWindowByWindowName(capt);
              ShowWindow(Wnd, SW_HIDE); // прячем программу... :)
              Break;
            end
          else Sleep(10);
          i:= i+1;
        until (Wnd > 0) or (i = 500) // выходим из цикла, если нашли окно или после пяти секунд
      else
        begin
          MsgBox('Ошибка при запуске файла: ' + ExtractFileName(file), mbInformation, MB_OK);
          Exit;
        end;
      // если надо подождать, то ждём пока программа не закроется... 
      if wait = True then
        while FindWindowByWindowName(capt) > 0 do
          Application_ProcessMessages;
      WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
    end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  n: Integer;
begin
  if (CurStep = ssPostInstall) and (IsComponentSelected('inMPQ')) then
    begin
      n:= 0;
      while _res = False do
        begin
          n:= n + 1;
          Application_ProcessMessages;
          if n = 60000 then Break;
        end;
        RunProg(ExpandConstant('{src}\winmpq\WinMPQ.exe'), // расположение программы
                ' s Sound.txt',                            // параметр запуска
                'WinMPQ',                                  // заголовок окна программы
                'Встраивание озвучки юнитов...',          // сообщение в окне мастера
                True);                                    // True - ждать завершения программы
    end;
end;


Raf-9600 08-07-2009 23:28 1162503

Serega, Хм.. Возможно конечно я где-то опечатался, но сечас, когда WinMPQ должен запуститься, светиться "Ошибка при запуске файла: WinMPQ.exe".

читать дальше »
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=zip
SolidCompression=yes

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

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: SoundUnit; Description: Описание SoundUnit; Types: full custom
Name: inMPQ; Description: Описание inMPQ; Types: full


[Files]
Source: D:\Русификатор AiO\-Технические-\Ogg - Wav\libvorbis.dll; DestDir: {app}
Source: D:\Русификатор AiO\-Технические-\Ogg - Wav\libvorbisfile.dll; DestDir: {app}
Source: D:\Русификатор AiO\-Технические-\Ogg - Wav\oggdec.exe; DestDir: {app}
Source: D:\Русификатор AiO\-Технические-\Ogg - Wav\libFLAC_dynamic.dll; DestDir: {app}
Source: D:\Русификатор AiO\-Технические-\Ogg - Wav\libogg.dll; DestDir: {app}
Source: D:\Русификатор AiO\-Технические-\inMPQ\SFmpq.dll; DestDir: {app}
Source: D:\Русификатор AiO\-Технические-\inMPQ\WinMPQ.exe; DestDir: {app}

Source: D:\Русификатор AiO\SC1\Юниты\del Wav [SoundUnit].bat; DestDir: {app}
Source: D:\Русификатор AiO\SC1\Юниты\inWAV [SoundUnit].bat; DestDir: {app}
Source: D:\Русификатор AiO\SC1\Юниты\del Ogg [SoundUnit].bat; DestDir: {app}
Source: D:\Русификатор AiO\SC1\Юниты\DE\Sound.txt; DestDir: {app}
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\advisor\paderr00.ogg; DestDir: {app}\sound\protoss\advisor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\advisor\paderr01.ogg; DestDir: {app}\sound\protoss\advisor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\advisor\paderr02.ogg; DestDir: {app}\sound\protoss\advisor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\advisor\paderr06.ogg; DestDir: {app}\sound\protoss\advisor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\advisor\padupd00.ogg; DestDir: {app}\sound\protoss\advisor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\advisor\padupd01.ogg; DestDir: {app}\sound\protoss\advisor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\advisor\padupd02.ogg; DestDir: {app}\sound\protoss\advisor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\advisor\padupd04.ogg; DestDir: {app}\sound\protoss\advisor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\advisor\padupd06.ogg; DestDir: {app}\sound\protoss\advisor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabcag00.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabdth00.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabfol00.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabfol01.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabfol02.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabfol03.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabpss00.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabpss01.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabpss02.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabpss03.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabpss04.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabrdy00.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabwht00.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabwht01.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabwht02.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabwht03.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabyes00.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabyes01.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabyes02.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\arbiter\pabyes03.ogg; DestDir: {app}\sound\protoss\arbiter
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\pardth00.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\parmin00.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\parpss00.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\parpss01.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\parpss02.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\parpss03.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\parrdy00.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\parwht00.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\parwht01.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\parwht02.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\parwht03.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\paryes00.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\paryes01.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\paryes02.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\archon\paryes03.ogg; DestDir: {app}\sound\protoss\archon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pacwht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\paswht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pbaact00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pbawht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pbewht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pciwht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pfowht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pgawht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pgcwht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pnawht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pnewht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\ppbwht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\ppywht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\prowht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pstwht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\ptrwht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\bldg\pwawht00.ogg; DestDir: {app}\sound\protoss\bldg
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcadth00.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcadth01.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcapss00.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcapss01.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcapss02.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcapss03.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcardy00.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcawht00.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcawht01.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcawht02.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcawht03.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcayes00.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcayes01.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcayes02.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\carrier\pcayes03.ogg; DestDir: {app}\sound\protoss\carrier
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtdth00.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtpss00.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtpss01.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtpss02.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtpss03.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtwht00.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtwht01.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtwht02.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtwht03.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtyes00.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtyes01.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtyes02.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\darktemplar\pdtyes03.ogg; DestDir: {app}\sound\protoss\darktemplar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrdth00.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrpss00.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrpss01.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrpss02.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrpss03.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrrdy00.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrwht00.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrwht01.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrwht02.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrwht03.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrwht04.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrwht05.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrwht06.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdrwht07.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdryes00.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdryes01.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdryes02.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdryes03.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdryes04.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdryes05.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\dragoon\pdryes06.ogg; DestDir: {app}\sound\protoss\dragoon
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdpss00.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdpss01.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdpss02.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdpss03.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdwht00.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdwht01.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdwht02.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdwht03.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdyes00.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdyes01.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdyes02.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixd\ufdyes03.ogg; DestDir: {app}\sound\protoss\fenixd
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufedth00.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufepss00.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufepss01.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufepss02.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufepss03.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufewht00.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufewht01.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufewht02.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufewht03.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufeyes00.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufeyes01.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufeyes02.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\fenixz\ufeyes03.ogg; DestDir: {app}\sound\protoss\fenixz
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcpss00.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcpss01.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcpss02.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcpss03.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcwht00.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcwht01.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcwht02.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcwht03.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcyes00.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcyes01.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcyes02.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\gantrithor\utcyes03.ogg; DestDir: {app}\sound\protoss\gantrithor
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\intercep\pinlau00.ogg; DestDir: {app}\sound\protoss\intercep
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\ppratt00.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\ppratt01.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprdth00.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprerr00.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprerr01.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprmin00.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprpss00.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprpss01.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprpss02.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprpss03.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprrdy00.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprwht00.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprwht01.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprwht02.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\pprwht03.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\ppryes00.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\ppryes01.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\ppryes02.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\probe\ppryes03.ogg; DestDir: {app}\sound\protoss\probe
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscdth00.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscpss00.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscpss01.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscpss02.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscpss03.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscpss04.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscrdy00.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscwht00.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscwht01.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscwht02.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscwht03.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscyes00.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscyes01.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscyes02.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\scout\pscyes03.ogg; DestDir: {app}\sound\protoss\scout
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshbld00.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshbld01.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshbld02.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshbld03.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshbld04.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshdth00.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshpss00.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshpss01.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshpss02.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshpss03.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshpss04.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshrdy00.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshwht00.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshwht01.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshwht02.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshwht03.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshyes00.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshyes01.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshyes02.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\shuttle\pshyes03.ogg; DestDir: {app}\sound\protoss\shuttle
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\tassadar\utadth00.ogg; DestDir: {app}\sound\protoss\tassadar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\tassadar\utapss00.ogg; DestDir: {app}\sound\protoss\tassadar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\tassadar\utapss01.ogg; DestDir: {app}\sound\protoss\tassadar
Source: D:\Русификатор AiO\SC1\Юниты\DE\sound\protoss\tassadar\utapss02.ogg; DestDir: {app}\sound\protoss\tassadar



[Run]
Filename: {app}\inWAV [SoundUnit].bat; StatusMsg: inWAV [SoundUnit]...; Components: SoundUnit; Flags: runhidden
Filename: {app}\del Ogg [SoundUnit].bat; StatusMsg: Удаление лишних файлов...; Components: SoundUnit; Afterinstall: Ext; Flags: runhidden
Filename: {app}\del Wav [SoundUnit].bat; StatusMsg: del Wav [SoundUnit]...; Components: SoundUnit; Flags: runhidden



[code]
////////////////////////////////////////////
// Данный скрипт прячет чужую программу
////////////////////////////////////////////

type
_TMsg = record
hwnd: HWND;
message: LongWord;
wParam: Longint;
lParam: Longint;
time: LongWord;
pt: TPoint;
end;

const
WM_CLOSE = $0010;
WM_QUIT = $0012;
PM_REMOVE = 1;

// отобpажает или пpячет окно обpазом, указанным паpаметpом CmdShow
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';
// запускает указанный файл, с параметрами указанными в CmdShow
function WinExec(lpCmdLine: PChar; uCmdShow: Cardinal): Cardinal;
external 'WinExec@kernel32.dll stdcall';

// пpовеpяет очеpедь пpикладной задачи на сообщение и копиpует его в Msg,
// если в очеpеди нет сообщений, функция выполняет немедленный возвpат и пеpедает упpавление Windows.
function PeekMessage(var lpMsg: _TMsg; hWnd: HWND;
wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
// пеpеводит комбинации wm_KeyDown/Up в wm_Char или wm_DeadChar и комбинации wm_SysKeyDown/Up в wm_SysChar или
// wm_SysDeadChar и напpавляет символьное сообщение в очеpедь пpикладной задачи.
function TranslateMessage(const lpMsg: _TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
// пеpедает в Msg сообщение оконной функции окна
function DispatchMessage(const lpMsg: _TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

var
cap_win: string;
_res: Boolean;
// сообщаем, что уже можно запускать RunProg
procedure Ext;
begin
_res:= True;
end;

procedure Application_ProcessMessages;
var
Msg: _TMsg;
begin
while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

procedure RunProg(file, param, capt, mes: string; wait: Boolean);
var
Wnd: THandle;
i, ID: Integer;
begin
cap_win:= capt;
if FileExists(file) = True then // проверям наличие файла рядом с инсталлятором
begin
// показываем своё сообщение
if mes <> '' then WizardForm.StatusLabel.Caption:= mes;
// запускаем файл
ID:= WinExec(AddQuotes(file + param), SW_HIDE);
if ID > 32 then
repeat
if FindWindowByWindowName(capt) > 0 then
begin
Wnd:= FindWindowByWindowName(capt);
ShowWindow(Wnd, SW_HIDE); // прячем программу... :)
Break;
end
else Sleep(10);
i:= i+1;
until (Wnd > 0) or (i = 500) // выходим из цикла, если нашли окно или после пяти секунд
else
begin
MsgBox('Ошибка при запуске файла: ' + ExtractFileName(file), mbInformation, MB_OK);
Exit;
end;
// если надо подождать, то ждём пока программа не закроется...
if wait = True then
while FindWindowByWindowName(capt) > 0 do
Application_ProcessMessages;
WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
n: Integer;
begin
if (CurStep = ssPostInstall) and (IsComponentSelected('inMPQ')) then
begin
n:= 0;
while _res = False do
begin
n:= n + 1;
Application_ProcessMessages;
if n = 60000 then Break;
end;
RunProg(ExpandConstant('{app}\WinMPQ.exe'), // расположение программы
' s Sound.txt', // параметр запуска
'WinMPQ', // заголовок окна программы
'Встраивание озвучки юнитов...', // сообщение в окне мастера
True); // True - ждать завершения программы
end;
end;

Serega 09-07-2009 00:02 1162527

Цитата:

Цитата Raf-9600
Возможно конечно я где-то опечатался, но сечас, когда WinMPQ должен запуститься »

Проверьте параметры запуска WinMPQ, в процедуре CurStepChanged.
Параметр запуска - 's Sound.txt', а файл Sound.txt я не увидел в вашем скрипте.

Raf-9600 09-07-2009 14:00 1162955

Цитата:

Цитата Serega
файл Sound.txt я не увидел в вашем скрипте »

Вот он
Код:

Source: D:\Русификатор AiO\SC1\Юниты\DE\Sound.txt; DestDir: {app}
Колдовал как мог, с моей стороны ошибки вроде нет. И кстати, заметил одну странность, если параметр запуска оставить пустым, то WinMPQ после запуска, выдает ошибку "No files are selected.", хотя если его просто запустить, он ничего подобного "говорить" не должен. Его окно, кстати, полностью скрыто (кроме окна ошибки). Но заметил один нюанс, в то время как процесс WinMPQ ещё не закрыт, процесс Setup.tmp отбирает почти 30% процессорного времени, хотя он видь никаких действий в этот момент выполнять не может.

Serega 09-07-2009 22:08 1163331

Цитата:

Цитата Raf-9600
Колдовал как мог, с моей стороны ошибки вроде нет. »

Значит, судя по вашему, она с моей стороны... Хорошо...
Довайте вернёмся к тому файлу, который вы дали... я сделал скрипт, который работает на 100%, т.е. запускает программу в скрытом режиме... или я не прав?
Цитата:

Цитата Raf-9600
И кстати, заметил одну странность, если параметр запуска оставить пустым, то WinMPQ после запуска, выдает ошибку "No files are selected." »

Ересь, полнейшая... у меня ваш файл работает без всяких ключей, причем без всяких ошибок, но только я его запускаю с вашими ключами, он выдаёт ошибку, т.к. такого файла у меня нет... ищите ошибку у себя...
Цитата:

Цитата Raf-9600
заметил один нюанс, в то время как процесс WinMPQ ещё не закрыт, процесс Setup.tmp отбирает почти 30% процессорного времени, хотя он видь никаких действий в этот момент выполнять не может. »

я сомневаюсь, но вполне возможно потому, что в скрипте есть ожидание завершения запущенного процесса. Если делать через секцию [Run], то окно инсталлятора замеряет, т.е. перестаёт реагировать на действия пользователя...

Raf-9600 10-07-2009 09:19 1163574

Цитата:

Цитата Serega
я сделал скрипт, который работает на 100%, т.е. запускает программу в скрытом режиме...»

Да.

Цитата:

Цитата Serega
Ересь, полнейшая... у меня ваш файл работает без всяких ключей, причем без всяких ошибок, но только я его запускаю с вашими ключами, он выдаёт ошибку, т.к. такого файла у меня нет... ищите ошибку у себя... »

Поколдовал ещё раз. Не ересь. Вы просто попробуйте запустить WinMPQ не из "{src}\winmpq\", а из "{app}", сами все увидите.

p3rf3ct1c 10-07-2009 16:10 1163963

Вложений: 1
Помогите пожалуйста!
При компиляции выдает ошибку "Identifier expected" на строчке "procedure CurStepChanged(CurStep: TSetupStep);"
Как это исправить?

Извините код не вмещается =(

Вот залил

localhost 10-07-2009 22:23 1164305

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

http://itmages.ru/view.php?action=vi...009&key=fa3c34

velma911 10-07-2009 22:28 1164309

p3rf3ct1c, напиши перед этой строкой

Код:

end;
Ты не закрыл блок begin

p3rf3ct1c 10-07-2009 22:35 1164318

velma911, Пробовал, все та же ошибка.

BlackSelf 10-07-2009 22:51 1164331

p3rf3ct1c, procedure InitializeWizard должна выглядеть вот так:
читать дальше »
Код:

procedure InitializeWizard();
var
  WLabel1, WLabel2,
  FLabel1, FLabel2: TLabel;
begin
    ExtractTemporaryFile('1.bmp');

    BmpFile:= TBitmapImage.Create(WizardForm);
  BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  BmpFile.SetBounds(0, 0, 497, 360);
  BmpFile.Stretch:= true
  BmpFile.Parent:= WizardForm.WelcomePage;
  BmpFile:= TBitmapImage.Create(WizardForm);
  BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  BmpFile.SetBounds(0, 0, 497, 360);
  BmpFile.Stretch:= true
  BmpFile.Parent:= WizardForm.LicensePage;
  BmpFile:= TBitmapImage.Create(WizardForm);
  BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  BmpFile.SetBounds(0, 0, 497, 360);
  BmpFile.Stretch:= true
  BmpFile.Parent:= WizardForm.SelectDirPage;
  BmpFile:= TBitmapImage.Create(WizardForm);
  BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  BmpFile.SetBounds(0, 0, 497, 360);
  BmpFile.Stretch:= true
  BmpFile.Parent:= WizardForm.InstallingPage;
  BmpFile:= TBitmapImage.Create(WizardForm);
  BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  BmpFile.SetBounds(0, 0, 497, 360);
  BmpFile.Stretch:= true
  BmpFile.Parent:= WizardForm.FinishedPage;
  BmpFile:= TBitmapImage.Create(WizardForm);

  WizardForm.BorderStyle := bsDialog;
    ProgressBar:= TNewProgressBar.Create(WizardForm);
    ExtractFile:=TNewStaticText.Create(WizardForm);
    lblExtractFileName:= TLabel.Create( WizardForm );
    with WizardForm.ProgressGauge do
    begin
        // Create a label to show current FileName being extracted
        lblExtractFileName.parent:=WizardForm.InstallingPage;
        lblExtractFileName.autosize:=false;
        lblExtractFileName.Width:= Width;
        lblExtractFileName.top:=Top + ScaleY(35);
        lblExtractFileName.Caption:= '';

        // Create a label to show percentage
        ExtractFile.parent:=WizardForm.InstallingPage;
        ExtractFile.autosize:=false;
        ExtractFile.Width:= Width;
        ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
        ExtractFile.caption:=cm('ArcTitle');

        // Create a separate progress bar
        ProgressBar.SetBounds(Left, ExtractFile.Top + ScaleY(16), Width, Height);
        ProgressBar.Parent:= WizardForm.InstallingPage;
        ProgressBar.max:= 1000;
        ProgressBar.Position:= 0;
    end;

    // Create a 'Cancel unpacking' button and hide it for now.
    btnCancelUnpacking:=TButton.create(WizardForm);
    btnCancelUnpacking.Parent:= WizardForm;
    btnCancelUnpacking.SetBounds(260, WizardForm.cancelbutton.top, 135, WizardForm.cancelbutton.Height);
    btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
    btnCancelUnpacking.Caption:= cm('ArcCancel');
    btnCancelUnpacking.Hide;

  with WizardForm do
  begin
    PageNameLabel.Hide;
    PageDescriptionLabel.Hide;
    WelcomeLabel1.Hide;
    WelcomeLabel2.Hide;
    DiskSpaceLabel.Hide;
    SelectDirBitmapImage.Hide;
    SelectDirBrowseLabel.Hide;
    SelectDirLabel.Hide;
    FinishedHeadingLabel.Hide;
    FinishedLabel.Hide;
    MainPanel.Hide
    FilenameLabel.Hide;
    StatusLabel.Hide;
  end;

  with WizardForm do
  begin
    DirBrowseButton.Left:= DirBrowseButton.Left + ScaleX(40);
    DirBrowseButton.Top:= DirBrowseButton.Top + ScaleY(72);
    DirEdit.Left:= DirEdit.Left + ScaleX(40);
    DirEdit.Top:= DirEdit.Top + ScaleY(72);
    NextButton.BringToFront;
    BackButton.BringToFront;
    CancelButton.BringToFront;
    Font.Style:=[];
    Font.Name:= 'MS Sans Serif';
    DirEdit.Color:=clBlack;
    Font.Color:=clWhite;
    ProgressGauge.Top:=ScaleY(120);
    ProgressGauge.Left:=ScaleX(20);
  end;

  with WizardForm do
  begin
    InnerNotebook.Left := ScaleX(0);
    InnerNotebook.Top := ScaleY(0);
    InnerNotebook.Width := ScaleX(497);
    InnerNotebook.Height := ScaleY(360);
    OuterNotebook.Left := ScaleX(0);
    OuterNotebook.Top := ScaleY(0);
    OuterNotebook.Width := ScaleX(497);
    OuterNotebook.Height := ScaleY(360);
  end;

  WelcomeLabel1:= TLabel.Create(WizardForm);
  with WelcomeLabel1 do
  begin
    Left:= ScaleX(176);
    Top:= ScaleY(66);
    Width:= ScaleX(301);
    Height:= ScaleY(54);
    AutoSize:= false;
    Transparent:= true;
    WordWrap:= true;
    Font.Size:= 14;
    Font.Color:=ClWhite
    Font.Style := [fsBold]
    Parent:= WizardForm.WelcomePage;
    Caption:= WizardForm.WelcomeLabel1.Caption;            //'Âàñ ïðèâåòñòâóåò Ìàñòåð' + #10 + 'óñòàíîâêè Prototype'
 end;

  WelcomeLabel2:=TLabel.Create(WizardForm);
  with WelcomeLabel2 do
  begin
    Top:= ScaleY(136);
    Left:= ScaleX(176);
    Width:= ScaleX(301);
    Height:= ScaleY(300);
    AutoSize:= false;
    WordWrap:= true;
    Transparent:= true;
    Parent:= WizardForm.WelcomePage;
    Caption:= WizardForm.WelcomeLabel2.Caption;        //'Ïðîãðàììà óñòàíîâèò Prototype íà Âàø êîìïüþòåð.' + #10#13#10 + 'Ðåêîìåíäóåòñÿ çàêðûòü âñå ïðî÷èå ïðèëîæåíèÿ ïåðåä' + #10 + 'òåì, êàê ïðîäîëæèòü.' + #10#13#10 + 'Íàæìèòå «Äàëåå», ÷òîáû ïðîäîëæèòü èëè «Îòìåíà»,' + #10 + '÷òîáû âûéòè èç ïðîøðàììû óñòàíîâêè.';
end;

  FinishedHeadingLabel:=TLabel.Create(WizardForm);
  with FinishedHeadingLabel do
  begin
    Top:= ScaleY(66);
    Left:= ScaleX(176);
    Width:= ScaleX(301);
    Height:= ScaleY(53);
    AutoSize:= false;
    WordWrap:= true;
    Font.Size:= 14;
    Font.Color:=ClWhite
    Font.Style := [fsBold]
    Transparent:= true;
    Parent:= WizardForm.FinishedPage;
    Caption:= WizardForm.FinishedHeadingLabel.Caption;          //'Çàâåðøåíèå Ìàñòåðà óñòàíîâêè' + #10 + 'Prototype'
 end;

  FinishedLabel:= TLabel.Create(WizardForm);
  with FinishedLabel do
  begin
    Left:= ScaleX(176);
    Top:= ScaleY(136);
    Width:= ScaleX(301);
    Height:= ScaleY(54);
    AutoSize:= false;
    WordWrap:= true;
    Transparent:= true;
    Parent:= WizardForm.FinishedPage;
    Caption:= 'Èãðà Prototype óñòàíîâëåíà íà Âàø êîìïüþòåð.' + #10#13#10 + 'Íàæìèòå «Çàâåðøèòü», ÷òîáû âûéòè èç ïðîãðàììû' + #10 + 'óñòàíîâêè.'
 end;
 
 // ñîçäà¸ì lblSelectDir
  lblSelectDir:= TLabel.Create(WizardForm);
  with lblSelectDir do
  begin
    Caption:= WizardForm.SelectDirLabel.Caption;
    Left:= ScaleX(40);
    Top:= WizardForm.SelectDirLabel.Top + ScaleY(62);
    Width:= WizardForm.SelectDirLabel.Width;
    Height:= WizardForm.SelectDirLabel.Height;
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
  end;

 // ñîçäà¸ì lblSelectDirBrowse
  lblSelectDirBrowse:= TLabel.Create(WizardForm);
  with lblSelectDirBrowse do
  begin
    Caption:= WizardForm.SelectDirBrowseLabel.Caption;
    Left:= ScaleX(40);
    Top:= WizardForm.SelectDirBrowseLabel.Top + ScaleY(62);
    Width:= WizardForm.SelectDirBrowseLabel.Width;
    Height:= WizardForm.SelectDirBrowseLabel.Height;
    WordWrap:= True;
    Transparent:= True;
    Parent:= WizardForm.SelectDirPage;
  end;

  NeedSpaceLabel:= TLabel.Create(WizardForm);
  with NeedSpaceLabel do
  begin
    Parent:= WizardForm.SelectDirPage;
    Left:= WizardForm.DirEdit.Left;
    Top:= ScaleY(262);
    Width:= ScaleX(209);
    Height:= ScaleY(13);
    Transparent:= True;
  end;

  FreeSpaceLabel:= TLabel.Create(WizardForm);
  with FreeSpaceLabel do
  begin
    Parent:= WizardForm.SelectDirPage;
    Left:= WizardForm.DirEdit.Left;
    Top:= ScaleY(280);
    Width:= ScaleX(209);
    Height:= ScaleY(13);
    Transparent:= True;
  end;

  WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;

  PageNameLabel:= TLabel.Create(WizardForm);
  with PageNameLabel do
  begin
    Left:= WizardForm.PageNameLabel.Left;
    Top:= WizardForm.PageNameLabel.Top;
    Width:= ScaleX(300);
    Height:= ScaleY(14);
    AutoSize:= False;
    Font.Style:= [fsBold];
    Font.Color:= ClWhite;
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
 end;

  PageNameLabel1:= TLabel.Create(WizardForm);
  with PageNameLabel1 do
  begin
    Left:= WizardForm.PageNameLabel.Left;
    Top:= WizardForm.PageNameLabel.Top;
    Width:= ScaleX(300);
    Height:= ScaleY(14);
    AutoSize:= False;
    Font.Style:= [fsBold];
    Font.Color:= ClWhite;
    Transparent := True;
    Parent:= WizardForm.InstallingPage;
 end;

  PageDescriptionLabel:= TLabel.Create(WizardForm);
  with PageDescriptionLabel do
  begin
    Left:= WizardForm.PageDescriptionLabel.Left;
    Top:= WizardForm.PageDescriptionLabel.top;
    Width:= WizardForm.PageDescriptionLabel.Width;
    Height:= WizardForm.PageDescriptionLabel.Height;
    AutoSize:= False;
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
    end;

  PageDescriptionLabel1:= TLabel.Create(WizardForm);
  with PageDescriptionLabel1 do
  begin
    Left:= WizardForm.PageDescriptionLabel.Left;
    Top:= WizardForm.PageDescriptionLabel.top;
    Width:= WizardForm.PageDescriptionLabel.Width;
    Height:= WizardForm.PageDescriptionLabel.Height;
    AutoSize:= False;
    Transparent := True;
    Parent:= WizardForm.InstallingPage;
  end;

    StatusLabel:= TLabel.Create(WizardForm);
  with StatusLabel do
  begin
    Left:= ScaleX(20);
    Top:= ScaleY(100);
    Width:= WizardForm.StatusLabel.Width;
    Height:= WizardForm.StatusLabel.Height;
    AutoSize:= False;
    Transparent := True;
    Parent:= WizardForm.InstallingPage;
  end;
begin


    DesktopIcon := TCheckBox.Create(WizardForm);
    with DesktopIcon do
    begin
        Parent := WizardForm.SelectDirPage;
        Caption := 'Äîáàâèòü ÿðëûê íà ðàáî÷èé ñòîë';
        Left := ScaleX(0);
        Top := WizardForm.DirEdit.Top+35;
        Width := ScaleX(400);
        Height := ScaleY(15);
        TabOrder := 0;
        Checked := True;
    end;

 // óìåíüøèë ðàçìåð CheckBox'à, ïî äðóãîìó íèêàê
  DirectX:= TCheckBox.Create(WizardForm);
  with DirectX do
  begin
    Parent:= WizardForm.SelectDirPage;
    Left:= WizardForm.DirEdit.Left + 200;
    Top:= WizardForm.DirEdit.Top + 35;
    Width:= ScaleX(14);
    Height:= ScaleY(14);
    TabOrder:= 0;
    Checked:= False;
  end;

  // ñîçäà¸ì íàäïèñü äëÿ CheckBox'à
  lblDirectX:= TLabel.Create(WizardForm);
  with lblDirectX do
  begin
    Caption:= ExpandConstant('{cm:DRT}');
    Left:= WizardForm.DirEdit.Left + 220;
    Top:= WizardForm.DirEdit.Top + 35;
    Width:= ScaleX(150);
    Height:= ScaleY(13);
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
    OnClick:= @lblDirectXOnClick;
  end;

Redist:= TCheckBox.Create(WizardForm);
  with Redist do
  begin
    Parent:= WizardForm.SelectDirPage;
    Left:= WizardForm.DirEdit.Left + 200;
    Top:= WizardForm.DirEdit.Top + 70;
    Width:= ScaleX(14);
    Height:= ScaleY(14);
    TabOrder:= 1;
    Checked:= False;
  end;

lblRedist:= TLabel.Create(WizardForm);
  with lblRedist do
  begin
    Caption:='Óñòàíîâèòü MS Visual C++ 2005';
    Left:= WizardForm.DirEdit.Left + 220;
    Top:= WizardForm.DirEdit.Top + 70;
    Width:= ScaleX(150);
    Height:= ScaleY(13);
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
    OnClick:= @RedistOnClick;
  end;

Icons:= TCheckBox.Create(WizardForm);
  with Icons do
  begin
    Parent:= WizardForm.SelectDirPage;
    Left:= WizardForm.DirEdit.Left;
    Top:= WizardForm.DirEdit.Top + 35;
    Width:= ScaleX(14);
    Height:= ScaleY(14);
    TabOrder:= 2;
    Checked:= False;
  end;

lblIcons:= TLabel.Create(WizardForm);
  with lblIcons do
  begin
    Caption:='Ñîçäàòü ÿðëûê íà ðàáî÷åì ñòîëå';
    Left:= WizardForm.DirEdit.Left + 20;
    Top:= WizardForm.DirEdit.Top + 35;
    Width:= ScaleX(150);
    Height:= ScaleY(13);
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
    OnClick:= @IconsOnClick;
  end;

Group:= TCheckBox.Create(WizardForm);
  with Group do
  begin
    Parent:= WizardForm.SelectDirPage;
    Left:= WizardForm.DirEdit.Left;
    Top:= WizardForm.DirEdit.Top + 70;
    Width:= ScaleX(14);
    Height:= ScaleY(14);
    TabOrder:= 3;
    Checked:= False;
  end;

lblGroup:= TLabel.Create(WizardForm);
  with lblGroup do
  begin
    Caption:='Ñîçäàòü ÿðëûêè â ìåíþ "Ïóñê"';
    Left:= WizardForm.DirEdit.Left + 20;
    Top:= WizardForm.DirEdit.Top + 70;
    Width:= ScaleX(150);
    Height:= ScaleY(13);
    Transparent := True;
    Parent:= WizardForm.SelectDirPage;
    OnClick:= @GroupOnClick;
  end;



NeedSize := 3220;

WizardForm.DiskSpaceLabel.Hide;

NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;

FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;

  PageNameLabel := TLabel.Create(WizardForm);
  with PageNameLabel do
  begin
    Left := ScaleX(10);
    Top := ScaleY(10);
    Width := ScaleX(300);
    Height := ScaleY(14);
    AutoSize := False;
    WordWrap := True;
    Font.Color := clWhite;
    Font.Style := [fsBold];
    Transparent := True;
    Parent := WizardForm.MainPanel;
  end;

  PageDescriptionLabel := TLabel.Create(WizardForm);
  with PageDescriptionLabel do
  begin
    Left := ScaleX(15);
    Top := ScaleY(25);
    Width := ScaleX(475);
    Height := ScaleY(30);
    AutoSize := False;
    WordWrap := True;
    Font.Color := clWhite;
    Transparent := True;
    Parent := WizardForm.MainPanel;
  end;

  with WizardForm do
  begin
    PageNameLabel.Hide;
    PageDescriptionLabel.Hide;
    with MainPanel do
    begin
      with WizardSmallBitmapImage do
      begin
        Left := ScaleX(0);
        Top := ScaleY(0);
        Width := Mainpanel.Width;
        Height := MainPanel.Height;
      end;
    end;
  end;
 begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.FinishedHeadingLabel.Hide;
  WizardForm.FinishedLabel.Hide;
  WizardForm.WizardBitmapImage.Width := WizardForm.Width;
  WizardForm.WizardBitmapImage.Height := WizardForm.Height;
  WizardForm.WizardBitmapImage.Width := 497;
  WizardForm.WizardBitmapImage.Height := 313;
  WizardForm.WizardSmallBitmapImage.Width:=497;
  WizardForm.WizardSmallBitmapImage.Height:=58;



  WizardForm.WizardBitmapImage2.Width := WizardForm.Width;
  WizardForm.WizardBitmapImage2.Height := WizardForm.Height;
end;
end;
end;


p3rf3ct1c 11-07-2009 00:40 1164383

BlackSelf, Спасибо, а вы можете подсказать если знаете, как сделать прозрачность
вот тут где отмечено красным -

BlackSelf 11-07-2009 00:43 1164386

p3rf3ct1c, у меня в инсталлах эта инфа на лэйблах весит. Предлагаю вам сделать тоже самое.

p3rf3ct1c 11-07-2009 01:34 1164401

BlackSelf, извините, что-то я не понял, как и что сделать, можно пожалуйста по подробнее?

Serega 11-07-2009 10:48 1164583

Цитата:

Цитата Raf-9600
Вы просто попробуйте запустить WinMPQ не из "{src}\winmpq\", а из "{app}", сами все увидите. »

Попробовал, прекрасно работает.

Drongo 11-07-2009 14:46 1164710

Serega, В общем такой непонятный вопрос. Дал я скрипт другу, который делал, помнишь, коммент 623. В общем всё нормально, он перепаковал две игры, Most Wanted и Stalker'a. Всё указал как надо, собственно указывал я. А делал сборку он, т.к. у него комп помощнее. Но прикол в том, что когда установлена одна игра, а после неё, следом устанавливается другая, то путь в папку установки становится от первой. Допустим, устанавливаем Most Wanted первой:
Код:

...
#define MyAppName "Need for Speed Most Wanted"
...
DefaultDirName={pf}\{#MyAppName}

Это в установке должно превратиться в:
Код:

C:\Program Files\Need for Speed Most Wanted
Так и есть, а если следом устанавливать сталкера собраному на том же компе.
Код:

...
#define MyAppName "S.T.A.L.K.E.R."
...
DefaultDirName={pf}\{#MyAppName}

То путь получается всё равно
Код:

C:\Program Files\Need for Speed Most Wanted
Тоесть, чтобы путь был
Код:

C:\Program Files\S.T.A.L.K.E.R.
нужно сначала деинсталировать первую игру\программу, которая была собрана с помощью данного скрипта. Как сделать, чтобы при одной установке был свой путь, а при другой установке, тоже свой путь? Не использовать макросы и переменные {pf} и всё прописывать вручную?


Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Need for Speed Most Wanted"
#define MyAppVerName "Need for Speed Most Wanted"
#define MyAppPublisher "EA Games Company."
#define MyAppURL "http://www.needforspeed.com/"
#define MyAppExeName "bin\XR_3DA.exe"
#define TIME_FOR_VIEW 1

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{337AE44F-3DF6-4C55-AFCA-AAA9A6436F0E}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
SetupIconFile=C:\speed.ico
...


Habetdin 11-07-2009 15:03 1164725

Drongo,
Цитата:

Цитата Drongo
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{337AE44F-3DF6-4C55-AFCA-AAA9A6436F0E} »

А прочесть комментарии? ;)

Drongo 11-07-2009 16:21 1164788

Habetdin, Отлично! :up: Я ж не знал где собака зарыта. :gigi: К тому же английский понимаю с переводчиком, пытался найти сообщение из ПМ где Serega пояснял мне этот момент, но за кучей сообщений разве что-то найдёшь? :) Спасибо! :hi:

Serega 11-07-2009 17:45 1164846

Drongo,
Цитата из Справки
Код:

[Setup]: AppId

Значение по умолчанию:Если директива AppId не указана, компилятор присваивает ей значение директивы AppName.

Описание:

Значение директивы AppId записывается в файл настройки деинсталлятора (unins???.dat), и если до начала данной установки, файл уже существовал, сравниваются значения, записанные там. Если эти значения (AppId) совпадают, файл настройки дополняется, иначе создаётся новый файл настройки под другим именем. Например, у вас есть два инсталлятора - один определяется как "My Program", а другой - "My Program 1.1 Обновление". Чтобы при инсталляции второй программы-обновления файл настройки My Program дополнялся, установите в обоих инсталляторах значение директивы AppId одинаковым.

AppId также определяет имя раздела в реестре с информацией для удаления. На самом деле значение ключа состоит из значения директивы AppId и части "_is1" в конце. (например, если AppId равна "MyProgram", раздел будет называться "MyProgram_is1".) До версии программы 1.3, значение раздела определялось директивой AppVerName.

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

Использование константы {code:...} даст возможность пользователю изменять AppId, при этом не нужно возвращать реальное значение вплоть до начала инсталляции: при необходимости здесь можно возвратить пустое или случайное значение. Если значение не пустое, значение будет использовано только при попытке восстановления прежних настроек установки (например, настроек директивы UsePreviousAppDir секции [Setup]). Если значение пустое, оно вообще не будет использовано.

Длина AppId со всеми включенными константами не должна превышать 127 символов.

Например:

AppId=MyProgram


serg aka lain 11-07-2009 17:59 1164859

localhost,
Цитата:

Цитата localhost
Погуглив и почитав топика на руборде и здесь, не смог найти ничего похоже. Как привести инсталлятор к виду, как на картинке. То есть максимально уменьшить его и убрать виндосовский шелл с кнопками сверху. »

Подозреваю, что так:
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.BorderStyle := bsSingle;
  WizardForm.CancelButton.Top := ScaleY(327);
  WizardForm.NextButton.Top := ScaleY(327);
  WizardForm.BackButton.Top := ScaleY(327);
  WizardForm.ClientHeight := ScaleY(360);

  if CurPageID = wpSelectDir then
  begin
    WizardForm.BorderStyle := bsNone;
    WizardForm.ClientHeight := ScaleY(160);
    WizardForm.CancelButton.Top := WizardForm.CancelButton.Top - ScaleY(200);
    WizardForm.CancelButton.BringToFront;
    WizardForm.NextButton.Top := WizardForm.CancelButton.Top;
    WizardForm.NextButton.BringToFront;
    WizardForm.BackButton.Top := WizardForm.CancelButton.Top;
    WizardForm.BackButton.BringToFront;
    WizardForm.SelectDirBitmapImage.Hide;
    WizardForm.SelectDirLabel.Hide;
    WizardForm.SelectDirBrowseLabel.Hide;
    WizardForm.DirEdit.Top := ScaleY(1);
    WizardForm.DirBrowseButton.Top := 0;
  end;
end;


Raf-9600 11-07-2009 20:24 1164993

Цитата:

Цитата Serega
Попробовал, прекрасно работает. »

Либо в вашем скрипте есть собственная душа, либо моя винда выдает аномалии... Со следующей недели установлю Winows 7, попробую на нем. Сечас у меня стоит WinXP SP3 (лицензия) и Inno Setup 5.2.4-dev с препроцессором. Когда пробую выставлять параметр запуска, со 100% гарантией выдает ошибку, когда его нет, то с вероятностью 50/50 выдает другую ошибку... :dont-know

Ладно, вы бы не могли объединить скрипты ниже? Пробывал это делать с помощью специальной утилиты от Bulat_Ziganshin, но тогда скрипт постоянно ошибку выдает.

Слайд-шоу в окне инсталляции
читать дальше »
Код:

#define TIME_FOR_VIEW 10

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
SolidCompression=yes

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

[Files]
Source: InnoCallback.dll; Flags: dontcopy noencryption nocompression solidbreak;
Source: *.bmp; Flags: dontcopy noencryption nocompression solidbreak;

Source: D:\Games\StarCraft enGB\StarDat.mpq; DestDir: {app}

[_code]
const
n=21; //количество слайдов
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TRandNumbers = array[1..N] of byte;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

function get_unique_random_number(X:byte):TRandNumbers;
var
A,b,c: string;
i,j,k:byte;
begin
 For i:=1 to X do A:=A+chr(i);
 B:='';
 For i:=1 to X do begin
  j:=Random(Length(A)-1)+1;
  C:='';
  B:=B + A[j];
  for k:=1 to Length(A) do
  if k<>j then C:=C+A[k];
  A:=C;
 end;
 for i:=1 to X do Result[i]:=ord(B[i]);
end;

var
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;
StatusMessages: TNewStaticText;
bmp: TRandNumbers;
z:byte;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
if (currTime mod {#TIME_FOR_VIEW} = 0)
 then begin
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[currTime/{#TIME_FOR_VIEW}])+'.bmp'));
  if (currTime/{#TIME_FOR_VIEW} = N) then currTime:=0;
 end;
end;


procedure InitializeWizard;
begin
bmp:=get_unique_random_number(N);
ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp');

currTime := 0;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
WizardForm.ProgressGauge.Height := 16;
WizardForm.ProgressGauge.Hide;

WizardForm.StatusLabel.Parent := WizardForm;
WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
WizardForm.StatusLabel.Left := ScaleX(10);
WizardForm.StatusLabel.Width := ScaleX(397);
WizardForm.StatusLabel.Hide;

SplashImage := TBitmapImage.Create(WizardForm);
SplashImage.Top := 0;
SplashImage.Left := 0;
SplashImage.Width := WizardForm.MainPanel.Width;
SplashImage.Height := WizardForm.Bevel.Top;
SplashImage.Parent := WizardForm.InnerPage;
SplashImage.Stretch := True;
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[1])+'.bmp'));
SplashImage.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
for z:=2 to N do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp');
end;
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 5);
TimerID := SetTimer(0, 0, 1000, pfunc);
WizardForm.PageNameLabel.Visible := False;
WizardForm.PageDescriptionLabel.Visible := False;
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
SplashImage.Show;
WizardForm.CancelButton.Enabled := True;
WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100);
end else
begin
WizardForm.ProgressGauge.Hide;
SplashImage.Hide;
WizardForm.FileNameLabel.Hide;
WizardForm.StatusLabel.Hide;
if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
end;
If CurPageID = wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
KillTimer(0, TimerID);
end;


Скрипт для вывода данных о винтах
читать дальше »
Код:

var
  NeedSize:Integer;
  FreeMB, TotalMB: Cardinal;
  NeedSpaceLabel: TLabel;
  n: Integer;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;

procedure GetFreeSpaceCaption(Sender: TObject);
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
  if NeedSize > 1024 then
  NeedSpaceLabel.Caption := 'Требуется как минимум '+ FloatToStr(round(NeedSize/1024*100)/100) + ' Гб свободного дискового пространства.' else
  NeedSpaceLabel.Caption := 'Требуется как минимум '+ IntToStr(NeedSize)+ ' Мб свободного дискового пространства.';end;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

procedure InitializeWizard();
begin
  NeedSize := 6100;                  //Здесь указывается место для приложения
  WizardForm.DiskSpaceLabel.Hide;
  NeedSpaceLabel := TLabel.Create(WizardForm);
  with NeedSpaceLabel do
  begin
  Parent := WizardForm.SelectDirPage;
  Left := ScaleX(0);
  Top := ScaleY(220);
  Width := ScaleX(209);
  Height := ScaleY(13);
  end;
  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
  ListBox.Font.Size:= 9
  ListBox.Font.Style:= []
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;
  WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
  end;

procedure CurPageChanged(CurPageID: Integer);
  begin
  if CurPageID=wpSelectDir then
  begin
  GetNeedSpaceCaption;
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled:=False
  ListBoxRefresh
  end;
  end;


Описания компонентов
читать дальше »
Код:

function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';

function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

var
  Info: TNewStaticText;
  InfoCaption: TNewStaticText;
  InfoPanel: TPanel;

procedure DeinitializeSetup();
begin
  disabledesc();
end;

procedure InitializeWizard();
begin
  WizardForm.TYPESCOMBO.Visible:= false;
  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);
  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;
  InfoPanel.Left := ScaleX(216);
  InfoPanel.Width := ScaleX(200);
  InfoPanel.Height := WizardForm.ComponentsList.Height;
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;
  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := 'ГиКц';
  InfoCaption.Left := ScaleX(224);
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);
  InfoCaption.Font.Color := clActiveCaption;
  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188);
  Info.Top := ScaleY(12);
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
  Info.Caption := 'Переместите ваш указатель мыши на компоненты чтобы увидеть их описание.';
  Info.WordWrap := true;
  enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
      'Английская озвучка;'+ // SoundUnit\eng
      'Французская озвучка;'+ // SoundUnit\fra
      'Немецкая озвучка;'+ // SoundUnit\deu
      'Итальянская озвучка;'+ // SoundUnit\ita
      'Испанская озвучка;' // SoundUnit\spa
      );
end;


Запрет установки в папку Windows
читать дальше »
Код:

Function NextButtonClick(CurPageID: Integer): Boolean; Begin
    Result:= True
    if (CurPageID = wpSelectDir) and (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'), 'Установка в системную папку', MB_YESNO or $30) = idYes;
End;


Поиск нужных файлов
читать дальше »
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;

  if CurPageID = wpReady then
  begin
    if IsComponentSelected('Game\Lokal') then
      if (FileSearch('Install.exe', ExpandConstant('{app}')) = '') then
        if (FileSearch('StarCraft.mpq', ExpandConstant('{app}')) = '') then
      begin
        SuppressibleMsgBox('Файл Install.exe не найден в папке назначения, скопируйте его с' #13 'лицензионного диска StarCraft, в папку, для начала инсталляции.', mbCriticalError, MB_OK, MB_OK);
        Result := False;
      end else
        Result := True;
  end;
end;


Serega 11-07-2009 23:33 1165123

Цитата:

Цитата Raf-9600
Когда пробую выставлять параметр запуска, со 100% гарантией выдает ошибку »

Вы не забываете копировать в {app} вместе с WinMPQ.exe ещё и SFmpq.dll?

Цитата:

Цитата Raf-9600
вы бы не могли объединить скрипты ниже? »

Попробуйте
Код:

#define TIME_FOR_VIEW 10

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
SolidCompression=yes

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

[Files]
Source: InnoCallback.dll; Flags: dontcopy noencryption nocompression solidbreak;
Source: *.bmp; Flags: dontcopy noencryption nocompression solidbreak;
Source: D:\Games\StarCraft enGB\StarDat.mpq; DestDir: {app}

[_Code]
const
  _n = 21; //количество слайдов
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
  TRandNumbers = array[1.._n] of byte;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';

function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

var
  Info: TNewStaticText;
  InfoCaption: TNewStaticText;
  InfoPanel: TPanel;
  NeedSize:Integer;
  FreeMB, TotalMB: Cardinal;
  NeedSpaceLabel: TLabel;
  n: Integer;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;
  StatusMessages: TNewStaticText;
  bmp: TRandNumbers;
  z:byte;

function get_unique_random_number(X:byte):TRandNumbers;
var
  A,b,c: string;
  i,j,k:byte;
begin
 For i:=1 to X do A:=A+chr(i);
 B:='';
 For i:=1 to X do begin
  j:=Random(Length(A)-1)+1;
  C:='';
  B:=B + A[j];
  for k:=1 to Length(A) do
  if k<>j then C:=C+A[k];
  A:=C;
 end;
 for i:=1 to X do Result[i]:=ord(B[i]);
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
if (currTime mod {#TIME_FOR_VIEW} = 0)
 then begin
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[currTime/{#TIME_FOR_VIEW}])+'.bmp'));
  if (currTime/{#TIME_FOR_VIEW} = _n) then currTime:=0;
 end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
for z:=2 to _n do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp');
end;
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
  if NeedSize > 1024 then
  NeedSpaceLabel.Caption := 'Требуется как минимум '+ FloatToStr(round(NeedSize/1024*100)/100) + ' Гб свободного дискового пространства.' else
  NeedSpaceLabel.Caption := 'Требуется как минимум '+ IntToStr(NeedSize)+ ' Мб свободного дискового пространства.';end;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
  disabledesc();
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
  if CurPageID = wpSelectDir then
    begin
      GetNeedSpaceCaption;
      if FreeMB < NeedSize then
      WizardForm.NextButton.Enabled:= False;
      ListBoxRefresh;
    end;
  if CurPageID = wpInstalling then
    begin
      pfunc := WrapTimerProc(@OnTimer, 5);
      TimerID := SetTimer(0, 0, 1000, pfunc);
      WizardForm.PageNameLabel.Visible := False;
      WizardForm.PageDescriptionLabel.Visible := False;
      WizardForm.InnerNotebook.Hide;
      WizardForm.Bevel1.Hide;
      WizardForm.MainPanel.Hide;
      WizardForm.PageNameLabel.Hide;
      WizardForm.PageDescriptionLabel.Hide;
      WizardForm.ProgressGauge.Show;
      WizardForm.StatusLabel.Show;
      SplashImage.Show;
      WizardForm.CancelButton.Enabled := True;
      WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100);
    end
  else
    begin
      WizardForm.ProgressGauge.Hide;
      SplashImage.Hide;
      WizardForm.FileNameLabel.Hide;
      WizardForm.StatusLabel.Hide;
      if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
        begin
          WizardForm.InnerNotebook.Show;
          WizardForm.Bevel1.Show;
          WizardForm.MainPanel.Show;
          WizardForm.PageNameLabel.Show;
          WizardForm.PageDescriptionLabel.Show;
        end;
//      if CurPageID = wpFinished then
    end;
end;

procedure InitializeWizard();
begin
  NeedSize := 6100;                  //Здесь указывается место для приложения
  WizardForm.DiskSpaceLabel.Hide;
  NeedSpaceLabel := TLabel.Create(WizardForm);
  with NeedSpaceLabel do
    begin
      Parent := WizardForm.SelectDirPage;
      Left := ScaleX(0);
      Top := ScaleY(220);
      Width := ScaleX(209);
      Height := ScaleY(13);
    end;

  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
  ListBox.Font.Size:= 9
  ListBox.Font.Style:= []
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;
  WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;

  bmp:=get_unique_random_number(N);
  ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp');

  currTime := 0;

  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
  WizardForm.ProgressGauge.Left := ScaleX(10);
  WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
  WizardForm.ProgressGauge.Height := 16;
  WizardForm.ProgressGauge.Hide;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
  WizardForm.StatusLabel.Left := ScaleX(10);
  WizardForm.StatusLabel.Width := ScaleX(397);
  WizardForm.StatusLabel.Hide;

  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[1])+'.bmp'));
  SplashImage.Hide;

  WizardForm.TYPESCOMBO.Visible:= false;
  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);
  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;
  InfoPanel.Left := ScaleX(216);
  InfoPanel.Width := ScaleX(200);
  InfoPanel.Height := WizardForm.ComponentsList.Height;
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;
  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := 'ГиКц';
  InfoCaption.Left := ScaleX(224);
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);
  InfoCaption.Font.Color := clActiveCaption;
  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188);
  Info.Top := ScaleY(12);
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
  Info.Caption := 'Переместите ваш указатель мыши на компоненты чтобы увидеть их описание.';
  Info.WordWrap := true;
  enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
      'Английская озвучка;'+ // SoundUnit\eng
      'Французская озвучка;'+ // SoundUnit\fra
      'Немецкая озвучка;'+ // SoundUnit\deu
      'Итальянская озвучка;'+ // SoundUnit\ita
      'Испанская озвучка;' // SoundUnit\spa
      );
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;

  if (CurPageID = wpSelectDir) and
    (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then
    Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')),
    ExpandConstant('{cm:SysDirSelect}'), 'Установка в системную папку', MB_YESNO or $30) = idYes;
  if CurPageID = wpReady then
  begin
    if IsComponentSelected('Game\Lokal') then
      if (FileSearch('Install.exe', ExpandConstant('{app}')) = '') then
        if (FileSearch('StarCraft.mpq', ExpandConstant('{app}')) = '') then
      begin
        SuppressibleMsgBox('Файл Install.exe не найден в папке назначения, скопируйте его с' + #13 +
        'лицензионного диска StarCraft, в папку, для начала инсталляции.', mbCriticalError, MB_OK, MB_OK);
        Result := False;
      end else
        Result := True;
  end;
end;


Raf-9600 12-07-2009 01:07 1165176

Цитата:

Цитата Serega
Вы не забываете копировать в {app} вместе с WinMPQ.exe ещё и SFmpq.dll? »

Не забываю. Я видь выложил полную версию скрипта, на котором тестирую. И более того, я даже пробЫвал тестировать на том который вы дали, результат тот же.

Цитата:

Цитата Serega
Попробуйте»

Внезапно начало требовать файл Image_0.bmp, подсвечивая красным
Код:

ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp');
После того как его добавить, компилируеться нормально, но слайд-шоу не работает. Т.е. показывает только Image_0.bmp, и все.

Serega 12-07-2009 09:28 1165286

Цитата:

Цитата Raf-9600
После того как его добавить, компилируеться нормально, но слайд-шоу не работает. Т.е. показывает только Image_0.bmp, и все. »

Исправьте в procedure InitializeWizard строку:
bmp:=get_unique_random_number(N);
на
bmp:=get_unique_random_number(_n);

Raf-9600 12-07-2009 11:24 1165338

Serega, теперь работает, спасибо.

DemonAk 12-07-2009 19:38 1165712

Я уже задавал этот вопрос, вот код распаковки freearc архивов
читать дальше »
const
Archives = '{src}\data.bin'; // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно

PM_REMOVE = 1;
CP_ACP = 0; CP_UTF8 = 65001;
oneMB=1024*1024;
Period = 250; // частота обновления кнопки таскбара и строки статуса
HC_ACTION = 0;
VK_ESCAPE = 27;
WM_PAINT = $F;
WH_CALLWNDPROC = 4;

type
#ifdef UNICODE ;// если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
#define A "W"
#else
#define A "A" ;// точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
PAnsiChar = PChar; // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже)
#endif
#if Ver < 84018176
AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif

TMyMsg = record
hwnd: HWND;
message: UINT;
wParam: Longint;
lParam: Longint;
time: DWORD;
pt: TPoint;
end;

TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
TArc = record Path: string; Size: Extended; end;
TBarInfo = record stage, name: string; size: Extended; count, perc, pos, time: Integer; end;
TCWPSTRUCT = record lParam: LongWord; wParam: Word; Msg: LongWord; hwnd: HWnd; end;
TCWPSTRUCTProc = procedure(Code: Integer; wParam: Word; lParam: TCWPSTRUCT);
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
ExtractFile, StatusInfo: TLabel;
btnCancelUnpacking: TButton;
ProgressBar: TNewProgressBar;
CancelCode, n, ArcInd, UnPackError, StartInstall: Integer;
Arcs: array of TArc;
FSR: TFindRec;
msgError: string;
lastMb, baseMb: Integer;
LastTimerEvent: DWORD;
WndHookID, TimerID: LongWord;
allSize: Extended;
Status: TBarInfo;
FreezeTimer: Boolean;

function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: integer; lpWideCharStr: PAnsiChar; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: integer; lpMultiByteStr: PAnsiChar; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';
function GetKeyState(nVirtKey: Integer): ShortInt; external 'GetKeyState@user32 stdcall delayload';
function GetCurrentThreadId: LongWord; external 'GetCurrentThreadId@kernel32 stdcall delayload';

function CallNextWNDPROC(idHook: LongWord; Code: Integer; wParam: Word; lParam: TCWPSTRUCT): LongWord; external 'CallNextHookEx@user32 stdcall delayload';
function SetWindowsHookEx(idHook: LongWord; callback: LongWord; hMod: LongWord; dwThreadID: HWND): LongWord; external 'SetWindowsHookExW@user32 stdcall delayload';
function UnhookWindowsHookEx(idHook: LongWord): LongWord; external 'UnhookWindowsHookEx@user32 stdcall delayload';
function WrapCWPSTRUCTProc(callback:TCWPSTRUCTProc; paramcount:integer): longword; external 'wrapcallback@files:innocallback.dll';
function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

procedure AppProcessMessage;
var
Msg: TMyMsg;
begin
while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;

// Перевод числа в строку с точностью 2 знака (%.2n) с округлением дробной части, если она есть
Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; {Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 2х знаков после запятой)}
Begin
if not noMB then Result:= NumToStr(Int(Bytes)) +' Mb' else
if Bytes < 1024 then if Bytes = 0 then Result:= '0' else Result:= NumToStr(Int(Bytes)) +' Bt' else
if Bytes/1024 < 1024 then Result:= NumToStr(round((Bytes/1024)*10)/10) +' Kb' else
If Bytes/oneMB < 1024 then Result:= NumToStr(round(Bytes/oneMB*100)/100) +' Mb' else
If Bytes/oneMB/1000 < 1024 then Result:= NumToStr(round(Bytes/oneMB/1024*1000)/1000) +' Gb' else
Result:= NumToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Tb';
End;

// Converts milliseconds to human-readable time
// Конвертирует милисекунды в человеко-читаемое изображение времени
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
if detail then {hh:mm:ss format}
Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
else if Ticks/3600 >= 1000 then {more than hour}
Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
else if Ticks/60 >= 1000 then {1..60 minutes}
Result:= IntToStr(Ticks/60000) +m+' '+ IntToStr(Ticks/1000 - Ticks/1000/60*60) +s
else Result:= Format('%.1n', [Abs(Ticks/1000)]) +s {less than one minute}
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;

Function LoWord(lw: LongWord): LongWord; Begin Result:= lw shr 16; End;

Function Size64(Hi, Lo: Integer): Extended;
Begin
Result:= Lo;
if Lo<0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
for Hi:= Hi-1 Downto 0 do
Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
End;

// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировку
function OemToAnsiStr(strSource: AnsiString): AnsiString;
var
nRet : longint;
begin
SetLength(Result, Length(strSource));
nRet:= OemToChar(strSource, Result);
end;

// Converts ANSI encoded string into UTF-8
// Преобразует строку из ANSI в UTF-8 кодировку
function AnsiToUtf8(strSource: string): string;
var
nRet, nRet2: integer; WideCharBuf, MultiByteBuf: AnsiString;
begin
SetLength(WideCharBuf, Length(strSource) * 2);
SetLength(MultiByteBuf, Length(strSource) * 2);
nRet:= MultiByteToWideChar(CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf));
nRet2:= WideCharToMultiByte(CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);
if nRet * nRet2 = 0 then Result:= strSource else Result:= MultiByteBuf;
end;

// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
FreezeTimer:= true; // заблокировать таймер
if MsgBox(SetupMessage(msgExitSetupMessage), mbInformation, MB_YESNO) = IDYES then
CancelCode:= -127 else FreezeTimer:= false; // продолжить обновление информации
end;

// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
Begin
Result:= 0;
if FindFirst(ExpandConstant(dir), FSR) then
try
repeat
// Skip everything but the folders
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
n:= GetArrayLength(Arcs);
// Expand the folder list
SetArrayLength(Arcs, n +1);
Arcs[n].Path:= ExtractFilePath(ExpandConstant(dir)) + FSR.Name;
Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
Result:= Result + Arcs[n].Size;
until not FindNext(FSR);
finally
FindClose(FSR);
end;
End;

Procedure UpdateStatus(); // выполняется с переодичностью, заданной константой Period
var
Remaining: Integer; i, t, s: string;
Begin
if (GetTickCount - LastTimerEvent <= Period) or FreezeTimer then Exit else LastTimerEvent := GetTickCount;
with WizardForm.ProgressGauge do begin
if position > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((max - position)/position)) else Remaining:= 0;
t:= cm('ending'); i:= t;
if Remaining > 0 then begin
t:= FmtMessage(cm('taskbar'), [IntToStr(Status.perc/10), TicksToTime(Remaining, 'h', 'm', 's', false)])
i:= TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)
end;
end;
SetTaskBarTitle(t); // проценты и оставшееся время на кнопке инсталлятора
if Status.size > 0 then
s:= ' [' + ByteOrTB(Status.size*oneMB, true) + ']'; // можно сделать подсчёт размера папки {app} через CalcDirSize, но это может замедлить работу
StatusInfo.Caption:= FmtMessage(cm('StatusInfo'), [IntToStr(Status.count), s, Format('%.1n', [Abs(Status.perc/10)]), i]);
if GetArrayLength(Arcs) > 1 then begin // показать прогрессбар и сведения при обработке нескольких архивов
ExtractFile.Caption:= FmtMessage(cm('ArcInfo'), [IntToStr(ArcInd+1), IntToStr(GetArrayLength(Arcs)), ByteOrTB(Arcs[ArcInd].Size, true), Format('%.0n', [Status.pos/(Arcs[ArcInd].Size/oneMB)*100]), ByteOrTB(allSize, true)])
ProgressBar.Position:= round(ProgressBar.Max * Status.pos/(Arcs[ArcInd].Size/oneMB))
if not ProgressBar.Visible then ProgressBar.Show;
end;
End;

Procedure MyTimerProc(h, msg, idevent, dwTime: Longword);
Begin
UpdateStatus;
End;

Procedure OnWndHook(Code: Integer; wParam: Word; lParam: TCWPSTRUCT);
Begin
if (Code = HC_ACTION) and (LoWord(lParam.msg) = WM_PAINT) then begin //подготовка данных для последующего отображения по таймеру
if Status.name <> WizardForm.FileNameLabel.Caption then // реагируем только на этапы извлечения файлов и распаковки архивов
if (WizardForm.StatusLabel.Caption = SetupMessage(msgStatusExtractFiles)) or (WizardForm.StatusLabel.Caption = cm('ArcTitle')) then begin
Status.name := WizardForm.FileNameLabel.Caption;
Status.count:= Status.count + 1; // кол-во файлов
end;
with WizardForm.ProgressGauge do
Status.perc:= (Position-Min)/((Max - Min)/1000); // 1000 процентов
UpdateStatus();
end;
CallNextWNDPROC(WndHookID, Code, wParam, lParam) {освобождение события}
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
Elapsed: Extended;
begin
// if GetTickCount - LastTimerEvent > 1000 then begin
// This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
UpdateStatus();
if GetKeyState(VK_ESCAPE) < 0 then btnCancelUnpacking.OnClick(btnCancelUnpacking);
// End of code executed by timer
// LastTimerEvent := LastTimerEvent+1000;
// end;
Case string(what) of
'filename': begin // Update FileName label
WizardForm.FileNameLabel.Caption:= OemToAnsiStr(str); // извлекаемый файл
end;
'progress': if Mb >= 1 then with WizardForm.ProgressGauge do begin
for n:= 0 to ArcInd-1 do Elapsed:= Elapsed + Arcs[n].Size; Elapsed:= Elapsed/oneMB + Mb; // обработано Mбайт (для небольшого архива точность страдает)
Position:= round(Max * Elapsed/(allSize/oneMB))
Status.pos := Mb; // позиция в текущем архиве
end;
'written': begin // Assign to Mb *total* amount of data extracted to the moment from all archives
lastMb := Mb; // извлечено из текущего архива
Status.size := baseMb+Mb; // запоминаем общий объём, чтобы снимать данные по таймеру
end;
End;
AppProcessMessage;
Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
callback: longword;
FreeMB, TotalMB: Cardinal;
begin
// Show the 'Cancel unpacking' button and set it as default button
btnCancelUnpacking.Show;
WizardForm.ActiveControl:= btnCancelUnpacking;
// Get the size of all archives
allSize:= FindArcs(Archives);
// Other initializations
callback:= WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4 arguments
WizardForm.StatusLabel.Caption:= cm('ArcTitle'); // начало этапa распаковки
baseMb:= 0 // обнулить полученные мегабайты, если ранее вёлся подсчёт объёма файлов инсталлятора
LastTimerEvent := 0; // сброс таймера, чтобы игнорировать предыдущую задержку и немедленно обновить строку статуса
Status.count:= 0; // не учитывать файлы, извлечённые инсталлятором
for ArcInd:= 0 to GetArrayLength(Arcs) -1 do begin
CancelCode:= 0;
AppProcessMessage;
try
// Pass the specified arguments to 'unarc.dll'
Result:= FreeArcExtract (callback, 'x', '-o+', '-dp'+ AnsiToUtf8(ExpandConstant('{app}')), '--', AnsiToUtf8(Arcs[ArcInd].Path), '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
except
Result:= -63; // ArcFail
end;
baseMb:= baseMb + lastMb // общий объём распакованных файлов

// Error occured
if Result <> 0 then
begin
msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
WizardForm.StatusLabel.Caption:= msgError;
WizardForm.FileNameLabel.Caption:= ExtractFileName(Arcs[ArcInd].Path);
GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
case Result of
-1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[ArcInd].Path)]);
-127: msgError:= cm('ArcBreak'); //Cancel button
-63: msgError:= cm('ArcFail');
end;
// MsgBox(msgError, mbInformation, MB_OK); // диалог не нужен, т.к. ошибка показывается на странице завершения
Log(msgError);
Break; // прервать цикл распаковки
end;
end;
// Hide labels and button
btnCancelUnpacking.Hide;
StatusInfo.Visible:= false;
ExtractFile.Visible:= false;
ProgressBar.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then begin
StartInstall:= GetTickCount {время начала извлечения файлов}
WndHookID:= SetWindowsHookEx(WH_CALLWNDPROC, WrapCWPSTRUCTProc(@OnWndHook, 3), 0, GetCurrentThreadId); {установка SendMessage хука}
TimerID:= SetTimer(0, 0, 500 {полсекунды}, WrapTimerProc(@MyTimerProc, 4)); {установка таймера}
end;
if CurStep = ssPostInstall then
begin
StartInstall:= GetTickCount {время начала распаковки}
UnPackError:= UnPack(Archives)
KillTimer(0, TimerID) {удаление таймера}
UnhookWindowsHookEx(WndHookID) {удаление SendMessage хука}
if UnPackError = 0 then
SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
else
begin
// Error occured, uninstall it then
if '{#SetupSetting("Uninstallable")}' <> 'false' then // деинсталляция разрешёна
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n); // откат установки из-за ошибки unarc.dll
SetTaskBarTitle(SetupMessage(msgErrorTitle))
WizardForm.Caption:= SetupMessage(msgErrorTitle) +' — '+ cm('ArcBreak')
end;
end;
end;

// стандартный способ отката (не нужна CurPageChanged), но архивы распаковываются до извлечения файлов инсталлятора
// if CurStep = ssInstall then
// if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if (CurPageID = wpFinished) and (UnPackError <> 0) then
begin // Extraction was unsuccessful (распаковщик вернул ошибку)
// Show error message
WizardForm.FinishedLabel.Font.Color:= $0000C0; // red (красный)
WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
end;
End;

procedure InitializeWizard();
begin
with WizardForm.ProgressGauge do begin
// Create controls to show extended info
StatusInfo:= TLabel.Create(WizardForm);
StatusInfo.parent:=WizardForm.InstallingPage;
StatusInfo.Autosize:= false;
StatusInfo.Top:= Top + ScaleY(32);
StatusInfo.Width:= Width;
ProgressBar := TNewProgressBar.Create(WizardForm);
ProgressBar.SetBounds(Left, StatusInfo.Top + StatusInfo.Height + ScaleY(16), Width, Height);
ProgressBar.Parent := WizardForm.InstallingPage;
ProgressBar.max := 65536;
ProgressBar.Hide; // будет показан при обработке нескольких архивов
ExtractFile:= TLabel.Create(WizardForm);
ExtractFile.parent:=WizardForm.InstallingPage;
ExtractFile.Autosize:= false;
ExtractFile.Top:= ProgressBar.Top + ScaleY(32);
ExtractFile.Width:= Width;
end;
// Create a 'Cancel unpacking' button and hide it for now.
btnCancelUnpacking:=TButton.create(WizardForm);
btnCancelUnpacking.Parent:= WizardForm;
btnCancelUnpacking.SetBounds(WizardForm.cancelbutton.left, WizardForm.cancelbutton.top, WizardForm.cancelbutton.width, WizardForm.cancelbutton.height);
btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
btnCancelUnpacking.Caption:= SetupMessage(msgButtonCancel);
btnCancelUnpacking.Hide;
end;

Procedure DeInitializeSkin;
Begin
UnhookWindowsHookEx(WndHookID) {удаление SendMessage хука}
KillTimer(0, TimerID) {удаление таймера}
End;
дак вот нада что бы сначала выполнялся код, а потом устанавливались программы из секции run и создавались ярлыки. Как это реализовать?

localhost 12-07-2009 22:04 1165806

2serg aka lain
Супер. Работает, как часы. Но это свойство распространяется только на одно окно, остальные остаются неизменными.

Кто умеет, соедините мой скрипт и нижеприведенный.

читать дальше »
procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.BorderStyle := bsSingle;
WizardForm.CancelButton.Top := ScaleY(327);
WizardForm.NextButton.Top := ScaleY(327);
WizardForm.BackButton.Top := ScaleY(327);
WizardForm.ClientHeight := ScaleY(360);

if CurPageID = wpSelectDir then
begin
WizardForm.BorderStyle := bsNone;
WizardForm.ClientHeight := ScaleY(160);
WizardForm.CancelButton.Top := WizardForm.CancelButton.Top - ScaleY(200);
WizardForm.CancelButton.BringToFront;
WizardForm.NextButton.Top := WizardForm.CancelButton.Top;
WizardForm.NextButton.BringToFront;
WizardForm.BackButton.Top := WizardForm.CancelButton.Top;
WizardForm.BackButton.BringToFront;
WizardForm.SelectDirBitmapImage.Hide;
WizardForm.SelectDirLabel.Hide;
WizardForm.SelectDirBrowseLabel.Hide;
WizardForm.DirEdit.Top := ScaleY(1);
WizardForm.DirBrowseButton.Top := 0;
end;
end;


читать дальше »
var
PageNameLabel, PageDescriptionLabel: TLabel;


procedure InitializeWizard();
begin
PageNameLabel := TLabel.Create(WizardForm);
with PageNameLabel do
begin
Left := ScaleX(10);
Top := ScaleY(10);
Width := ScaleX(300);
Height := ScaleY(14);
AutoSize := False;
WordWrap := True;
Font.Color := clWhite;
Font.Style := [fsBold];
ShowAccelChar := False;
Transparent := True;
Parent := WizardForm.MainPanel;
end;

PageDescriptionLabel := TLabel.Create(WizardForm);
with PageDescriptionLabel do
begin
Left := ScaleX(15);
Top := ScaleY(25);
Width := ScaleX(475);
Height := ScaleY(30);
AutoSize := False;
WordWrap := True;
Font.Color := clWhite;
ShowAccelChar := False;
Transparent := True;
Parent := WizardForm.MainPanel;
end;

with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left := ScaleX(0);
Top := ScaleY(0);
Width := Mainpanel.Width;
Height := MainPanel.Height;
end;
end;
end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
end;

DemonAk 12-07-2009 22:10 1165812

Цитата:

Цитата localhost
Супер. Все работает Теперь можно как-нибудь соединить этот скрипт со скриптом растягивания картинки сверху. »

Попробуй программу утилита объединения скриптов

serg aka lain 13-07-2009 00:33 1165927

localhost,
Цитата:

Цитата localhost
Кто умеет, соедините мой скрипт и нижеприведенный. »

ну, это совсем просто
Код:

var
  PageNameLabel, PageDescriptionLabel: TLabel;

procedure InitializeWizard();
begin
  WizardForm.PageNameLabel.Hide;
  WizardForm.PageDescriptionLabel.Hide;

  WizardForm.WizardSmallBitmapImage.SetBounds(0, 0, WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);

  PageNameLabel := TLabel.Create(WizardForm);
  PageNameLabel.SetBounds(ScaleX(10), ScaleY(10), ScaleX(300), ScaleY(14));
  PageNameLabel.AutoSize := False;
  PageNameLabel.WordWrap := True;
  PageNameLabel.Font.Color := clWhite;
  PageNameLabel.Font.Style := [fsBold];
  PageNameLabel.ShowAccelChar := False;
  PageNameLabel.Transparent := True;
  PageNameLabel.Parent := WizardForm.MainPanel;

  PageDescriptionLabel := TLabel.Create(WizardForm);
  PageDescriptionLabel.SetBounds(ScaleX(15), ScaleY(25), ScaleX(475), ScaleY(30));
  PageDescriptionLabel.AutoSize := False;
  PageDescriptionLabel.WordWrap := True;
  PageDescriptionLabel.Font.Color := clWhite;
  PageDescriptionLabel.ShowAccelChar := False;
  PageDescriptionLabel.Transparent := True;
  PageDescriptionLabel.Parent := WizardForm.MainPanel;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.BorderStyle := bsSingle;
  WizardForm.CancelButton.Top := ScaleY(327);
  WizardForm.NextButton.Top := ScaleY(327);
  WizardForm.BackButton.Top := ScaleY(327);
  WizardForm.ClientHeight := ScaleY(360);
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;

  if CurPageID = wpSelectDir then
  begin
    WizardForm.BorderStyle := bsNone;
    WizardForm.ClientHeight := ScaleY(160);
    WizardForm.CancelButton.Top := WizardForm.CancelButton.Top - ScaleY(200);
    WizardForm.CancelButton.BringToFront;
    WizardForm.NextButton.Top := WizardForm.CancelButton.Top;
    WizardForm.NextButton.BringToFront;
    WizardForm.BackButton.Top := WizardForm.CancelButton.Top;
    WizardForm.BackButton.BringToFront;
    WizardForm.SelectDirBitmapImage.Hide;
    WizardForm.SelectDirLabel.Hide;
    WizardForm.SelectDirBrowseLabel.Hide;
    WizardForm.DirEdit.Top := ScaleY(1);
    WizardForm.DirBrowseButton.Top := 0;
  end;
end;


localhost 13-07-2009 17:23 1166543

А вот еще есть такой вопрос. Например есть картинка размером 500х500пх и ее надо впихнуть в верхний хедер инсталлятора. Нашел код, который позволяет это сделать. Как указать размеры для компилятора, чтобы картинка показывалась нормально, а не сжато.

читать дальше »
procedure InitializeWizard();
begin
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.WizardSmallBitmapImage.Left := ScaleX(0);
WizardForm.WizardSmallBitmapImage.Top := ScaleY(0);
WizardForm.WizardSmallBitmapImage.Width := WizardForm.MainPanel.Width;
WizardForm.WizardSmallBitmapImage.Height := WizardForm.MainPanel.Height;
end;

p3rf3ct1c 13-07-2009 18:07 1166585

localhost, покажите скрин.

serg aka lain 13-07-2009 19:33 1166669

Цитата:

есть картинка размером 500х500пх и ее надо впихнуть в верхний хедер инсталлятора. Нашел код, который позволяет это сделать. Как указать размеры для компилятора, чтобы картинка показывалась нормально, а не сжато.
localhost, Ну у MainPanel, на которую ложится WizardSmallBitmapImage составляет 497х58, так что Bitmap по-всякому будет сжат.
Как вариант подогнать нужные размеры в каком-нибудь графическом редакторе типа Photoshop, ну или в крайнем случае, в мега редакторе от Майкрософт (Paint)

localhost 13-07-2009 20:11 1166701

Цитата:

localhost, Ну у MainPanel, на которую ложится WizardSmallBitmapImage составляет 497х58, так что Bitmap по-всякому будет сжат.
Как вариант подогнать нужные размеры в каком-нибудь графическом редакторе типа Photoshop, ну или в крайнем случае, в мега редакторе от Майкрософт (Paint)
Значит сам инсталятор не подогнать под размеры картинки, только обрезать через графические редакторы.

serg aka lain 13-07-2009 21:09 1166739

Цитата:

Цитата localhost
Значит сам инсталятор не подогнать под размеры картинки, только обрезать через графические редакторы. »

Саму форму можно подогнать, но ИМХО будет не красиво, и не стоит затраченных усилий.

Хотя, вот пример того, что получится если картику делать 500х500
Код:

[Setup]
AppName=test
AppVerName=test
DefaultDirName={pf}\test
outputdir=userdocs:.
WizardSmallImageFile=new.bmp

код:

function GetSystemMetrics(nIndex:Integer):Integer;
 external 'GetSystemMetrics@user32.dll stdcall';

procedure InitializeWizard();
begin
  WizardForm.PageNameLabel.Hide;
  WizardForm.PageDescriptionLabel.Hide;
  WizardForm.Height := WizardForm.Height + ScaleY(442);
  WizardForm.OuterNotebook.Height := WizardForm.OuterNotebook.Height + ScaleY(442);
  WizardForm.Bevel1.Top := WizardForm.Bevel1.Top + ScaleY(442);
  WizardForm.InnerNotebook.Top := WizardForm.InnerNotebook.Top + ScaleY(442);
  WizardForm.MainPanel.Height := ScaleY(500);
  WizardForm.Bevel.Top := WizardForm.Bevel.Top + ScaleY(442);
  WizardForm.CancelButton.Top := WizardForm.CancelButton.Top + ScaleY(442);
  WizardForm.NextButton.Top := WizardForm.NextButton.Top + ScaleY(442);
  WizardForm.BackButton.Top := WizardForm.BackButton.Top + ScaleY(442);
  WizardForm.WizardBitmapImage.Height := WizardForm.WizardBitmapImage.Height + ScaleY(442);
  WizardForm.WizardSmallBitmapImage.SetBounds(0, 0, WizardForm.MainPanel.Width, WizardForm.MainPanel.Height - ScaleY(1));
  WizardForm.WizardBitmapImage2.Height := WizardForm.WizardBitmapImage2.Height + ScaleY(442);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.Top := GetSystemMetrics(1) / 2 - WizardForm.Height / 2;
end;


murder 14-07-2009 19:02 1167606

Добрый вечер!
Нужно выполнить при деинсталляции такой код:
Код:

[UninstallRun]
Filename: regsvr32.exe; Parameters: /u /s %ProgramFiles%\VSO\Image Resizer\RSZShell.dll

но выдаёт ошибку из-за пробела в пути. Если путь взять в кавычки, то компилятор выдаёт синтаксическую ошибку.
При регистрации библиотеки при установке ошибки не возникает. Как правильно в таком случае указать путь?
-----
разобрался, вместо %ProgramFiles%\VSO\Image Resizer\ ввёл {app}

boss911 14-07-2009 20:58 1167721

Цитата:

Цитата murder
разобрался, вместо %ProgramFiles%\VSO\Image Resizer\ ввёл {app} »

Или можно поступить так (красивее), например:
Код:

Source: VSO\Image Resizer\RSZShell.dll; DestDir: {app}\VSO\Image Resizer; Flags: regserver
То есть, при копировании (инсталляции) этого файла, флаг 'regserver' зарегистрирует файл (regsvr32 /s), а перед деинсталляцией дерегистрирует (regsvr32 /u /s). Но это только в том случае, если при установке файла вам нужно его зарегистрировать, иначе при деинсталляции его нет смысла дерегистрировать, если, конечно, файл не был зарегистрирован чем-то (не вашим инсталлятором) другим.

DemonAk 15-07-2009 21:00 1168715

Привет всем, как сделать что бы программа из секции run запускалась и устанавливалась в режиме совместимости с winxp sp3, а то на win7 она не хочет ставится. Как это реализовать?

Sserss 15-07-2009 21:14 1168728

Нужна помощь.
Что нужно прописать в скрипте для создания ярлыка для ***.exe файла,но задать иконку для него из файла ***.ico?
[Icons]
Name: {commondesktop}\Ghost; Filename: {app}\ghost_w32.exe; WorkingDir: {app};Tasks: DesktopIcon

serg aka lain 15-07-2009 21:23 1168736

Sserss

Name: {commondesktop}\Ghost; Filename: {app}\ghost_w32.exe; WorkingDir: {app}; IconFilename: "{app}\icon.ico"; IconIndex: "0"; Tasks: DesktopIcon

з.ы. IconIndex не обязательный параметр, по умолчанию IconIndex: "0";

Sserss 16-07-2009 13:51 1169387

serg aka lain, Спасибо,работает !

tarantulMF 16-07-2009 16:53 1169563

Всем привет,

Заше в тупик вот по какому вопросу:
1. Есть сетап который ставит несколько компонент, каждая компонента, это набор файлов ~50
2. При повторном запуске сетапа надо проверять какие компоненыт стоят и их отмечать (это не проблема, реализовал)
3. При финише сетапа надо смотреть какие коспоненты были анчекнуты и деинсталировать их а заодно все связанные с ними, как это реализовать не нашел, кроме как написать руками функцию которая ьудет смотреть чекнута ли компонента и удалять все ее файлы, но при этом я так понимаю unins*.dat который создался при первом инстале не будет обновляться, я не ошибаюсь?
4. Нашел UninsHs но он дает только дополнительный диалог Modify/Repair/Remove, а всю функциональность все равно надо самому прописывать.

Есть ли какое-то "красивое" решение в стиле MSI сетапов, которые по выбранным в данном сетапе компонентам производит установку/удаление компонент.

Всем заранее спасибо

serg aka lain 16-07-2009 19:53 1169728

Цитата:

Цитата tarantulMF
Есть ли какое-то "красивое" решение в стиле MSI сетапов, которые по выбранным в данном сетапе компонентам производит установку/удаление компонент. »

Штатно, нет. Стороннего решения тоже не видел.
Остаётся только это.
Цитата:

написать руками функцию которая ьудет смотреть чекнута ли компонента и удалять все ее файлы »
Или использовать MSI
Насчёт unins000.dat,При повторном запуске программа установки сообщает, что отмена выбора компонентов не удалит их. При следующем запуске отмеченными будут компоненты, выбранные при предыдущей установке. Так что, думаю использовать свою функцию, которая проверяет отмеченные компоненты, будет неплохим решением.

murder 17-07-2009 15:22 1170601

Как правильно импортировать в реестр через InnoSetup ключ с именем, заключённым в {xxxx}?
Если просто ввести {хххх} - выдаёт ошибку. Если {{xxxx} - ошибки нет, но в реестр заносится уже не {xxxx}, a xxxx, без скобок.
Код:

Root: HKLM; SubKey: SOFTWARE\Licenses; ValueType: binary; ValueName: {{FFFFFF}; ValueData: ff ff ff ff ff ff ff; Flags: uninsdeletevalue uninsdeletekeyifempty

boss911 17-07-2009 17:31 1170722

murder
Код:

Root: HKLM; SubKey: SOFTWARE\Licenses; ValueType: binary; ValueName: {{FFFFFF}; ValueData: ff ff ff ff ff ff ff; Flags: uninsdeletevalue uninsdeletekeyifempty
У меня заносится правильно - {FFFFFF}.

МИШАНЧИК 17-07-2009 18:08 1170752

Serega, подскажите пожалуйста!
Здесь Вы привели пример шифрование инсталлятора.
Но при попытке скомпилировать, просит IScrypt.dll.
Где её можно взять? Дайте пожалуйста ссылку.

Serega 17-07-2009 18:19 1170761

Цитата:

Цитата МИШАНЧИК
Где её можно взять? »

На этой странице.

МИШАНЧИК 17-07-2009 18:23 1170770

Serega, Большое Вам спасибо!
И ещё вопрос. Она должна лежать в папке Инно?
Вопрос снят. Закинул в папку Инно, вс работает.
Спасибо.

murder 17-07-2009 20:01 1170837

boss911,
У меня почему-то вносится раз через раз и меняется вносимое значение

Rosich 19-07-2009 21:12 1172189

Прошу помощи у меня возникла проблема, в скрипте не работает бекап файлов:
в папку Backup файлы копируются, а при деинсталляции подмененные файлы просто удаляются, из бекапа не восстанавливаются. Вот мой скрипт, даю его с небольшими сокращениями и жду помощи.
читать дальше »

Код:



#define TIME_FOR_VIEW 4
#include "SHFileOperation.iss"

[Setup]
AppName=The Sims™ 3
UninstallDisplayName={#SetupSetting("AppName")}
AppVerName=1.0.631
DefaultDirName={code:GetInstallPath}
UninstallFilesDir={pf}\InstallShield Installation Information\{{C05D8CDB-417D-4335-A38C-A0659EDFD6B8}
DefaultGroupName=Electronic Arts\The Sims™ 3
AppID={{C05D8CDB-417D-4335-A38C-A0659EDFD6B8}
Compression=lzma/ultra64
InternalCompressLevel=ultra64
DiskSliceSize=1561610132
ReserveBytes=0
MinVersion=0,5.01.2600sp1
AppVersion=1.0.631
VersionInfoVersion=1.0.631
VersionInfoCompany=Electronic Arts, Inc.
VersionInfoCopyright=Copyright © 2005-2009 Electronic Arts Inc.
AppPublisherURL=http://www.TheSims3.com
AppCopyright=Copyright © 2005-2009 Electronic Arts Inc.
AppPublisher=Electronic Arts
VersionInfoTextVersion=2009-06-19-1744 (by codebuilder on SIMS-BUILD141)
SetupIconFile=E:\Мои документы\Мои Проекты\EA Games\Electronic Arts\Sims3.ico
UninstallDisplayIcon={app}\Game\Bin\eauninstall.ico
ComponentsListTVStyle=true
ComponentsListBtnImageFile=btnimage.bmp
LanguageDetectionMethod=none
ShowLanguageDialog=no
DirExistsWarning=no
UserInfoPage=false
SolidCompression=true
DiskSpanning=true
TimeStampsInUTC=true
AlwaysShowDirOnReadyPage=true
AlwaysShowGroupOnReadyPage=true
ShowTasksTreeLines=true
AlwaysUsePersonalGroup=true
FlatComponentsList=false
AllowNoIcons=true
AllowRootDirectory=true
RestartIfNeededByRun=false
DisableDirPage=false
DisableProgramGroupPage=true
ChangesEnvironment=true

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom
Name: compact; Description: Компактная установка

[Components]
Name: sims3; Description: Установить патчь ''NoCD'' для The Sims™ 3; Types: compact custom full
Name: resce; Description: Установить файл ''Resource.cfg''; Types: compact custom full
Name: sicoca; Description: Перезагрузить скины, удалив файл кэша; Types: compact custom full; Flags: disablenouninstallwarning
Name: bdshop; Description: Создание персонажей в The Sims 3; Types: full; Flags: checkablealone Collapsed
Name: bdshop\ncssnr; Description: Обнаженное тело в разделах ''Ночное белье'' и ''Купальные костюмы''; Types: full; Flags: exclusive
Name: bdshop\ntabfma; Description: Обнаженное тело во всех разделах игры The Sims 3; Types: full; Flags: exclusive
Name: bdshop\wom; Description: Обнаженное тело взрослой женщины; Flags: checkablealone; Types: full
Name: bdshop\wom\bbcm; Description: Прорисованная женская грудь; Types: full
Name: bdshop\wom\nbnbtr; Description: Невидимый бюстгальтер и топлес для женщин; Types: full; Flags: checkablealone Collapsed
Name: bdshop\wom\nbnbtr\nudetop; Description: Топлес для женского тела; Types: full
Name: bdshop\wom\nbnbtr\nude; Description: Бюстгальтер без бретелек; Types: full; Flags: checkablealone Collapsed
Name: bdshop\wom\nbnbtr\nude\braal; Description: Невидимый бюстгальтер (обычный бюстгальтер будет недоступен); Types: full; Flags: exclusive
Name: bdshop\wom\nbnbtr\nude\bram; Description: Бюстгальтер без бретелек в разделе ''Ночное белье''; Types: full; Flags: exclusive
Name: bdshop\itdtsr; Description: Текстуры тела с блеском кожи и лобковыми волосами; Types: full; Flags: exclusive
Name: bdshop\itdstsr; Description: Текстуры тела с блеском кожи без лобковых волос; Types: full; Flags: exclusive checkablealone  Collapsed
Name: bdshop\itdstsr\insksh; Description: Натуральный блеск кожи; Types: full
Name: bdshop\itdstsr\motefama; Description: Мужское лицо в деталях; Types: full
Name: bdshop\itdstsr\motefafe; Description: Женское лицо в деталях; Types: full
Name: bdshop\itdstsr\iywdet; Description: Женское тело в деталях; Types: full; Flags: checkablealone
Name: bdshop\itdstsr\iywdet\ffuba; Description: Женское тело, грудь без сосков; Types: full; Flags: exclusive
Name: bdshop\itdstsr\iywdet\fnion; Description: Женское тело, грудь с сосками; Types: full; Flags: exclusive
Name: bdshop\itdstsr\iywmal; Description: Мужское тело в деталях; Types: full; Flags: checkablealone
Name: bdshop\itdstsr\iywmal\mwiha; Description: Мужское тело с сосками и волосами на теле; Types: full; Flags: exclusive
Name: bdshop\itdstsr\iywmal\mfuba; Description: Мужское тело с сосками, без волос на теле; Types: full; Flags: exclusive
Name: gmmod; Description: Моды для игры The Sims 3; Types: full; Flags: checkablealone Collapsed
Name: gmmod\mdem; Description: Обнаженное тело взрослого мужчины; Types: full; Flags: checkablealone Collapsed
Name: gmmod\mdem\mesh1; Description: Взрослый мужчина без волос на теле; Types: full; Flags: exclusive
Name: gmmod\mdem\mesh0; Description: Взрослый мужчина с волосами на теле; Types: full; Flags: exclusive
Name: gmmod\mdem\dmenr; Description: Пенис для взрослого мужского тела; Types: full; Flags: checkablealone Collapsed
Name: gmmod\mdem\dmenr\mesh2; Description: Пенис в состоянии эрекции; Types: full; Flags: exclusive
Name: gmmod\mdem\dmenr\mesh3; Description: Замена основной части тела; Types: full; Flags: exclusive
Name: gmmod\mdem\dmenr\mesh4; Description: Замена всего мужского тела; Types: full; Flags: exclusive
Name: gmmod\inteen; Description: INTEEN 3 MOD с обновлением; Types: full; Flags: checkablealone Collapsed
Name: gmmod\inteen\enab; Description: INTEEN 3 MOD - включить романтические опции; Types: full
Name: gmmod\inteen\updat; Description: Обновление для INTEEN 3 MOD; Types: full
Name: gmmod\inteen\tabmp; Description: Taboo Mod + Polygamy - включает полигамию; Types: full
Name: gmmod\inteen\ubta; Description: Uber Taboo + Polygamy - полигамные связи со всеми; Types: full
Name: gmmod\alamft; Description: Материнство для подростков; Types: full
Name: gmmod\alamft; Description: Woohoo + беременность и брак для подростков; Types: full
Name: gmmod\unpt; Description: Патч Антицензор; Types: full
Name: sims; Description: Готовые персонажи для The Sims 3; Types: full; Flags: checkablealone Collapsed
Name: sims\pahi; Description: Пэрис Хилтон; Types: full

[Tasks]
Name: src; Description: Сохранить резервную копию файлов; Components: sims3 gmmod\inteen\tabmp gmmod\inteen\ubta gmmod\inteen\updat gmmod\unpt

[Files]
Source: InnoCallback.dll; Flags: dontcopy
Source: images\Image_*.bmp; Flags: dontcopy
Source: descctrl.dll; DestDir: {tmp}; Flags: dontcopy
Source: {app}\Game\Bin\eauninstall.ico; DestDir: {app}\Game\Bin; Flags: uninsneveruninstall external dontcopy
Source: ..\Electronic Arts\The Sims 3\Resource.cfg; DestDir: {app}; Flags: ignoreversion; Components: resce
; Бекап файлов в папке с игрой
; Source: {app}\Game\Bin\gameplay.package; DestDir: {app}\Game\Bin; Flags: external ignoreversion; BeforeInstall: CreateBackup; Components: gmmod\inteen\tabmp gmmod\inteen\ubta gmmod\inteen\updat
; Source: {app}\Game\Bin\Shaders_Win32.precomp; DestDir: {app}\Game\Bin; Flags: external ignoreversion; BeforeInstall: CreateBackup; Components: gmmod\unpt
; Source: {app}\Game\Bin\TS3.exe; DestDir: {app}\Game\Bin; Flags: external ignoreversion; BeforeInstall: CreateBackup; Components: sims3
; Taboo Mod + Polygamy enables the same as INTEEN 3
Source: ..\Sims 3\Game Mods\Inteen 3\Taboo__Polygamy_UPDATED\Sanati's no jealousy mod (to be used in conjunction with TeenPregnancy mod).package; DestDir: {app}\Mods\Packages; Flags: ignoreversion; Components: gmmod\inteen\tabmp
Source: ..\Sims 3\Game Mods\Inteen 3\Taboo__Polygamy_UPDATED\TeenPregnancyNoJealousy (needs Sanati's no jealousy mod to work).package; DestDir: {app}\Mods\Packages; Flags: ignoreversion; Components: gmmod\inteen\tabmp
Source: ..\Sims 3\Game Mods\Inteen 3\Taboo__Polygamy_UPDATED\gameplay.package; DestDir: {app}\Game\Bin; Flags: ignoreversion; BeforeInstall: CreateBackup; Components: gmmod\inteen\tabmp
; Uber Taboo + Polygamy is the same as Taboo + Polygamy
Source: ..\Sims 3\Game Mods\Inteen 3\Uber_Taboo__Polygamy_UPDATED\TeenPregnancyVers3.package; DestDir: {app}\Mods\Packages; Flags: ignoreversion; Components: gmmod\inteen\ubta
Source: ..\Sims 3\Game Mods\Inteen 3\Uber_Taboo__Polygamy_UPDATED\gameplay.package; DestDir: {app}\Game\Bin; Flags: ignoreversion; BeforeInstall: CreateBackup; Components: gmmod\inteen\ubta
; INTEEN 3 MOD - UPDATED
Source: ..\Sims 3\Game Mods\Inteen 3\Inteen_3_-_UPDATED\TeenPregnancyVers3.package; DestDir: {app}\Mods\Packages; Flags: replacesameversion; Components: gmmod\inteen\updat
Source: ..\Sims 3\Game Mods\Inteen 3\Inteen_3_-_UPDATED\gameplay.package; DestDir: {app}\Game\Bin; Flags: ignoreversion; BeforeInstall: CreateBackup; Components: gmmod\inteen\updat
Source: ..\Sims 3\Game Mods\The Uncensored Patch\Shaders_Win32.precomp; DestDir: {app}\Game\Bin; Flags: ignoreversion; BeforeInstall: CreateBackup; Components: gmmod\unpt
Source: ..\Sims 3\TS3.exe; DestDir: {app}\Game\Bin; Flags: ignoreversion; BeforeInstall: CreateBackup; Components: sims3
; All Adult Maternity For Teens
Source: ..\Sims 3\Game Mods\Teen Woohoo + Pregnancy-Marriage\gameplay.package; DestDir: {app}\Mods\Packages; Flags: ignoreversion; Components: gmmod\alamft
; Это не в бекапе INTEEN 3 MOD - d3dx9_31.dll
Source: ..\Sims 3\Game Mods\Inteen 3\d3dx9_31\d3dx9_31.dll; DestDir: {app}\Game\Bin; Flags: ignoreversion; Components: gmmod\inteen\enab
Source: ..\Sims 3\Game Mods\Inteen 3\d3dx9_31\d3dx9_31.dll; DestDir: {app}\Game\Bin; Flags: ignoreversion; Components: gmmod\inteen\updat
Source: ..\Sims 3\Game Mods\Inteen 3\d3dx9_31\d3dx9_31.dll; DestDir: {app}\Game\Bin; Flags: ignoreversion; Components: gmmod\inteen\tabmp
Source: ..\Sims 3\Game Mods\Inteen 3\d3dx9_31\d3dx9_31.dll; DestDir: {app}\Game\Bin; Flags: ignoreversion; Components: gmmod\alamft
; Nude Bra and Nude Body Top Replacement
Source: ..\Sims 3\Body Shop\Body Types\Nude Bra and Nude Body Top Replacement\MTS_Inks71_nudebraAlphaHide.package; DestDir: {app}\Mods\Packages; Flags: ignoreversion; Components: bdshop\wom\nbnbtr\nude\braal
Source: ..\Sims 3\Body Shop\Body Types\Nude Bra and Nude Body Top Replacement\MTS_Inks71_nudeBraMesh.package; DestDir: {app}\Mods\Packages; Flags: ignoreversion; Components: bdshop\wom\nbnbtr\nude\bram
Source: ..\Sims 3\Body Shop\Body Types\Nude Bra and Nude Body Top Replacement\MTS_Inks71_nudeTop0.package; DestDir: {app}\Mods\Packages; Flags: ignoreversion; Components: bdshop\wom\nbnbtr\nudetop
=======разрыв кода========
Source: ..\Sims 3\Game Mods\Teen Woohoo + Pregnancy-Marriage\TeenMarriage.package; DestDir: {app}\Mods\Packages; Flags: ignoreversion; Components: gmmod\alamft
Source: ..\Sims 3\Game Mods\Teen Woohoo + Pregnancy-Marriage\TeenPregnancyNoJealousy (needs Sanati's no jealousy mod to work).package; DestDir: {app}\Mods\Packages; Flags: ignoreversion; Components: gmmod\alamft
Source: ..\Sims 3\Game Mods\Teen Woohoo + Pregnancy-Marriage\TeenPregnancyVers3.package; DestDir: {app}\Mods\Packages; Flags: ignoreversion; Components: gmmod\alamft
Source: ..\Sims 3\Sims\Celebrities & Real People\Female\Paris Hilton (sims3)\Paris Hilton_v2.Sims3Pack; DestDir: {userdocs}\Electronic Arts\The Sims 3\Downloads; Flags: ignoreversion uninsneveruninstall; Components: sims\pahi

[Icons]
Name: {group}\{cm:UninstallProgram,addons The Sims™ 3}; Filename: {uninstallexe}; WorkingDir: {app}\Game\Bin; IconFilename: {app}\Game\Bin\eauninstall.ico; IconIndex: 0

[InstallDelete]
Name: {userdocs}\Electronic Arts\The Sims 3\simCompositorCache.package; Type: files; Components: sicoca
Name: {app}\Mods.*; Type: dirifempty
Name: {app}\Mods\*.*; Type: dirifempty
Name: {app}\Mods\Packages.*; Type: dirifempty
Name: {app}\Resource.cfg; Type: files
Name: {app}\Game\Bin\d3dx9_31.dll; Type: files
Name: {app}\Mods\Packages\MTS_Inks71_nudeTop0.package; Type: files
Name: {app}\Mods\Packages\MTS_Inks71_nudeBraMesh.package; Type: files
Name: {app}\Mods\Packages\MTS_Inks71_nudebraAlphaHide.package; Type: files
=======разрыв кода========
Name: {app}\Mods\Packages\tm-NudeFormalTop.package; Type: files
Name: {app}\Mods\Packages\tm-NudeSleepBottom.package; Type: files
Name: {app}\Mods\Packages\gameplay.package; Type: files


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

[CustomMessages]
UninstallProgram=Удалить %1

[Registry]
Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder; Flags: deletekey noerror

[Run]
Filename: {app}\Game\Bin\Sims3Launcher.exe; Description: {cm:LaunchProgram,программу запуска игры The Sims™ 3} и установить дополнения; WorkingDir: {app}\Game\Bin; Flags: nowait skipifdoesntexist postinstall skipifsilent hidewizard

[UninstallDelete]
Name: {app}\Game\Bin\d3dx9_31.dll; Type: files
Name: {app}\Mods.*; Type: dirifempty
Name: {app}\Mods\*.*; Type: dirifempty
Name: {app}\Mods\Packages.*; Type: dirifempty
Name: {app}\Resource.cfg; Type: files
Name: {app}\Mods\Packages\MTS_Inks71_nudeTop0.package; Type: files
Name: {app}\Mods\Packages\MTS_Inks71_nudeBraMesh.package; Type: files
Name: {app}\Mods\Packages\MTS_Inks71_nudebraAlphaHide.package; Type: files
Name: {app}\Mods\Packages\afbottomnude_jonha.package; Type: files
Name: {app}\Mods\Packages\aftopnude_jonha.package; Type: files
Name: {app}\Mods\Packages\ambottomnude_jonha.package; Type: files
===========разрыв кода===========
Name: {app}\Mods\Packages\tm-NudeFormalTop.package; Type: files
Name: {app}\Mods\Packages\tm-NudeSleepBottom.package; Type: files
Name: {app}\Mods\Packages\gameplay.package; Type: files

[Code]
// Бекап файлов
function MoveFile(const srcFile, destFile: PChar): Integer;
external 'MoveFileA@kernel32.dll stdcall';

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
if IsTaskSelected('src') then
begin
  basePath := ExpandConstant('{app}\Game\Bin');
    srcFile := ExpandConstant(CurrentFileName);
    shortPath := srcFile;
  StringChangeEx(shortPath, basePath, '', True);
  destFile := ExpandConstant('{app}\Game\Bin\Backup') + shortPath;
 ForceDirectories(ExtractFilePath(destFile));
 MoveFile(PChar(srcFile), PChar(destFile));
end;
end;

procedure CurUninstallStepChanged1(CurUninstallStep: TUninstallStep);
begin
 if CurUninstallStep = usPostUninstall then
begin
  MoveDir(ExpandConstant('{app}\Game\Bin\Backup\'), ExpandConstant('{app}\Game\Bin\Backup'));
  RemoveDir(ExpandConstant('{app}\Game\Bin\Backup\'));
end;
end;

// Скрипт устанавливает зеленый цвет выбора компонентов и различные эффекты
// Как изменять строки в секции [Components] (при выборе компонентов)
//    WizardForm.ComponentsList.ItemFontStyle[5] - порядковый номер строки компонентов, отражает название компонента в секции [Components]
//  [fsBold]      - полужирный шрифт
//  [fsItalic]    - курсив шрифта
//  [fsUnderline] - подчеркнутый шрифт
//  [fsStrikeOut] - зачеркнутый шрифт
//  WizardForm.ComponentsList.SubItemFontStyle[5] - порядковый номер размера компонента
//  Flags: Collapsed  - говорит компилятору, что по умолчанию эти компоненты свернуты
procedure InitializeWizard2();
begin
  WizardForm.ComponentsList.ItemFontStyle[0] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[1] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[2] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[3] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[6] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[10] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[14] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[18] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[21] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[24] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[25] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[28] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[32] := [fsBold];
  WizardForm.ComponentsList.ItemFontStyle[40] := [fsBold];

  WizardForm.ComponentsList.SubItemFontStyle[0] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[1] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[2] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[3] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[6] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[10] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[14] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[18] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[21] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[24] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[25] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[28] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[32] := [fsBold];
  WizardForm.ComponentsList.SubItemFontStyle[40] := [fsBold];
end;

//Запуск программы, проверка ключа в реестре
function GetInstallPath( AppID: String ): String;
var Path: String;
begin
 Path:= '';
 if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{C05D8CDB-417D-4335-A38C-A0659EDFD6B8}','InstallLocation', Path) then
        RegQueryStringValue(HKLM, 'SOFTWARE\Sims\The Sims 3','Install Dir', Path);
        Result := Path;
end;

function InitializeSetup() : Boolean;
begin
 Result := True;
 if (FileSearch('Game\Bin\TS3.exe', ExpandConstant('{code:GetInstallPath}')) = '') then
 begin
  MsgBox('Для установки этого дополнения требуется предварительная установка игры {#SetupSetting("AppName")}.' #13#13
        'Установите {#SetupSetting("AppName")}, после этого продолжите установку дополнения.' ,mbCriticalError , mb_Ok);
  Result:= False;
  exit;
 end
end;

// Слайд-шоу в окне инсталлятора
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

var
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  case currTime of
  {#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
  2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_3.bmp')) end;
  3*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_4.bmp')) end;
//  4*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_5.bmp')) end;
//  5*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_6.bmp')) end;
//  6*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_7.bmp')) end;
//  7*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_8.bmp')) end;
  end;
  if CurrTime = 3*{#TIME_FOR_VIEW} then CurrTime := -1;
//  if CurrTime = 7*{#TIME_FOR_VIEW} then CurrTime := -1;
end;

procedure DeInitializeSetup();
begin
 KillTimer(0, TimerID);
end;

procedure InitializeWizard3;
begin
  ExtractTemporaryFile('Image_1.bmp');
  ExtractTemporaryFile('Image_2.bmp');
  ExtractTemporaryFile('Image_3.bmp');
  ExtractTemporaryFile('Image_4.bmp');
//  ExtractTemporaryFile('Image_5.bmp');
//  ExtractTemporaryFile('Image_6.bmp');
//  ExtractTemporaryFile('Image_7.bmp');
//  ExtractTemporaryFile('Image_8.bmp');

  currTime := 0;
  SplashImage := TBitmapImage.Create(WizardForm);
  SplashImage.Top := 0;
  SplashImage.Left := 0;
  SplashImage.Width := WizardForm.MainPanel.Width;
  SplashImage.Height := WizardForm.Bevel.Top;
  SplashImage.Parent := WizardForm.InnerPage;
  SplashImage.Stretch := True;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_1.bmp'));
  SplashImage.Hide;

  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
  WizardForm.ProgressGauge.Left := ScaleX(10);
  WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
  WizardForm.ProgressGauge.Height := 16;
  WizardForm.ProgressGauge.Hide;

  WizardForm.FileNameLabel.Parent := WizardForm;
  WizardForm.FileNameLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
  WizardForm.FileNameLabel.Left := ScaleX(10);
  WizardForm.FileNameLabel.Width := ScaleX(397);
  WizardForm.FileNameLabel.Hide;
end;

procedure CurPageChanged3(CurPageID: Integer);
var
  pfunc: LongWord;
begin
 if (CurPageID = wpInstalling) then
  begin
    pfunc := WrapTimerProc(@OnTimer, 5);
    TimerID := SetTimer(0, 0, 1000, pfunc);
    WizardForm.PageNameLabel.Visible:=false
    WizardForm.PageDescriptionLabel.Visible:=false
    WizardForm.InnerNotebook.Hide;
    WizardForm.Bevel1.Hide;
    WizardForm.MainPanel.Hide;
    WizardForm.PageNameLabel.Hide;
    WizardForm.PageDescriptionLabel.Hide;
    WizardForm.ProgressGauge.Show;
    WizardForm.FileNameLabel.Show;
    SplashImage.Show;
    WizardForm.CancelButton.Enabled :=True
    WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100)
 end else
  begin
    WizardForm.ProgressGauge.Hide;
    SplashImage.Hide;
    WizardForm.FileNameLabel.Hide;
    if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
    begin
      WizardForm.InnerNotebook.Show;
      WizardForm.Bevel1.Show;
      WizardForm.MainPanel.Show;
      WizardForm.PageNameLabel.Show;
      WizardForm.PageDescriptionLabel.Show;
    end;
    If CurPageID=wpFinished then
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  CurUninstallStepChanged1(CurUninstallStep);
end;

procedure InitializeWizard();
begin
  InitializeWizard2();
  InitializeWizard3();
end

procedure CurPageChanged(CurPageID: Integer);
begin
  CurPageChanged3(CurPageID);
end;


Serega 19-07-2009 21:54 1172239

Rosich, внимательнее посмотрите на вашу процедуру CurUninstallStepChanged1. Прежде всего, MoveDir - не является стандартной функцией Inno и в вашем скрипте я её тоже не вижу и второе, если я правильно понял, MoveDir(ExpandConstant('{app}\Game\Bin\Backup\'), ExpandConstant('{app}\Game\Bin\Backup')), то вы пытаетесь переместить файлы из папки Backup в неё же.

Rosich 20-07-2009 08:44 1172491

Serega
Спасибо большое, за то, что ткнул меня носом в мою ошибку, все работает. Еще одна просьба как сделать так чтобы бекап файлов был автоматический, если выбран компонент и чтобы не было этого окна?

P. S.
Сразу оговорюсь если вырезать из кода скрипта строку:
begin
if IsTaskSelected('src') then
- ничего не будет работать, при установке бекап файлов идет, а при деинсталляции файлы на место не возвращаются, папка Backup не удаляется. То есть, как я понял строки:
begin
MoveDir(ExpandConstant('{app}\Game\Bin\Backup\'), ExpandConstant('{app}\Game\Bin'));
RemoveDir(ExpandConstant('{app}\Game\Bin\Backup\'));
- не работают.

heNch1g 20-07-2009 12:49 1172653

Вопрос к знатокам:

Как сделать новую страницу с двумя радиобаттонами "Быстрая установка" и "Выборочная установка", чтобы при выбранной быстрой установку кнопка далее вела сразу на страницу wpReady а выборочная - далее, ничего не меняя?

В-принципе, страницу с радиобаттонами я сделал, и функцию возвращения 0 или 1 в зависимости от выбора тоже, а вот сделать переходы не судьба) хэлп)

Serega 20-07-2009 17:11 1172889

Цитата:

Цитата Rosich
как сделать так чтобы бекап файлов был автоматический, если выбран компонент »

Удалите секцию [Tasks] и исправьте зависимость в procedure CreateBackup от выбора дополнительной задачи, на зависимость выбора компонентов:
читать дальше »
Код:

procedure CreateBackup;
var
  srcFile, destFile: string;
  basePath, shortPath: string;
begin
  if IsComponentSelected('sims3') or
    IsComponentSelected('gmmod\inteen\tabmp') or
    IsComponentSelected('gmmod\inteen\ubta') or
    IsComponentSelected('gmmod\inteen\updat') or
    IsComponentSelected('gmmod\unpt') then
    begin
      basePath := ExpandConstant('{app}\Game\Bin');
      srcFile := ExpandConstant(CurrentFileName);
      shortPath := srcFile;
      StringChangeEx(shortPath, basePath, '', True);
      destFile := ExpandConstant('{app}\Game\Bin\Backup') + shortPath;
      ForceDirectories(ExtractFilePath(destFile));
      MoveFile(PChar(srcFile), PChar(destFile));
    end;
end;



Цитата:

Цитата heNch1g
а вот сделать переходы не судьба) »

Вам надо использовать функцию ShouldSkipPage
читать дальше »
Цитата:

Цитата из Справки
·функция ShouldSkipPage(PageID: Integer): Boolean;

Мастер вызывает эту внешнюю функцию, чтобы определить, отображать ли дополнительную страницу (заданную в PageID), или нет. При значении True страница будет пропущена; при значении False страница может быть отображена

Обратите внимание: эта внешняя функция не вызывается для страниц wpWelcome, wpPreparing, и wpInstalling, ни для страниц, которые инсталлятор уже определил для пропуска (например, wpSelectComponents для установки, которая не содержит компонентов).

Пример использования:
Код:

function ShouldSkipPage(CurPage: Integer): Boolean;
begin
  if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
    case CurPage of
      wpLicense, wpPassword, wpInfoBefore,
      wpUserInfo, wpSelectDir, wpSelectProgramGroup, wpInfoAfter:
        Result := True;
    end;
end;



Цитата:

Цитата Rosich
RemoveDir(ExpandConstant('{app}\Game\Bin\Backup\')); - не работают. »

RemoveDir удаляет только пустые папки, значит ваша папка не пустая, для удаления не пустой папки, нужно использовать:
Код:

DelTree(ExpandConstant('{app}\Game\Bin\Backup\'), True, True, True);

serg aka lain 20-07-2009 19:28 1173007

Цитата:

Цитата heNch1g
Как сделать новую страницу с двумя радиобаттонами "Быстрая установка" и "Выборочная установка", чтобы при выбранной быстрой установку кнопка далее вела сразу на страницу wpReady а выборочная - далее, ничего не меняя?
В-принципе, страницу с радиобаттонами я сделал, и функцию возвращения 0 или 1 в зависимости от выбора тоже, а вот сделать переходы не судьба) хэлп) »

вот, накидал пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
OutputDir=userdocs:My Program.

Секция коде:

var
  NewPage: TWizardPage;
  NewRadio1, NewRadio2: TNewRadioButton;

procedure CreatePage();
var
  Header, Button1, Button2: TNewStaticText;
begin
  NewPage := CreateCustomPage(wpWelcome, 'Выбор типа установки', 'Эта программа позволяет выбирать тип установки');

  Header := TNewStaticText.Create(NewPage);
  Header.Parent := NewPage.Surface;
  Header.SetBounds(0, 0, WizardForm.InnerNotebook.Width, ScaleY(50));
  Header.Autosize := False;
  Header.WordWrap := True;
  Header.Caption := 'Эта программа позволяет выбирать тип установки, удобно будет как простым юзерам,  так и очень опытным хакерам, программерам и иже с ними.';

  NewRadio1 := TNewRadioButton.Create(NewPage);
  NewRadio1.Parent := NewPage.Surface;
  NewRadio1.SetBounds(ScaleX(20), ScaleY(60), ScaleX(250), ScaleY(14));
  NewRadio1.Caption := 'Быстрая установка';
  NewRadio1.Checked := True;

  Button1 := TNewStaticText.Create(NewPage);
  Button1.Parent := NewPage.Surface;
  Button1.SetBounds(ScaleX(40), ScaleY(80), WizardForm.InnerNotebook.Width - ScaleX(40), ScaleY(40));
  Button1.Autosize := False;
  Button1.WordWrap := True;
  Button1.Caption := 'Быстрая установка - предназначена для обычных юзеров.';

  NewRadio2 := TNewRadioButton.Create(NewPage);
  NewRadio2.Parent := NewPage.Surface;
  NewRadio2.SetBounds(ScaleX(20), ScaleY(120), ScaleX(250), ScaleY(14));
  NewRadio2.Caption := 'Выборочная установка';

  Button2 := TNewStaticText.Create(NewPage);
  Button2.Parent := NewPage.Surface;
  Button2.SetBounds(ScaleX(40), ScaleY(140), WizardForm.InnerNotebook.Width - ScaleX(40), ScaleY(40));
  Button2.Autosize := False;
  Button2.WordWrap := True;
  Button2.Caption := 'Выборочная установка - Предназначена для очень продвинутых юзеров, а так же тех, кто себя такими считает.';
end;

procedure InitializeWizard();
begin
  CreatePage();
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if PageID = wpSelectDir then
  begin
    if NewRadio1.Checked then
      Result := True;
  end;
end;


Rosich 20-07-2009 19:50 1173027

Цитата:

Цитата Serega
Удалите секцию [Tasks] и исправьте зависимость в procedure CreateBackup от выбора дополнительной задачи, на зависимость выбора компонентов:

Спасибо БОЛЬШОЕ ваше решение, подошло как нельзя точнее всех остальных, еще раз БОЛЬШОЕ спасибо.

heNch1g 22-07-2009 13:41 1174584

serg aka lain и Serega
Грасиас! Соединил ваши два скрипта, дописал строчку - работает безупречно! Спасибо!

SuperDan 23-07-2009 00:08 1175130

помогите плиз!
как в inno удалить сохраненки на Vista?

точнее нужен "C:\Users\USER NAME\AppData\Roaming\The Creative Assembly\Empire\save_games"

[code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
ResultStr:string;
begin
case CurUninstallStep of
usPostUninstall:
begin
if MsgBox('Óäàëèòü âñå ñîõðàíåíÿ?', mbInformation, MB_YESNO) = idYes
then
if not DelTree(ExpandConstant('{userdocs}')+'\_____\', True, True, True)
then
MsgBox('Íå óäàëîñü âûïîëíèòü óäàëåíèå' #13#13 'Îáúåêò çàäåéñòâîâàí èëè íå ñóùåñòâóåò', mbError, MB_OK);
end;
end;
end;

вместо "userdocs" "Common AppData"?

Serega 23-07-2009 01:06 1175174

Цитата:

Цитата SuperDan
как в inno удалить сохраненки на Vista?
точнее нужен "C:\Users\USER NAME\AppData\Roaming\The Creative Assembly\Empire\save_games" »

У меня нет Vista, т.е. проверить негде, но попробуйте константу {userappdata}.

Цитата:

Цитата SuperDan
вместо "userdocs" "Common AppData"? »

должно быть {commonappdata}.

serg aka lain 23-07-2009 21:38 1175987

SuperDan,
Можно и так ещё поступить
Код:

DelTree(ExpandConstant('{%userprofile}\AppData\Roaming\The Creative Assembly\Empire\save_games'), True, True, True);

BlackSelf 23-07-2009 21:56 1175998

SuperDan, ну вообще-то C:\Users\USER NAME\AppData\Roaming - это {userappdata}.

Berline 24-07-2009 09:39 1176271

Вопрос снова пальцем в небо, хочу но не знаю, кто может - подскажите пожалуйста:
Как в инсталлятор прикрутить на станицу, где галоячками отмечаем, какие создавать ярлыки, и прочее - в [Tasks] в общем, ещё один комбо бокс - мол добавить в автозагрузку, ли не добавить, и кабы это было для текущего и для всех пользователей - вапще шикарно будет!
Как то так... :help:

Serega 25-07-2009 02:20 1177141

Цитата:

Цитата Berline
в [Tasks] в общем, ещё один комбо бокс - мол добавить в автозагрузку, ли не добавить, и кабы это было для текущего и для всех пользователей »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Tasks]
Name: run; Description: Запускать программу при загрузке Windows
Name: run\all; Description: для всех пользователей; Flags: exclusive
Name: run\user; Description: только для текущего пользователя; Flags: exclusive

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Registry]
Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Run; ValueName: My Program; ValueType: String; ValueData: {app}\MyProg.exe; Flags: uninsdeletevalue; Tasks: run\all
Root: HKCU; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Run; ValueName: My Program; ValueType: String; ValueData: {app}\MyProg.exe; Flags: uninsdeletevalue; Tasks: run\user


Sserss 25-07-2009 14:03 1177354

Помогите со скриптом.
После завершения установки основной программы нужно по выбору пользователя - устанавливать или нет еще две программы WindowsMedia9Encoder и AdobeReader 9. Как скрипт будет выглядеть?

Serega 25-07-2009 14:35 1177368

Цитата:

Цитата Sserss
Помогите со скриптом. »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
Source: WindowsMedia9Encoder.exe; DestDir: {tmp}; Flags: ignoreversion
Source: AdobeReader9.exe; DestDir: {tmp}; Flags: ignoreversion

[Run]
Filename: {tmp}\WindowsMedia9Encoder.exe; WorkingDir: {tmp}; Description: Установить WindowsMedia9Encoder; Flags: postinstall skipifsilent unchecked
Filename: {tmp}\AdobeReader9.exe; WorkingDir: {tmp}; Description: Установить AdobeReader9; Flags: postinstall skipifsilent unchecked


Sserss 25-07-2009 14:54 1177376

Serega,

Спасибо то что нужно!!! :yes:

Serega 25-07-2009 15:18 1177397

Мне в PM задали вопрос, решил написать его здесь, т.к. другим может быть интересен ответ на этот вопрос...
Цитата:

Не знаете ли вы, как можно сделать окно "исталлятора" передвигаемым при выполнение, например этого?:
Код:

Exec(ExpandConstant('{tmp}\arc.exe'), 'x '+AddQuotes(ExpandConstant('{app}\data.arc'))+' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewWaitUntilTerminated, Res);

Нужно в скрипте написать функцию ожидания, здесь поможет ISTask.dll.
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
Source: compiler:Libraries\ISTask.dll; Flags: dontcopy

[Code]
type
  _TMsg = record
    hwnd: HWND;
    message: LongWord;
    wParam: Longint;
    lParam: Longint;
    time: LongWord;
    pt: TPoint;
  end;

const
  PM_REMOVE          = 1;

// пpовеpяет очеpедь пpикладной задачи на сообщение и копиpует его в Msg,
// если в очеpеди нет сообщений, функция выполняет немедленный возвpат и пеpедает упpавление Windows.
function PeekMessage(var lpMsg: _TMsg; hWnd: HWND;
  wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
// пеpеводит комбинации  wm_KeyDown/Up в wm_Char или wm_DeadChar и комбинации wm_SysKeyDown/Up в wm_SysChar или
// wm_SysDeadChar и напpавляет символьное сообщение в очеpедь пpикладной задачи.
function TranslateMessage(const lpMsg: _TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
// пеpедает в Msg сообщение оконной функции окна
function DispatchMessage(const lpMsg: _TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
  external 'RunTask@files:ISTask.dll stdcall delayload setuponly';

procedure Application_ProcessMessages;
var
  Msg: _TMsg;
begin
  while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end;

procedure Run; // здесь ваша функция, где выполняется запуск программы
var
  Res: Integer;
begin
  // запускаем программу с параметром ewNoWait
  if Exec(ExpandConstant('{tmp}\arc.exe'), 'x ' + AddQuotes(ExpandConstant('{app}\data.arc')) + ' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewNoWait, Res) then
    while RunTaskA('arc.exe', False) do // проверяем, работает ли программа
      Application_ProcessMessages;
end;


Qarmaa 25-07-2009 16:07 1177441

Serega, спасибо за пример.
Только, зачем создавать процедуру Run, если всё прекрасно работает через процедуру CurStepChanged?
Примерно так:
читать дальше »
procedure CurStepChanged(CurStep: TSetupStep);
var
Res: Integer;
begin
if CurStep = ssPostInstall then begin

begin
// запускаем программу с параметром ewNoWait
if Exec(ExpandConstant('{app}\arc.exe'), 'x '+AddQuotes(ExpandConstant('{app}\arc.arc'))+' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewNoWait, Res) then
while RunTaskA('arc.exe', False) do // проверяем, работает ли программа
Application_ProcessMessages;
end;

Serega 25-07-2009 20:11 1177552

Цитата:

Цитата Qarmaa
Только, зачем создавать процедуру Run, если всё прекрасно работает через процедуру CurStepChanged? »

Согласен, я показал для примера и даже указал в комментариях:
Цитата:

Цитата Serega
procedure Run; // здесь ваша функция, где выполняется запуск программы »

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

zl0ybot 27-07-2009 10:10 1178715

Здравствуйте.У меня к вам просьба вот в этот скрипт 1.добавить freearc.(чтобы архивы были рядом с setup.exe)2.и еще добавит фоновую музыку (.mp3) 3. чтобы у музыки была кнопка play\pause. (ps я нуб в inno setup)скрипт

gvshil 27-07-2009 10:34 1178730

Подскажите, пожалуйста, какой Flags применить для отмены регистрации DLL при деинсталяции (или достаточно указать Flags: regserver).
Спасибо.

Serega 27-07-2009 14:24 1178947

Цитата:

Цитата zl0ybot
Здравствуйте.У меня к вам просьба вот в этот скрипт »

Существует утилита, для объединения скриптов - InnoSetup Script Joiner

Цитата:

Цитата gvshil
Подскажите, пожалуйста, какой Flags применить для отмены регистрации DLL при деинсталяции (или достаточно указать Flags: regserver »

Достаточно.

mityafm 29-07-2009 09:22 1180403

Как определить факт установленного .NET Framework 1 ?

BlackSelf 29-07-2009 14:52 1180686

mityafm, подойдет?
читать дальше »
Код:

[Setup]
AppName=NETFramewrok
AppVerName=NETFramewrok
DefaultDirName={pf}\NETFramewrok
DisableStartupPrompt=true
InternalCompressLevel=none
Compression=none

[_Code]
function InitializeSetup(): Boolean;
var
    ErrorCode: Integer;
    NetFrameWorkInstalled : Boolean;
    Result1 : Boolean;
begin

          NetFrameWorkInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\.NETFramework\policy\v1.0');
          if NetFrameWorkInstalled =true then
          begin
              Result := true;
          end;
          if NetFrameWorkInstalled = false then
          begin
              NetFrameWorkInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\.NETFramework\policy\v1.1');
              if NetFrameWorkInstalled =true then
              begin
                  Result := true;
              end;

              if NetFrameWorkInstalled =false then
              begin
                        Result1 := MsgBox('This setup requires the .NET Framework. Please download and install the .NET Framework and run this setup again. Do you want to download the framwork now?',
                              mbConfirmation, MB_YESNO) = idYes;
                        if Result1 =false then
                        begin
                            Result:=false;
                        end
                        else
                        begin
                              Result:=false;
                                ShellExec('open', 'http://download.microsoft.com/download/a/a/c/aac39226-8825-44ce-90e3-bf8203e74006/dotnetfx.exe','','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
                        end;
              end;
          end;
end;


Serega 29-07-2009 18:47 1180903

Цитата:

Цитата mityafm
Как определить факт установленного .NET Framework 1 »

Накидал пример, необходимо указать, только минимальную версию .NET Framework:
Пример
Код:

; определение версии установленного .Net Framework

[Setup]
AppName=NetFramework
AppVerName=NetFramework
DefaultDirName={pf}\NetFramework
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
VersionInfoCopyright=Serega

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

[Code]
const
  MinNetFrameWork = 'v1.1'; // минимальная версия NetFrameWork

var
  url: string;

function GetNetFrameWork(ver: string): Integer;
begin
// страница загрузок http://www.microsoft.com/downloads/results.aspx?pocId=&freetext=Framework&DisplayLang=ru
  Result:= 5;
  url:= 'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe';
  case ver of
  'v1.0':
      begin
      // по этой ссылке v1.1, т.к. ссылку на v1.0, я не нашёл... раритет... ;)
        url:= 'http://download.microsoft.com/download/0/8/6/086e7824-ddad-45c0-b765-721e5e28e4c5/dotnetfx.exe';
        Result:= 0;
      end;
  'v1.1':
      begin
        url:= 'http://download.microsoft.com/download/0/8/6/086e7824-ddad-45c0-b765-721e5e28e4c5/dotnetfx.exe';
        Result:= 1;
      end;
  'v2.0':
      begin
        url:= 'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe';
        Result:= 2;
      end;
  'v3.0':
      begin
        url:= 'http://download.microsoft.com/download/4/d/a/4da3a5fa-ee6a-42b8-8bfa-ea5c4a458a7d/dotnetfx3setup.exe';
        Result:= 3;
      end;
  'v3.5':
      begin
        url:= 'http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe';
        Result:= 4;
      end;
  end;
end;

function SearchNetFrameWork: Boolean;
var
  Error: Integer;
  VerNetFrameWork: array of string;
  VerNetFrameWorkInstalled: TArrayOfString;
  i, n: Integer;
begin
  VerNetFrameWork:= ['v1.0', 'v1.1', 'v2.0', 'v3.0', 'v3.5'];
  SetArrayLength(VerNetFrameWork, GetArrayLength(VerNetFrameWork));
  if RegGetSubkeyNames(HKLM, 'SOFTWARE\Microsoft\.NETFramework\policy', VerNetFrameWorkInstalled) then
    begin
      SetArrayLength(VerNetFrameWorkInstalled, GetArrayLength(VerNetFrameWorkInstalled));
      for i:= 0 to GetArrayLength(VerNetFrameWorkInstalled)-1 do
        begin
          for n:= 0 to GetArrayLength(VerNetFrameWork)-1 do
          if VerNetFrameWorkInstalled[i] = VerNetFrameWork[n] then
          if n >= GetNetFrameWork(MinNetFrameWork) then
            begin
              Result:= True;
              Break;
            end
          else
            begin
              if MsgBox('Для этой программы требуется установленный .NET Framework не ниже ' + MinNetFrameWork + '. ' +
                        'Пожалуйста загрузите и установите .NET Framework и запустите установку снова. ' +
                        'Вы хотите загрузить .NET Framework сейчас?', mbConfirmation, MB_YESNO) = idYes then
              ShellExec('open', url,'','',SW_SHOWNORMAL,ewNoWait,Error);
              Result:= False;
            end;
        end;
    end;
end;

function InitializeSetup: Boolean;
begin
  if SearchNetFrameWork then Result:= True;
end;


Drongo 29-07-2009 21:22 1181002

Привет. Только что опять друг попросил слегка переделать тот скрипт. Два нюанса:
1. Добавить строку, чтобы инсталятор проверял систему Windows 7, тоесть работал
2. При любом раскладе, если любой параметр, видеокарта, процессор, система, звуковая, озу. не соответствует минимальному значению, всё равно чтобы кнопка далее была активна.

С первым пунктом мне кажется можно так, но я не уверен:
читать дальше »
Код:

...
if //(Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and  // Windows 2000 SP4
    //(Pos('XP Service Pack 1', SystemVersionPanel.Text) = 0) and  // Windows XP SP1
    (Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and  // Windows XP SP2
    (Pos('XP Service Pack 3', SystemVersionPanel.Text) = 0) and  // Windows XP SP3
    (Pos('Vista', SystemVersionPanel.Text) = 0) then  // Windows Vista (c любым SP или без него)
    (Pos('Windows 7', SystemVersionPanel.Text) = 0) then  // Windows 7
    begin
      SystemVersionPanel.Color := $CCCCFF
      ChangeText := True
    end
...


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

читать дальше »
Код:

...
if ChangeText = True then
    begin
      TopText.Top := 0
      TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям программы.' #13
                        'Пожалуйста, проверьте позиции, выделенные красным цветом.'
      TopText.Font.Color := clRed
      WizardForm.NextButton.Enabled := False // Сменить на True ???
    end
  else
    begin
      TopText.Caption := 'Все компоненты соответствуют минимальным требованиям программы.'
      TopText.Font.Color := clGreen
      TopText.Top := 8
      WizardForm.NextButton.Enabled := True
    end
end;
...


Drongo 29-07-2009 21:25 1181007

Исходный скрипт. Не получилось в один коммент записать, т.к. ограничение в 30000 символов, общий коммент превышает.
читать дальше »
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Need for Speed Most Wanted"
#define MyAppVerName "Need for Speed Most Wanted"
#define MyAppPublisher "EA Games Company."
#define MyAppURL "http://www.needforspeed.com/"
#define MyAppExeName "bin\XR_3DA.exe"
#define TIME_FOR_VIEW 1

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
;AppId={{337AE44F-3DF6-4C55-AFCA-AAA9A6436F0E}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
SetupIconFile=C:\speed.ico
AllowNoIcons=yes
LicenseFile=E:\Need for Speed Most Wanted\Support\en-uk_eula.txt
InfoBeforeFile=E:\Need for Speed Most Wanted\Readme.txt
OutputDir=E:\
OutputBaseFilename=Need for Speed Most Wanted
DiskSpanning=yes
; Если поставить значение '2' будет требовать второй диск, нужно расчитать размер
; от общего размера пакуемых файлов. Минимальный = '262144'
SlicesPerDisk=1
DiskSliceSize=2100000000
DiskClusterSize=4096
ReserveBytes=0
; Хорошее сжатие, обычное
;Compression=lzma/ultra
SolidCompression=yes
; Максимальное 64'битное
Compression=lzma/ultra64
InternalCompressLevel=ultra64

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons};
;Flags: unchecked

[Files]
Source: compiler:Libraries\InnoCallback.dll; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_2.bmp; Flags: dontcopy
; Папка упаковываемой игры
Source: "E:\S.T.A.L.K.E.R\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; WorkingDir: {app}
Name: {group}\SaveEditor; Filename: {app}\SaveEditor.exe; WorkingDir: {app}
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; WorkingDir: {app}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; WorkingDir: {app}; Tasks: desktopicon
Name: {group}\{cm:UninstallProgram, Need for Speed Most Wanted}; Filename: {uninstallexe}; WorkingDir: {app}

[_Code]
type
 PDisplay_Device = record
  cb: DWord;
  DeviceName: array [0..31] of char;
  DeviceString: array [0..127] of char;
  StateFlags: DWord;
  DeviceID, DeviceKey: array [0..127] of char;
 end;

 TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

 TMixerCaps = record
  vPid, vDriverVersion: DWord;
  sName: array [0..31] of char;
  Support, cDestinations: DWord;
 end;

// Проверка версии Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
        {Win9x}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
    LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
    HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
        {WinNT}
  TMemoryStatusEx = record
    dwLength, dwMemoryLoad: DWord;
    LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
    LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
    LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
    HiAvailExtendedVirtual: Integer;
  end;
  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
  external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
// Менять минимальные системные значения
  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
  oneMB = 1024*1024;
  NeedMHz = 1500;
  NeedVideoRAM = 64;
  NeedSoundCard = 'Creative X-Fi';
  NeedMB = 256;
  NeedPageFile = 1024;

var
  WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
  FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
  RunMyProg: TCheckBox;
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;

  InfoPage: TWizardPage;
  TopText, BottomText: TNewStaticText;
  ChangeText: Boolean;
  SystemPanel, ProcessorPanel, VideoPanel,
  AudioPanel, RAMPanel, PageFilePanel: TMemo;
  SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
  AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  lpCaps: TMixerCaps;
  Version: TWindowsVersion;
  MemoryEx: TMemoryStatusEx;
  n, errCode: Integer;
  Keys: TArrayOfString;
  DeviceValue: Cardinal;
  lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
 external 'GetSystemMetrics@user32.dll stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
 external 'GetDeviceCaps@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
 external 'CreateDCA@GDI32 stdcall';

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
 external 'EnumDisplayDevicesA@user32.dll stdcall';

function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
 external 'mixerGetDevCapsA@winmm.dll stdcall';

function mixerGetNumDevs: Integer;
 external 'mixerGetNumDevs@winmm.dll stdcall';

//--------------
function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

function Progress: Integer;
begin
  with WizardForm.ProgressGauge do Result := (Position - Min)/((Max - Min)/100);
end;

function CurrTimer: Integer;
var
  i: Integer;
begin
  i:= Progress;
  if ((i > 0) and (i < 4)) then Result:= 1 else
  if ((i > 4) and (i < 8)) then Result:= 2 else
  if ((i > 8) and (i < 12)) then Result:= 3 else
  if ((i > 12) and (i < 16)) then Result:= 4 else
  if ((i > 16) and (i < 20)) then Result:= 5 else
  if ((i > 20) and (i < 24)) then Result:= 6 else
  if ((i > 24) and (i < 28)) then Result:= 7 else
  if ((i > 28) and (i < 32)) then Result:= 8 else
  if ((i > 32) and (i < 36)) then Result:= 9 else
  if ((i > 36) and (i < 40)) then Result:= 10 else
  if ((i > 40) and (i < 44)) then Result:= 11 else
  if ((i > 44) and (i < 48)) then Result:= 12 else
  if ((i > 48) and (i < 52)) then Result:= 13 else
  if ((i > 52) and (i < 56)) then Result:= 14 else
  if ((i > 56) and (i < 60)) then Result:= 15 else
  if ((i > 60) and (i < 64)) then Result:= 16 else
  if ((i > 64) and (i < 68)) then Result:= 17 else
  if ((i > 68) and (i < 72)) then Result:= 18 else
  if ((i > 72) and (i < 76)) then Result:= 19 else
  if ((i > 76) and (i < 80)) then Result:= 20 else
  if ((i > 80) and (i < 84)) then Result:= 21 else
  if ((i > 84) and (i < 88)) then Result:= 22 else
  if ((i > 88) and (i < 91)) then Result:= 23 else
  if ((i > 91) and (i < 94)) then Result:= 24 else
  if ((i > 94) and (i < 97)) then Result:= 25 else
  if ((i > 97) and (i < 100)) then Result:= 26;
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  case CurrTimer of
    1: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
... 
    26: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_27.bmp')) end;
  end;
end;

procedure RLabelOnClick(Sender: TObject);
begin
  if RunMyProg.Checked = False then
  begin
    RunMyProg.Checked := True;
  end else
    RunMyProg.Checked := False;
end;

// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
  if CurStep = ssDone then
  begin
    if RunMyProg.Checked = True then
    Exec(ExpandConstant('{app}\speed.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  end;
end;

// Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
  if Abs(Bytes/Multiple) > Bytes/Multiple then
    Result := (Bytes/Multiple + 1)*Multiple
  else
    Result := Bytes;
end;

// Перевод числа в значение Бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
  if not noMB then
    Result := FloatToStr(Int(Bytes)) + ' Мб'
  else
                if Bytes < 1024 then
      Result := FloatToStr(Int(Bytes)) + ' Бт'
    else
                        if Bytes/1024 < 1024 then
          Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Кб'
      else
                                        if Bytes/oneMB < 1024 then
            Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Мб'
          else
            if Bytes/oneMB/1000 < 1024 then
                Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Гб'
            else
                                                          Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Тб'
 StringChange(Result, ',', '.')
end;

// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
  while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1)
  Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
  Result := Lo
  if Lo < 0 then
    Result := Result + $7FFFFFFF + $7FFFFFFF + 2
  for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

function CheckCPU(NeedMHz: Integer): Boolean;
var
  String: String;
begin
        String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys)        // Количество ядер
        for n := 0 to GetArrayLength(Keys)-1 do
      RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
        if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
        Exit
  else
    Result := True
end;

function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
        MemoryEx.dwLength := SizeOf(MemoryEx);
        if not GlobalMemoryStatusEx(MemoryEx) then
        MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
  else
          if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
        Exit
    else
        Result := True;
end;

procedure CreateCheckForm();
begin
  TopText := TNewStaticText.Create(InfoPage)
  with TopText do
  begin
    Parent := InfoPage.Surface
    Left := 0
    AutoSize := True
  end

  BottomText := TNewStaticText.Create(InfoPage)
  with BottomText do
  begin
    Parent := InfoPage.Surface
    Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».'
    Font.Color := clBlack
    Left := 0
    Top := 200
    AutoSize := True
  end

  SystemPanel := TMemo.Create(InfoPage)
  with SystemPanel do
  begin
    Text := 'Система'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ScaleY(33)
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  SystemVersionPanel := TMemo.Create(InfoPage)
  with SystemVersionPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := SystemPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  ProcessorPanel := TMemo.Create(InfoPage)
  with ProcessorPanel do
  begin
    Text := 'Процессор'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := SystemPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  ProcessorMHzPanel := TMemo.Create(InfoPage)
  with ProcessorMHzPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := ProcessorPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  VideoPanel := TMemo.Create(InfoPage)
  with VideoPanel do
  begin
    Text := 'Видеоадаптер'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := ProcessorPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  VideoRAMPanel := TMemo.Create(InfoPage)
  with VideoRAMPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := VideoPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  AudioPanel := TMemo.Create(InfoPage)
  with AudioPanel do
  begin
    Text := 'Звуковая карта'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := VideoPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  AudioNamePanel := TMemo.Create(InfoPage)
  with AudioNamePanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := AudioPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  RAMPanel := TMemo.Create(InfoPage)
  with RAMPanel do
  begin
    Text := 'Объём памяти'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := AudioPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end

  RAMTotalPanel := TMemo.Create(InfoPage)
  with RAMTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := RAMPanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end

  PageFilePanel := TMemo.Create(InfoPage)
  with PageFilePanel do
  begin
    Text := 'Файл подкачки'
    Alignment := taCenter
    Parent := InfoPage.Surface
    Left := ScaleX(0)
    Top := RAMPanel.Top + 27
    Width := ScaleX(100)
    Height := ScaleY(22)
    ReadOnly := True
    Color := $EEEEEE
  end;

  PageFileTotalPanel := TMemo.Create(InfoPage)
  with PageFileTotalPanel do
  begin
    Alignment := taLeftJustify
    Parent := InfoPage.Surface
    Left := ScaleX(104)
    Top := PageFilePanel.Top
    Width := ScaleX(310)
    Height := ScaleY(22)
    ReadOnly := True
  end
end;

procedure UpdateInfo();
var
  DeviceName, DeviceKey: String;
begin
  ChangeText := False

  GetWindowsVersionEx(Version)

  // Операционная система:
  SystemVersionPanel.Color := $CCFFCC

  DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
  if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
        RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
  if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
    DeviceName := DeviceName + ' ' + DeviceKey
        StringChange(DeviceName, 'Microsoft ', '')
  SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
                            '.' + IntToStr(Version.Build)

  if //(Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and  // Windows 2000 SP4
    //(Pos('XP Service Pack 1', SystemVersionPanel.Text) = 0) and  // Windows XP SP1
    (Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and  // Windows XP SP2
    (Pos('XP Service Pack 3', SystemVersionPanel.Text) = 0) and  // Windows XP SP3
    (Pos('Vista', SystemVersionPanel.Text) = 0) then  // Windows Vista (c любым SP или без него)
    begin
      SystemVersionPanel.Color := $CCCCFF
      ChangeText := True
    end

  // Процессор:
  ProcessorMHzPanel.Color := $CCFFCC

  if not CheckCPU(NeedMHz) then
    begin
      ProcessorMHzPanel.Color := $CCCCFF
      ChangeText := True
    end

  ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
  if GetArrayLength(Keys) > 1 then
    ProcessorPanel.Text := 'Процессоры' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

  // Видеокарта:
  VideoRAMPanel.Color := $CCFFCC

  lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
  DeviceKey := ''
        n := 0
  while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
            (lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
        for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
  Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127)  // Ключ драйвера получаем из API
        StringChange(DeviceKey, '\Registry\Machine\', '')
  errCode := 1
  DeviceValue := 0
  if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
                for n := 1 to Length(DeviceName) do
      begin
        DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
        errCode := errCode*$100
      end
  else
    if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
    else
        RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
        DeviceName := ''
  for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
  Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

  if DeviceName <> '' then
    if DeviceValue > 0 then
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
    else
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
  else
    begin
      VideoRAMPanel.Text := ' Драйвер устройства не обнаружен'
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  if (DeviceValue/oneMB < NeedVideoRAM) then
    begin
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
    end
  VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
                        IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
                        GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

  // Звуковая карта:
  AudioNamePanel.Color := $CCFFCC

  // for errCode := 0 to 1 do  // Вывод основного звукового устройства
  for errCode := 0 to mixerGetNumDevs do
    begin
                  mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
      DeviceName := ' '
                  for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
      Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
      Delete(DeviceName, Pos(' [', DeviceName), 31)
      StringChange(DeviceName, 'SB ', 'Creative ')
      Delete(DeviceName, Pos(' Audio', DeviceName), 31)
                  SetArrayLength(Keys, errCode)
      if errCode > 0 then Keys[errCode-1] := DeviceName
    end

        if GetArrayLength(Keys) > 1 then
    begin
    AudioPanel.Text := 'Звуковые карты'
    // AudioPanel.Text := 'Звуковые карты (' + IntToStr(GetArrayLength(Keys)) +')'
    AudioNamePanel.Text := ''
    for n := 1 to GetArrayLength(Keys) do
        AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1]  // + '(' + IntToStr(n) + ')'
    end
  else
    if GetArrayLength(Keys) = 0 then
    begin
      AudioNamePanel.Text := ' Драйвер устройства не обнаружен'
      AudioNamePanel.Color := $CCCCFF
      ChangeText := True
    end
      else
      AudioNamePanel.Text := Keys[0]
  if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
    AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')'

  // Объём памяти:
    RAMTotalPanel.Color := $CCFFCC
  if not CheckMemorySize(NeedMB) then
    begin
      RAMTotalPanel.Color := $CCCCFF
      ChangeText := True
    end
  RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' всего, ' +
                              ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
                                                        Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' используется, ' +
                              ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' свободно'

  // Виртуальная память:
  PageFileTotalPanel.Color := $CCFFCC
  PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' всего, ' +
                                  ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
                                            Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' занято системным кэшем'
  if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
    begin
      PageFileTotalPanel.Color := $CCCCFF
      ChangeText := True
    end

  if ChangeText = True then
    begin
      TopText.Top := 0
      TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям программы.' #13
                        'Пожалуйста, проверьте позиции, выделенные красным цветом.'
      TopText.Font.Color := clRed
      WizardForm.NextButton.Enabled := False
    end
  else
    begin
      TopText.Caption := 'Все компоненты соответствуют минимальным требованиям программы.'
      TopText.Font.Color := clGreen
      TopText.Top := 8
      WizardForm.NextButton.Enabled := True
    end
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
  WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
  WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
  PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
  FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
  FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
  RunLabel.Caption := 'Запустить игру';

  if CurPageID = InfoPage.ID then UpdateInfo();  // Обновление информации о системе

  if (CurPageID = wpInstalling) then begin
    pfunc := WrapTimerProc(@OnTimer, 4);
    TimerID := SetTimer(0, 0, 1000, pfunc);

    WizardForm.InnerNotebook.Hide;
    WizardForm.Bevel1.Hide;
    WizardForm.MainPanel.Hide;
    WizardForm.PageNameLabel.Hide;
    WizardForm.PageDescriptionLabel.Hide;

    WizardForm.ProgressGauge.Show;
    WizardForm.StatusLabel.Show;
    SplashImage.Show;
  end
  else begin
    WizardForm.ProgressGauge.Hide;
    WizardForm.StatusLabel.Hide;
    SplashImage.Hide;
  end;
   
  if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then begin
    with WizardForm do begin
      InnerNotebook.Show;
      Bevel1.Show;
      MainPanel.Show;
      PageNameLabel.Show;
      PageDescriptionLabel.Show;
    end;
  end;
end;

procedure InitializeWizard();
var
  i: Integer;
// Меняем размер окна установки
//begin
  //WizardForm.ClientHeight:= 800;
//  WizardForm.ClientWidth:= 750;
  //WizardForm.Height:= 500;
//  WizardForm.Width:= 700;
begin
  InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
                                          'Программа установки обнаружила следующие необходимые компоненты.')
  CreateCheckForm()  // Создание объектов TMemo, в которых будет выводится информация о системе
  UpdateInfo()  // Обновление информации о системе

  // ну не все же 26 штук перечислять
  for i:= 2 to 27 do ExtractTemporaryFile('Image_' + IntToStr(i) + '.bmp');

  currTime := 0;

  with WizardForm do begin
    WelcomeLabel1.Hide;
    WelcomeLabel2.Hide;
    PageNameLabel.Hide;
    PageDescriptionLabel.Hide;
    FinishedHeadingLabel.Hide;
    FinishedLabel.Hide;
    // незнаю почему, но Hide не действует. Поэтому просто уменьшил размер
    RunList.Height := 0;
    RunList.Width := 0;
    FilenameLabel.Hide;

    with StatusLabel do begin
      Parent := WizardForm;
      Top := ScaleY(315);
      Left := ScaleX(10);
      Width := ScaleX(200);
      Hide;
    end;
   
    with ProgressGauge do begin
      Parent := WizardForm;
      Top := ScaleY(330);
      // Сдвигаем прогресс бар вниз
      //WizardForm.ProgressGauge.Top := ScaleY(430);
      Left := ScaleX(10);
      Width := ScaleX(380);
      Height := ScaleX(18);
      Hide;
    end;
  end;

  SplashImage := TBitmapImage.Create(WizardForm);
  with SplashImage do begin
    Top := 0;
    Left := 0;
    Width := WizardForm.MainPanel.Width;
    Height := WizardForm.Bevel.Top;
    Parent := WizardForm.InnerPage;
    Stretch := True;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'));
    Hide;
  end;

  with WizardForm do begin
    WizardBitmapImage.Align:=true;
    WizardBitmapImage2.Align:=true;
    WizardSmallBitmapImage.Align:=true;
  end;
 
  WelcomeLabel1:= TLabel.Create(WizardForm);
  with WelcomeLabel1 do begin
    Left:=ScaleX(10);
    Top := ScaleY(10);
    Width := ScaleX(350);
    Height := ScaleY(75);
    AutoSize := False;
    WordWrap := True;
    Font.Color := clGreen;
  // здесь можно поиграть шрифтом
  //  WelcomeLabel1.Font.Style := [fsBold];
  //  WelcomeLabel1.Font.Name:='MS Sans Serif';
    Font.Size := 14;
    Transparent := True;
    Parent := WizardForm.WelcomePage;
  end;
 
  WelcomeLabel2:=TLabel.Create(WizardForm);
  with WelcomeLabel2 do begin
    Left := ScaleX(10);
    Top := ScaleY(70);
    Width := ScaleX(200);
    Height := ScaleY(300);
    AutoSize := False;
    WordWrap := True;
    Font.Color := clGreen;
    Font.Style := [fsBold];
    Font.Size := 10;
    Transparent := True;
    Parent := WizardForm.WelcomePage;
  end;
 
  PageNameLabel := TLabel.Create(WizardForm);
  with PageNameLabel do begin
    Left := ScaleX(25);
    Top := ScaleY(10);
    Width := ScaleX(300);
    Height := ScaleY(14);
    AutoSize := False;
    WordWrap := True;
    Font.Color := $339933;
    Font.Style := [fsBold];
    Font.Size := 11;
    Transparent := True;
    Parent := WizardForm.MainPanel;
  end;
 
  PageDescriptionLabel := TLabel.Create(WizardForm);
  with PageDescriptionLabel do begin
    Left := ScaleX(40);
    Top := ScaleY(25);
    Width := ScaleX(475);
    Height := ScaleY(30);
    AutoSize := False;
    WordWrap := True;
    Font.Color := $339933;
    Font.Style := [fsBold];
    Font.Size := 9;
    Transparent := True;
    Parent := WizardForm.MainPanel;
  end;
 
  FinishedHeadingLabel:= TLabel.Create(WizardForm);
  with FinishedHeadingLabel do begin
    Left := ScaleX(10);
    Top := ScaleY(10);
    Width := ScaleX(320);
    Height := ScaleY(75);
    AutoSize := False;
    WordWrap := True;
    Font.Color := clBlue;
// здесь тоже можно поиграть шрифтом
//  FinishedHeadingLabel.Font.Style := [fsBold];
//  FinishedHeadingLabel.Font.Name:='MS Sans Serif';
    Font.Size := 14;
    Transparent := True;
    Parent := WizardForm.FinishedPage;
  end;
 
  FinishedLabel:= TLabel.Create(WizardForm);
  with FinishedLabel do begin
    Left := ScaleX(10);
    Top := ScaleY(70);
    Width := ScaleX(220);
    Height := ScaleY(300);
    AutoSize := False;
    WordWrap := True;
    Font.Color := clRed;
    Font.Size := 10;
    Transparent := True;
    Parent := WizardForm.FinishedPage;
  end;
 
  RunMyProg := TCheckBox.Create(WizardForm);
  with RunMyProg do begin
    Parent := WizardForm.FinishedPage;
    Left := ScaleX(10);
    Top := ScaleY(270);
    Width := ScaleX(13);
    Height := ScaleX(13);
    Checked := True; // чтоб чебокс был отмечен, раскоментируй строку
  end;
 
  RunLabel:= TLabel.Create(WizardForm);
  with RunLabel do begin
    Left := ScaleX(30);
    Top := ScaleY(270);
    Width := ScaleX(200);
    Height := ScaleY(20);
    AutoSize := False;
    WordWrap := True;
    Font.Color := clGreen;
    Font.Style := [fsBold];
    Font.Size := 10;
    OnClick := @RLabelOnClick;
    Transparent := True;
    Parent := WizardForm.FinishedPage;
  end;
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;


Serega 29-07-2009 22:10 1181035

Цитата:

Цитата Drongo
С первым пунктом мне кажется можно так, но я не уверен: »

Я тоже не уверен на все сто, но помоему так.
Цитата:

Цитата Drongo
А вот со вторым пунктом, чтобы сделать активную кнопку при любом раскладе, не знаю где... »

Можно просто удалить WizardForm.NextButton.Enabled:= False и WizardForm.NextButton.Enabled:= True, т.е.:
читать дальше »
Код:

...
if ChangeText = True then
    begin
      TopText.Top := 0;
      TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям программы.' + #13 +
                        'Пожалуйста, проверьте позиции, выделенные красным цветом.';
      TopText.Font.Color := clRed;
    end
  else
    begin
      TopText.Caption := 'Все компоненты соответствуют минимальным требованиям программы.';
      TopText.Font.Color := clGreen;
      TopText.Top := 8;
    end;
end;
...



P.S.
Забываем про знаки ';' в конце строк... ;)

A1EXXX 29-07-2009 22:28 1181045

Ребята, у меня такой вопрос: я подставляю картинку в левый нижний угол, но можно ли как нибудь сделать, чтобы она отображалась на всех страницах, кроме страницы распаковки??? (использую слайд-шоу, и картинка выглядывает из-под прогресс-бара). И как вручную указать требуемое свободное место на диске здесь (своё число mb указать)

Drongo 30-07-2009 11:21 1181339

Спасибо Serega, уже потихоньку соображаю самостоятельно. :teeth:
Цитата:

Цитата Serega
Забываем про знаки ';' в конце строк... »

Так тож я ничего не правил, как было. :)

x-net 30-07-2009 16:32 1181614

Подскажите пожалуйста как такой инсталл сделать, чтоб было такое оформление, и были функции удалений сохраненй и игр?
Сделано классно, я вытаскивал код, скомпилировал, а картинка сужается.
Сделать отдельно такую тему отдельно.

user_123 30-07-2009 17:56 1181680

Подскажите пожалуйста, как в inno setup реализовать следующее:

1. В программе удаления сделать список дополнительных задач (как [tasks] в программе установки; нужно для удаления определённого каталога со все его содержимым) . Показ стандартного (системного) диалога с запросом меня не очень устраивает, т.к. я делаю многоязычный инсталлятор, а в секции [code] {cm:*} не работает...
2. На черточке внизу диалогового окна написать текст (копирайт).
3. Во всех диалоговых окнах инсталлятора и деинсталлятора (кроме заголовка окна) сделать отображаение AppVerName вместо AppName.


Прошу прощение, если это уже обсуждалось... у меня дорогой интернет-трафик и поэтому я не имею возможности просматривать всё подряд... Заранее благодарен.

Drongo 30-07-2009 20:36 1181820

Цитата:

Цитата Drongo
1. Добавить строку, чтобы инсталятор проверял систему Windows 7, тоесть работал »

На Windows 7 в ветке
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion] значение ProductName следующее
Код:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"ProductName"="Windows 7 Ultimate"

И я так понимаю, нужно так? :dont-know Или прокатит и предыдущая запись?

Код:

...
(Pos('Windows 7 Ultimate', SystemVersionPanel.Text) = 0) then  // Windows 7...


serg aka lain 30-07-2009 23:59 1182020

Цитата:

Цитата A1EXXX
чтобы она отображалась на всех страницах, кроме страницы распаковки??? »

конечно,

procedure CurPageChanged(CurPageID: Integer);
begin
показать картинку. (нужный код)
if CurPageID = wpInstalling then
begin
не показывать картинку. (нужный код)
end;
end;

Цитата:

Цитата A1EXXX
И как вручную указать требуемое свободное место на диске здесь (своё число mb указать) »

[Setup]
ExtraDiskSpaceRequired=45678901234
; (1048576 bytes = 1 megabyte)

A1EXXX 31-07-2009 01:40 1182063

Цитата:

Цитата serg aka lain
procedure CurPageChanged(CurPageID: Integer);
begin
показать картинку. (нужный код)
if CurPageID = wpInstalling then
begin
не показывать картинку. (нужный код)
end;
end; »

вот только я не знаю, что писать вместо того, что я выделил....

Rosich 31-07-2009 13:22 1182360

Подскажите, пожалуйста, как сделать так чтобы перед началом повторной установки программы сначала запускался деинсталлятор в тихом режиме, а затем уже шел сам процесс установки. Пробовал сделать все это через секцию [InstallDelete], но первое, что неудобно постоянно выскакивает предупреждение, что такие-то компоненты будут удалены, а их у меня – экрана не хватит. Пробовал и без секции [InstallDelete], эффект почти тот же самый, только с разницей, что компоненты не будут удалены.
И самое главное, мой инсталлятор делает бекап файлов и к моменту повторного запуска инсталлятора эти файлы должны быть на своих местах, такое через секцию [InstallDelete] никакими средствами не добиться. Голову сломал, а как сделать - не знаю!
Вот мой код.
P.S.
Хотел дать весь код в топике, но при отправке сообщения, ругается, что много символов, пришлось сократить до секции [Code], а затем и полностью на ифолдер перенести.

Serega 31-07-2009 20:17 1182672

Цитата:

Цитата Drongo
Так тож я ничего не правил, как было. »

бывает... ;)

Цитата:

Цитата x-net
Подскажите пожалуйста как такой инсталл сделать, чтоб было такое оформление »

Здесь использовано скинирование - ISSkin, плюс все компоненты переписаны заново.
Цитата:

Цитата x-net
и были функции удалений сохраненй и игр? »

не поленитесь, почитайте где-то страниц тридцать назад, я приводил пример скрипта с удалением сохранений.
Цитата:

Цитата x-net
я вытаскивал код, скомпилировал, а картинка сужается. »

Покажите скрипт, так тяжело сказать где поправить.
Цитата:

Цитата user_123
1. В программе удаления сделать список дополнительных задач (как [tasks] в программе установки; нужно для удаления определённого каталога со все его содержимым) . Показ стандартного (системного) диалога с запросом меня не очень устраивает, т.к. я делаю многоязычный инсталлятор, а в секции [code] {cm:*} не работает... »

Покажите пример, как делаете.
Цитата:

Цитата user_123
2. На черточке внизу диалогового окна написать текст (копирайт). »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Messages]
BeveledLabel=forum OSzone.net

[Code]
procedure InitializeWizard;
begin
  WizardForm.BeveledLabel.Left:= 20;
end;



Цитата:

Цитата user_123
3. Во всех диалоговых окнах инсталлятора и деинсталлятора (кроме заголовка окна) сделать отображаение AppVerName вместо AppName. »

Не совсем понятен вопрос, но насколько я понял напишите в скрипте соответственно AppName равным AppVerName и тогда обязательно используйте AppId.

Цитата:

Цитата Drongo
Или прокатит и предыдущая запись? »

Ну а куда она родимая денется, обязательно прокатит...
Цитата:

Цитата из Справки
Pos(subs,s) - возвращает позицию первой подстроки subs в строке s (или 0 если подстрока не найдена)

Цитата:

Цитата A1EXXX
вот только я не знаю, что писать вместо того, что я выделил.... »

Вы скрипт покажите, проще будет общаться, а то на пальцах тяжело объяснять.

A1EXXX 31-07-2009 20:35 1182679

вот мой скрипт...
читать дальше »

[code]
var
LogoImage:TBitmapImage;
LogoLabel: TLabel;
LogoPanel: TPanel;

procedure LogoOnClick(Sender: TObject);
var ReturnCode: Integer;
begin
ShellExec('open', 'http://......', '', '', SW_SHOWNORMAL, ewNoWait, ReturnCode)
end;

procedure InitializeWizard();
begin
ExtractTemporaryFile('logo.bmp');
LogoPanel := TPanel.Create(WizardForm);
with LogoPanel do
begin
Parent := WizardForm;
Left := ScaleX(5);
Top := ScaleY(320);
Width := ScaleX(165);
Height := ScaleY(35);
BevelOuter := bvNone;
end;

LogoImage := TBitmapImage.Create(WizardForm);
with LogoImage do
begin
Parent := LogoPanel;
Left := ScaleX(0);
Top := ScaleY(0);
AutoSize:=true;
ReplaceColor:=clFuchsia;
ReplaceWithColor:=clBtnFace;
Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp'));
end;

LogoLabel := TLabel.Create(WizardForm);
with LogoLabel do
begin
Parent := LogoPanel;
Width := LogoPanel.Width;
Height := LogoPanel.Height;
Transparent:=True;
Cursor := crHand;
OnClick:=@LogoOnClick;
end;
end;

[Files]
Source: C:\logo.bmp; DestDir: {tmp}; Flags: dontcopy

Drongo 31-07-2009 21:16 1182705

Цитата:

Цитата Serega
Pos(subs,s) - возвращает позицию первой подстроки subs в строке s (или 0 если подстрока не найдена) »

Ааа, понял, функция для работы со строками. Спасибо.

Serega 31-07-2009 22:36 1182741

Цитата:

Цитата Rosich
чтобы перед началом повторной установки программы сначала запускался деинсталлятор в тихом режиме, а затем уже шел сам процесс установки. »

Пример
Код:

[Setup]
AppID={{C05D8CDB-417D-4335-A38C-A0659EDFD6B8}
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Code]
//проверка устанавливалась ли программа ранее
var
  Error: Integer;
  ResultStr: String;

function InitializeSetup: Boolean;
begin
  Result := True;
    begin
      if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{C05D8CDB-417D-4335-A38C-A0659EDFD6B8}_is1', 'DisplayName', ResultStr) then
      if ResultStr = 'My Program v 1.5' then
        begin
          if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{C05D8CDB-417D-4335-A38C-A0659EDFD6B8}_is1', 'UninstallString', ResultStr) then
          ResultStr:= RemoveQuotes(ResultStr);
          if not Exec(ResultStr, '/silent', '', SW_SHOWNORMAL, ewWaitUntilTerminated, Error) then
          MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(Error) + '.' #13#13 'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK);
        end;
    end;
end;



Цитата:

Цитата A1EXXX
вот мой скрипт... »

Пример
Код:

[Code]
var
  LogoImage: TBitmapImage;
  LogoLabel: TLabel;
  LogoPanel: TPanel;

procedure LogoOnClick(Sender: TObject);
var
  ReturnCode: Integer;
begin
  ShellExec('open', 'http://......', '', '', SW_SHOWNORMAL, ewNoWait, ReturnCode)
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('logo.bmp');
  LogoPanel := TPanel.Create(WizardForm);
  with LogoPanel do
    begin
      Parent := WizardForm;
      Left := ScaleX(5);
      Top := ScaleY(320);
      Width := ScaleX(165);
      Height := ScaleY(35);
      BevelOuter := bvNone;
    end;

  LogoImage := TBitmapImage.Create(WizardForm);
  with LogoImage do
    begin
      Parent := LogoPanel;
      Left := ScaleX(0);
      Top := ScaleY(0);
      AutoSize:=true;
      ReplaceColor:=clFuchsia;
      ReplaceWithColor:=clBtnFace;
      Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp'));
    end;

  LogoLabel := TLabel.Create(WizardForm);
  with LogoLabel do
    begin
      Parent := LogoPanel;
      Width := LogoPanel.Width;
      Height := LogoPanel.Height;
      Transparent:=True;
      Cursor := crHand;
      OnClick:=@LogoOnClick;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  LogoPanel.Visible:= True;
  LogoImage.Visible:= True;
  LogoLabel.Visible:= True;
  if CurPageID = wpInstalling then
    begin
      LogoPanel.Visible:= False;
      LogoImage.Visible:= False;
      LogoLabel.Visible:= False;
    end;
end;

[Files]
Source: C:\logo.bmp; DestDir: {tmp}; Flags: dontcopy


Rosich 31-07-2009 23:23 1182762

Serega, ВЫ как всегда на высоте, то, что доктор прописал, лучше и не придумаешь, спасибо большое!!!

user_123 01-08-2009 23:04 1183309

Цитата:

Цитата user_123
Во всех диалоговых окнах инсталлятора и деинсталлятора (кроме заголовка окна) сделать отображаение AppVerName вместо AppName

Проблема заключается в том, что у программы достаточно длинное название и внутри диалоговых окон оно смотрится не очень красиво, а если написать сокращённо, то - в заголоке. Данную проблему я решил так: в секции [Messages] написал полное название для заголока, без "%1", а в appname - сокращённое.
Цитата:

Цитата Serega
[Messages]
BeveledLabel=forum OSzone.net
[code]
procedure InitializeWizard;
begin
WizardForm.BeveledLabel.Left:= 20;
end; »

Спасибо.
Цитата:

Цитата Serega
В программе удаления сделать список дополнительных задач (как [tasks] в программе установки; нужно для удаления определённого каталога со все его содержимым) »

В программе установки можно сделать доп. задачи, например, создание ярлыка на рабочем столе / в меню быстрого запуска, добавление доп. ключей в реестр и др... А в программе удаление так сделать (чтобы врезультате уставки флага (галочки) удалился определённый каталог), если я не ошибаюсь, нельзя... Конечно, можно что-то в сецию [code] написать, но... я не знаю высокоуровневых языков программирования... если вижу готовый код, то примерно понимаю, о чём речь идёт, а сам написать не могу...

Rosich 02-08-2009 11:34 1183480

Мне на ру-боарде подкинули скрипт
читать дальше »
Код:

var
  UnInstallPath: String;

function GetUnInstallPath( AppID: String ): String;
begin
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{C05D8CDB-417D-4335-A38C-A0659EDFD6B8}_is1','UninstallString', UnInstallPath);
  Result := UnInstallPath;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
ResultCode:integer;
begin
 Result:=true;
 if CurPageID = wpSelectComponents
  then
  Exec(UnInstallPath, '/VERYSILENT','', sw_Hide, ewWaitUntilTerminated, ResultCode);
end;


Но он, почему то не работает, как должен работать, может, кто посмотрит. Этот скрипт в идеале должен запускать "тихий деинсталлятор", но не сразу при запуске инсталлятора, а после странице выбора компонентов. У меня вопрос к Serega – можно ли сделать такое в твоем скрипте? И еще очень актуальный вопрос, а точнее три вопроса:
1.). Как убрать вот это табличку: , а то у меня компонентов туча, экрана не хватает.
2.). Как правильно срастить вот этот скрипт
читать дальше »
Код:

procedure ComponentOnClick(Sender: TObject);
begin
if WizardSelectedComponents(False) = '' then
WizardForm.NextButton.Enabled:= False
else WizardForm.NextButton.Enabled:= True;
end;
procedure InitializeWizard();
begin
WizardForm.ComponentsList.OnClick := @ComponentOnClick;
end;


с моим скриптом.
3.). Мне на том же форуме, в моем скрипте, изменили процедуру CurPageChanged
читать дальше »
Код:

procedure CurPageChanged(CurPageID: Integer); 
begin 
  PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption; 
  PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption; 
  PageNameLabel1.Caption:= 'Апаратное Обеспечение'; 
  PageDescriptionLabel1.Caption:= 'Программа установки обнаружила следуюшие необходимые компоненты'; 
  PageNameLabel2.Caption:= WizardForm.PageNameLabel.Caption; 
  PageDescriptionLabel2.Caption:= WizardForm.PageDescriptionLabel.Caption; 
  PageNameLabel3.Caption:= WizardForm.PageNameLabel.Caption; 
  PageDescriptionLabel3.Caption:= WizardForm.PageDescriptionLabel.Caption; 
  PageNameLabel4.Caption:= WizardForm.PageNameLabel.Caption; 
  PageDescriptionLabel4.Caption:= WizardForm.PageDescriptionLabel.Caption; 
  PageNameLabel5.Caption:= WizardForm.PageNameLabel.Caption; 
  PageDescriptionLabel5.Caption:= WizardForm.PageDescriptionLabel.Caption; 
  PageNameLabel6.Caption:= WizardForm.PageNameLabel.Caption; 
  PageDescriptionLabel6.Caption:= WizardForm.PageDescriptionLabel.Caption; 
  PageNameLabel7.Caption:= WizardForm.PageNameLabel.Caption; 
  PageDescriptionLabel7.Caption:= WizardForm.PageDescriptionLabel.Caption; 
  PageNameLabel8.Caption:= WizardForm.PageNameLabel.Caption; 
  PageDescriptionLabel8.Caption:= WizardForm.PageDescriptionLabel.Caption; 
  PageID:=CurPageID; 
  if CurPageID = wpSelectComponents then 
  begin 
  WizardForm.BackButton.Enabled:= false; 
  if CurPageID = wpSelectDir then 
  begin 
    GetNeedSpaceCaption; 
    if FreeMB < NeedSize then 
    WizardForm.NextButton.Enabled:=False; 
      begin 
if CurPageID=wpInstalling 
then 
if CurPageID=wpFinished 
then 
begin 
WizardForm.Width:=497; 
WizardForm.Height:=358; 
WizardForm.Position:=poScreenCenter; 
end 
end; 
end; 
end;
end;


И теперь кнопка "назад" становиться неактивной на странице выбора компонентов. Вопрос - как мне сделать чтобы кнопка "назад" была неактивна именно вот на этой странице: , то есть на следующей после выбора компонентов?!

P.S.
Забыл сразу написать: у меня для этой игры есть два официальных патча, но установить их можно, только если в игре стоят оригинальные файлы, с которых я делаю бекап. То есть реально установка этих патчей должна начаться сразу после "тихой деинсталляции" до установки основных файлов и только по одному - сначала файл myprogram v. 1.1, после завершения установки этого файла, идет установка файла myprogram v. 1.2 и только после того как установится второй файл должна начаться установка основных файлов.
КАК это сделать?!

Заранее СПАСИБО!!!

Serega 02-08-2009 14:05 1183579

Цитата:

Цитата Rosich
Но он, почему то не работает, как должен работать, может, кто посмотрит. Этот скрипт в идеале должен запускать "тихий деинсталлятор", но не сразу при запуске инсталлятора, а после странице выбора компонентов. »

Записал в процедуре CurPageChanged, которую привёл ниже...
Цитата:

Цитата Rosich
Как убрать вот это табличку: »

Добавьте в секции [Components] ко всем компонентам флаг disablenouninstallwarning
Цитата:

Цитата Rosich
Как правильно срастить вот этот скрипт »

1. Берете вашу процедуру:
Код:

procedure ComponentOnClick(Sender: TObject);
begin
  if WizardSelectedComponents(False) = '' then
    WizardForm.NextButton.Enabled:= False
  else WizardForm.NextButton.Enabled:= True;
end;

и добавляете её в свой скрипт, в любое место, главное перед процедурой InitializeWizard.
2. Добавляете эту строку:
Код:

  WizardForm.ComponentsList.OnClick := @ComponentOnClick;
в самое начало процедуры InitializeWizard, после begin.
Цитата:

Цитата Rosich
Мне на том же форуме, в моем скрипте, изменили процедуру CurPageChanged »

исправил
Код:

procedure CurPageChanged(CurPageID: Integer);
var
  ResultCode: Integer;
  UnInstallPath: string;
begin
  PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel1.Caption:= 'Апаратное Обеспечение';
  PageDescriptionLabel1.Caption:= 'Программа установки обнаружила следуюшие необходимые компоненты';
  PageNameLabel2.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel2.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel3.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel3.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel4.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel4.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel5.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel5.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel6.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel6.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel7.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel7.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel8.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel8.Caption:= WizardForm.PageDescriptionLabel.Caption;
  if CurPageID = wpSelectComponents then
    begin
      RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{C05D8CDB-417D-4335-A38C-A0659EDFD6B8}_is1','UninstallString', UnInstallPath);
      UnInstallPath:= RemoveQuotes(UnInstallPath);
      Exec(UnInstallPath, '/verysilent','', SW_HIDE, ewWaitUntilTerminated, ResultCode);
    end;
  if CurPageID = wpSelectDir then
    begin
      GetNeedSpaceCaption;
      if FreeMB < NeedSize then
      WizardForm.NextButton.Enabled:= False;
    end;
  if CurPageID = wpReady then
    WizardForm.BackButton.Enabled:= False;
  if CurPageID = wpFinished then
    begin
      WizardForm.Width:= 497;
      WizardForm.Height:= 358;
      WizardForm.Position:= poScreenCenter;
    end
end;


VitHAK 02-08-2009 19:06 1183730

Привет! У меня есть скрипт авторана на Inno Setup Script.
В нём есть кнопка:
Код:

  btn2:= TButton.Create(AutoRun);
  with btn2 do begin
    Parent:= AutoRun;
    Left := 280;
    Top := 185;
    Width := 270;
    Height := 22;
    Caption:= 'Начать игру';
    Cursor:= crHand;
    OnClick := @btn2Click;
  end;

Эта кнопка запускает процедуру:
Код:

procedure btn2Click(Sender: TObject);
var
  CurPageID: Integer;
begin
  Exec(ExpandConstant('{src}\Setup.exe'),'','',SW_SHOW,ewNoWait,ResultCode)
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
end;

Как сделать чтоб эта кнопка была неактивная при отсутствии {src}\Setup.exe ?

P.S. Я знаю что это делается процедурой:
Код:

begin
btn2.Enabled := False;
end

Но как сделать проверку наличия файла {src}\Setup.exe ?

Rosich 02-08-2009 19:47 1183759

Serega
Спасибо, конечно, но сделал все по вашим подсказкам и вставил процедуру CurPageChanged. В итоге скрипт компилируется и работает, но последняя страница, получается урезанная: .
Проверил все что мог, по размерам нигде отклонений нет, но все-таки страница завершения получается урезанная, а так все работает идеально.

Прошу помощи еще на один мой вопрос:
У меня для этой игры есть два официальных патча, но установить их можно, только если в игре стоят оригинальные файлы, с которых я делаю бекап. То есть реально установка этих патчей должна начаться сразу после "тихой деинсталляции" до установки основных файлов и только по одному - сначала файл myprogram v. 1.1, после завершения установки этого файла, идет установка файла myprogram v. 1.2 и только после того как установится второй файл должна начаться установка основных файлов.
КАК это сделать?!

Serega 02-08-2009 20:18 1183786

Цитата:

Цитата VitHAK
Но как сделать проверку наличия файла {src}\Setup.exe ? »

сразу за кодом создания кнопки, добавьте:
Код:

  if not FileExists(ExpandConstant('{src}\Setup.exe')) then
  btn2.Enabled:= False;

Цитата:

Цитата Rosich
страница, получается урезанная: »

так я сам удивился, когда увидел в вашей процедуре изменение страницы, но вы же писали скрипт и для чего это вам надо я не знаю, поэтому я это оставил без изменений, просто сделал, чтоб всё работало.
Исправил
Код:

procedure CurPageChanged(CurPageID: Integer);
var
  ResultCode: Integer;
  UnInstallPath: string;
begin
  PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel1.Caption:= 'Апаратное Обеспечение';
  PageDescriptionLabel1.Caption:= 'Программа установки обнаружила следуюшие необходимые компоненты';
  PageNameLabel2.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel2.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel3.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel3.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel4.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel4.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel5.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel5.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel6.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel6.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel7.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel7.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel8.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel8.Caption:= WizardForm.PageDescriptionLabel.Caption;
  if CurPageID = wpSelectComponents then
    begin
      RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{C05D8CDB-417D-4335-A38C-A0659EDFD6B8}_is1','UninstallString', UnInstallPath);
      UnInstallPath:= RemoveQuotes(UnInstallPath);
      Exec(UnInstallPath, '/verysilent','', SW_HIDE, ewWaitUntilTerminated, ResultCode);
    end;
  if CurPageID = wpSelectDir then
    begin
      GetNeedSpaceCaption;
      if FreeMB < NeedSize then
      WizardForm.NextButton.Enabled:= False;
    end;
  if CurPageID = wpReady then
    WizardForm.BackButton.Enabled:= False;
  if CurPageID = wpFinished then
      WizardForm.Position:= poScreenCenter;
end;


Serega 02-08-2009 20:33 1183793

Извиняюсь сразу чего-то проглядел...
Цитата:

Цитата Rosich
КАК это сделать?! »

1. Бекап файлов;
2. Происходит деинсталляция... чего? Программы?
3. Я так понимаю - востановление оригинальных файлов?
4. Установка двух патчей;
5. Ваша установка программы.
Я правильно понял?

Rosich 02-08-2009 20:35 1183794

На соседнем форуме есть интересная программка, называется она InnoSetup Script Joiner, сделана он одним из постояльцев того форума. Смысл ее работы в том, что она сшивает скрипты, объединяя несколько в один. Работать с ней просто: скрипты, которые хотите объединить делите по файлам с расширением *.iss (только секцию [code]) клик правой кнопкой мыши и скрипт – готов. Не так красиво, как это сделает человек, но работает.

Rosich 02-08-2009 20:51 1183805

Цитата:

Цитата Serega
1. Бекап файлов;
2. Происходит деинсталляция... чего? Программы?
3. Я так понимаю - востановление оригинальных файлов?
4. Установка двух патчей;
5. Ваша установка программы.
Я правильно понял? »

Немного не так.
При первой установки инсталлятора после выбора компонентов, если пользователь выбрал установку патчей:
1. Запуск программы установки.
2. После страницы выбора компонентов, устанавливаются патчи, по одному:
2.1 Первый патчь, от начала установки до полного ее завершения.
2.2 Второй патчь, от начала установки до полного ее завершения.
3. Бекап файлов.
4. Установка остальных компонентов программы.

При повторном запуске инсталлятора, если пользователь сразу не выбрал установку патчей:
1. Запуск программы установки.
2. После страницы выбора компонентов, идет "тихая деинсталляция".
3. Устанавливаются патчи, по одному:
3.1 Первый патчь, от начала установки до полного ее завершения.
3.3 Второй патчь, от начала установки до полного ее завершения.
4. Бекап файлов.
5. Установка остальных компонентов программы.

VitHAK 02-08-2009 21:13 1183819

Serega, Спасибо!
Я уже написал процедуру:
Код:

If (FileSearch('setup.exe', ExpandConstant('{src}'))='')
    then
    begin
        btn2.Enabled := False;
    end

Но Вы предложили лутшее решение.

Я сегодня только первий день знакомлюсь с Inno Setup Script

Rosich 02-08-2009 22:31 1183858

Цитата:

Цитата Serega
так я сам удивился, когда увидел в вашей процедуре изменение страницы, но вы же писали скрипт и для чего это вам надо я не знаю, поэтому я это оставил без изменений, просто сделал, чтоб всё работало. »

Спасибо все прекрасно работает!!!

P.S.
Сейчас проверил на запуск программы, до этого программу не запускал – тестировал на бекап файлов, запуск программы – пропал, программа не запускается со страницы завершения. Подозреваю, запуск DirectX тоже пропал, проверить не могу, он у меня уже установлен, только если попробовать подсунуть старую версию?!
SOS
Попробуйте, посмотрите, пожалуйста, весь скрипт, и еще прикладываю второй вариант – в нем все работает, но есть абсолютный путь, а это не есть "ХУ". Посмотрите, пожалуйста, может, что и получится.

Serega 03-08-2009 22:09 1184718

Цитата:

Цитата Rosich
Сейчас проверил на запуск программы »

Извиняюсь, удалил лишнее... Добавьте в procedure CurPageChanged сразу после begin:
Код:

  PageID:= CurPageID;

Rosich 03-08-2009 23:02 1184764

Цитата:

Цитата Serega
Добавьте в procedure CurPageChanged сразу после begin: »

Спасибо!!! Теперь все работает.

Serega 04-08-2009 00:35 1184835

Вложений: 1
Rosich, немного подредактировал ваш скрипт, он стал на 250 строк меньше...
Проверьте на работоспособность.

Rosich 04-08-2009 10:56 1185040

Цитата:

Цитата Serega
Rosich, немного подредактировал ваш скрипт, он стал на 250 строк меньше...
Проверьте на работоспособность. »

СПАСИБО БОЛЬШОЕ!!! Но ругается, однако!

A1EXXX 04-08-2009 12:06 1185111

Цитата:

Цитата Rosich
Цитата Serega:
Rosich, немного подредактировал ваш скрипт, он стал на 250 строк меньше...
Проверьте на работоспособность. »
СПАСИБО БОЛЬШОЕ!!! Но ругается, однако! »

попробуй первые два значения изменить на 0... типо так (0, 0, 121, 25)

Rosich 04-08-2009 12:12 1185120

Цитата:

Цитата A1EXXX
попробуй первые два значения изменить на 0... типо так (0, 0, 121, 25) »

Результат - тот же!

BlackSelf 04-08-2009 13:41 1185223

Rosich, запишите так: SetBounds (40, 102, 121, 25);
И так со всеми командами SetBounds.

Drongo 04-08-2009 15:04 1185306

Лучше подождите спеца - Serega - пропишет что нужно, в прямом смысле этого слова. ;)

Rosich 04-08-2009 15:14 1185314

Цитата:

Цитата BlackSelf
запишите так: SetBounds (40, 102, 121, 25);
И так со всеми командами SetBounds. »

Спасибо, конечно, но: все великолепно скомпилировалось, зато при запуске получается так:


У меня еще одна проблема наклюнулась: сегодня я экстренно прервал установку программы и она вылетела. Получается так, что во время бекапа файлы перемещаются в папку "Backup", а если прервать установку – то файлы-клоны, если и успели скопироваться, просто удаляются и все!!! Папка "Backup", вместе с файлами, осталась на месте, а файлы-дубли удалились. Подскажите, пожалуйста, как этого избежать или хотя бы на время установки файлов кнопку "отмена" сделать неактивной. Идеальный вариант: нажимаешь кнопку "отмена" файлы из папки "Backup" восстанавливаются на свои места.

Цитата:

Цитата Drongo
Лучше подождите спеца - Serega - пропишет что нужно, в прямом смысле этого слова. »

Поддерживаю, без Serega жизнь была бы скушна! У него есть решения на все случаи жизни.

Serega 04-08-2009 15:28 1185340

Цитата:

Цитата Rosich
Но ругается, однако! »

Извините Rosich, недаром говорят - ночью спать надо :)
BlackSelf всё правильно сказал:
Цитата:

Цитата BlackSelf
запишите так: SetBounds (40, 102, 121, 25); »

Спасибо, за корректировку...
Цитата:

Цитата Rosich
все великолепно скомпилировалось, зато при запуске получается так: »

Сейчас гляну, что не так...
Цитата:

Цитата Rosich
У меня еще одна проблема наклюнулась: »

т.е. она появилась с этим скриптом или вы просто её раньше не замечали?

Serega 04-08-2009 15:51 1185359

Вложений: 1
Rosich, попробуйте:

Rosich 04-08-2009 16:03 1185370

Цитата:

Цитата Serega
т.е. она появилась с этим скриптом или вы просто её раньше не замечали? »

Скорее всего - второе. Я это примерно знал и раньше, просто закрывал глаза, а сейчас лбом ударился - глупо теперь прятать голову в песок.
Суть проблемы такова: скрипт, который брался изначально, не предусматривал "обратный бекап", то есть он копирует определенные файлы в указанную папку и при деинсталляции из этой папки возвращает файлы назад. Отката как такового в этом скрипте не предусмотрено. Если во время копирования нажать кнопку "отмена", примерно как это сделал я, то оригиналы файлов остаются в папке бекапа, а файлы-клоны просто удаляются и так как процесс установки незавершен - деинсталлятора нет, соответственно: файлы-оригиналы назад не возвращаются! Как этого избежать я не знаю, самый легкий путь - запретить пользователю отменять установку программы, или просто кнопку "отмена" сделать неактивной. Но хотелось бы не так топорно, а поизящней.

Serega 04-08-2009 16:10 1185380

Цитата:

Цитата Rosich
на время установки файлов кнопку "отмена" сделать неактивной »

Замените в скрипте procedure CurPageChanged, на эту:
читать дальше »
Код:

procedure CurPageChanged(CurPageID: Integer);
var
  ResultCode: Integer;
  UnInstallPath: string;
begin
  PageID:= CurPageID;
  PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel1.Caption:= 'Апаратное Обеспечение';
  PageDescriptionLabel1.Caption:= 'Программа установки обнаружила следуюшие необходимые компоненты';
  PageNameLabel2.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel2.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel3.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel3.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel4.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel4.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel5.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel5.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel6.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel6.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel7.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel7.Caption:= WizardForm.PageDescriptionLabel.Caption;
  PageNameLabel8.Caption:= WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel8.Caption:= WizardForm.PageDescriptionLabel.Caption;
  if CurPageID = wpSelectDir then
    begin
      GetNeedSpaceCaption;
      if FreeMB < NeedSize then
      WizardForm.NextButton.Enabled:= False;
    end;
  if CurPageID = wpReady then
    begin
      WizardForm.BackButton.Enabled:= False;
      RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{C05D8CDB-417D-4335-A38C-A0659EDFD6B8}_is1','UninstallString', UnInstallPath);
      UnInstallPath:= RemoveQuotes(UnInstallPath);
      Exec(UnInstallPath, '/VERYSILENT','', SW_HIDE, ewWaitUntilTerminated, ResultCode);
    end;
  if CurPageID = wpInstalling then
      WizardForm.CancelButton.Enabled:= False;
  if CurPageID = wpFinished then
    WizardForm.Position:= poScreenCenter;
end;


Rosich 04-08-2009 16:17 1185388

Serega
Спасибо за процедуру CurPageChanged.
А можно сделать откат файлов, чтобы при нажатии на кнопку "отмена" файлы-оригиналы возвращались на свои места?

P.S.
Проверил скрипт без процедуры и с процедурой, есть такая вот ошибка нет фонового изображения, и только на одной странице, сама процедура работает идеально. Но в коде, который я брал за основу своего скрипта, есть скрытая ошибка: при проверке аппаратных средств, если параметры компьютера не соответствуют выставленным параметрам в скрипте, то инсталлятор не запускается и выдает ошибку. Об этом я узнал совсем недавно, но может эта ошибка кода не перешла в Ваш скрипт, надо проверить!

Проверил, к сожалению, эта ошибка перекочевала и в Ваш код:

Serega 04-08-2009 17:06 1185448

Цитата:

Цитата Rosich
Проверил скрипт без процедуры и с процедурой, есть такая вот ошибка »

Замените одноименную процедуру в скрипте на эту:
Код:

function DelSp(s: string): string;
begin
  StringChange(s, '  ', '');
  Result:= Trim(s);
end;


Serega 04-08-2009 17:41 1185479

Цитата:

Цитата Rosich
Проверил, к сожалению, эта ошибка перекочевала и в Ваш код: »

Ошибка возникает из-за того, что контрол ещё не создан, а вы пытаетесь присвоить значение Caption:=..., т.е. Caption ещё не создан.
Хотя я и сам не обратил на это внимание... пишу так сказать на память, без проверки...
В procedure InitializeWizard переместите строку CheckSystemPage(wpLicense); в самый конец procedure InitializeWizard прямо перед end;

Rosich 04-08-2009 17:44 1185482

Цитата:

Цитата Serega
Замените одноименную процедуру в скрипте на эту: »

Спасибо конечно, но: пробелы исправились, фоновой картинки - нет. Получилось:

Serega 04-08-2009 17:46 1185483

Цитата:

Цитата Rosich
фоновой картинки - нет. »

а насколько я понимаю, её нет только на этой странице?

Rosich 04-08-2009 17:53 1185488

Цитата:

Цитата Serega
а насколько я понимаю, её нет только на этой странице? »

Да.

Serega 04-08-2009 18:11 1185505

Вложений: 1
Rosich, прикрепил к сообщению исправленный скрипт.

Rosich 04-08-2009 18:28 1185519

Цитата:

Цитата Serega
пока ничего умней в голову не приходит, добавьте в procedure InitializeWizard: »

При запуске выскакивает такая вот ошибка:

Serega 04-08-2009 19:45 1185570

Rosich, вроде всё исправил, сам скрипт прикрепил к предыдущему сообщению.

Rosich 04-08-2009 20:38 1185601

Цитата:

Цитата Serega
вроде всё исправил, сам скрипт прикрепил к предыдущему сообщению. »

Спасибо!!! Вроде работает все, кроме восстановления файлов при нажатии кнопки "Отмена". Посмотрите пожалуйсто еще раз, если ничего не выйдет, придется отключить кнопку.

Serega 05-08-2009 19:34 1186456

Цитата:

Цитата Rosich
кроме восстановления файлов при нажатии кнопки "Отмена" »

Проверил, у меня востановление файлов работает.

Rosich 05-08-2009 20:08 1186479

Цитата:

Цитата Serega
Проверил, у меня востановление файлов работает. »

Поначалу я использовал скрипт, до секции [code] из своего скрипта, он постепенно развивается, а затем взял полностью весь скрипт, который Вы переделали и скомпилировал файл-инсталлятор и с этого файла запускал, результат виден: . На картинке видно, что папка Backup присутствует и не удалена, а файлов-оригиналов нет. Повторно инсталлятор не запустился, подтверждая, что файла TS3.exe - нет!

P.S.
Serega, а у Вас какой Inno Setup стоит, случаем не юникодовская бетка, у меня: ISPack 5.3.2 beta с катайскима дополнениями (Inno Setup ISCmplr 5.2.3 build 090424 и Inno Setup Compiler 5.2.3 build 090506 English). Может быть из-за этого у меня не идет скрипт?

Serega 06-08-2009 00:18 1186676

Вложений: 1
Цитата:

Цитата Rosich
у Вас какой Inno Setup стоит »

Расширенная версия от Restools.
Цитата:

Цитата Rosich
Может быть из-за этого у меня не идет скрипт? »

Нет, просто когда я проверял, менял пути на свои, а функция MoveDir перемещает папку целиком. Получается, что перемещение папки Backup происходило из ExpandConstant('{app}\Game\Bin\Backup\') в ExpandConstant('{app}\Game\Bin'), т.е. простыми словами зрительно ничего не менялось, т.к. она копировалась сама в себя...
Попробуйте этот скрипт.

Rosich 06-08-2009 09:40 1186872

Цитата:

Цитата Serega
Расширенная версия от Restools. »

У меня примерно такая же.
Цитата:

Цитата Serega
Попробуйте этот скрипт. »

Попробовал, ругается:
P.S.
Спасибо, что не бросаете в трудную минуту! Что бы я без Вашей помощи делал!

Serega 06-08-2009 17:31 1187329

Rosich, забыл удалить лишние begin и end, т.е. должно быть так:
читать дальше »
Код:

procedure RecoveryBackup;
var
  FindFiles: TFindRec;
  MyDir, BackupDir: string;
begin
  MyDir:= ExpandConstant('{app}\Game\Bin\');
  BackupDir:= ExpandConstant('{app}\Game\Bin\Backup\');
  if DirExists(BackupDir) then
  if FindFirst(BackupDir + '*.*', FindFiles) then
    begin
      repeat
        MoveFile(BackupDir + FindFiles.Name, MyDir + FindFiles.Name);
      until not FindNext(FindFiles);
      FindClose(FindFiles);
      RemoveDir(BackupDir)
    end;
end;



Цитата:

Цитата Rosich
Попробовал, ругается: »

ошибка, говорит о том, что переменная BackupDir объявлена второй раз, хотя в скрипте который я давал, эта переменная объявлена один раз. Как исправить:
- Переименуйте BackupDir, допустим на BackDir или как вам больше нравится, только не забудьте изменить все BackupDir на новое имя в procedure RecoveryBackup;
Пример
Код:

procedure RecoveryBackup;
var
  FindFiles: TFindRec;
  MyDir, BackDir: string;
begin
  MyDir:= ExpandConstant('{app}\Game\Bin\');
  BackDir:= ExpandConstant('{app}\Game\Bin\Backup\');
  if DirExists(BackDir) then
  if FindFirst(BackDir + '*.*', FindFiles) then
    begin
      repeat
        MoveFile(BackDir + FindFiles.Name, MyDir + FindFiles.Name);
      until not FindNext(FindFiles);
      FindClose(FindFiles);
      RemoveDir(BackDir)
    end;
end;


Rosich 06-08-2009 18:41 1187406

Serega, Вы кудесник, все заработало!
Еще раз - СПАСИБО!!!

Mihail88 08-08-2009 16:30 1188809

Вложений: 1
Всем привет.
Такое дело... хотел сделать "инсталлер" с музыкой (mp3) и галочку отключения.
нашел пример с трекерной музыкой, попытался переделать скрипт, вылетает ошибка "Type mismatch."

в архиве этот скрипт и оригинал

BlackSelf 08-08-2009 16:34 1188815

Вложений: 1
Mihail88, вот скрипт для проигрывания mp3-музыки.

Mihail88 08-08-2009 16:58 1188830

BlackSelf, спасибо, попробую переделать с TCheckBox'ом

все вроде сдела но не работает, тажа ошибка

STR1KEE 08-08-2009 18:55 1188894

Привет всем. Я новенький в этом деле и подскажите пожалуйста:

1. Как сделать во время установки, чтобы во весь экран было слайд шоу и как изменить время пролистывания картинок
2. Читал, читал так и не понял как можно изменить скин установки
3. Как прикрепить проверку информации о системе и сравнивить её с сист. требованиями игры и чтобы потом пользователь хоть и не подходит система смог продолжить установку

И для каждого лучше код именно этой функции, а не всего листа
А еще если можно и не составить труда вставте в этот скрипт с пояснениями, а то до меня долго доходит)))
читать дальше »

; Script created by STR1KE.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{1E70AEDE-704B-41A4-8937-42C91DAAEA25}
AppName=Crysis Warhead
AppVerName=Crysis Warhead v1.1.1.690
AppPublisher=A.G.Shamans
AppPublisherURL=http://torrents.across.su/
AppSupportURL=http://torrents.across.su/
AppUpdatesURL=http://torrents.across.su/
DefaultDirName={pf}\Crysis Warhed
DefaultGroupName=Crysis Warhead
AllowNoIcons=yes
LicenseFile=C:\Users\STR1KE\Documents\RePack\Crysis Warhead\1.txt
OutputDir=C:\RePack\Crysis Warhead
OutputBaseFilename=Setup
SetupIconFile=C:\Users\STR1KE\Documents\RePack\Crysis Warhead\Warhead.ico
Compression=lzma/ultra64
SolidCompression=yes
DiskSpanning=yes
DiskSliceSize=734003200
AppCopyright=Copyright (C) 2009 A.G. Shamans.
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files (x86)\Electronic Arts\Crytek\Crysis WARHEAD\Bin32\Crysis.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\Electronic Arts\Crytek\Crysis WARHEAD\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\Crysis Warhead"; Filename: "{app}\Crysis.exe"
Name: "{group}\{cm:ProgramOnTheWeb,Crysis Warhead}"; Filename: "http://torrents.across.su/"
Name: "{group}\{cm:UninstallProgram,Crysis Warhead}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Crysis Warhead"; Filename: "{app}\Crysis.exe"; Tasks: desktopicon

[Run]
Filename: "{tmp}\Redist\directx.exe"; Description: "Óñòàíîâèòü DirectX?"; Flags: nowait postinstall skipifsilent
Filename: "{app}\Crysis.exe"; Description: "{cm:LaunchProgram,Crysis Warhead}"; Flags: nowait postinstall skipifsilent

Mihail88 08-08-2009 19:30 1188918

Вложений: 1
STR1KEE, насчет скинов, может эти...

mitek_gsm 08-08-2009 23:07 1189081

Добрый вечер всем.
Есть папка A и папка Б, в папке А лежит файл 1.txt, его нужно перенести в папку Б c именем 2.txt (после копирования файлов)
Как это реализовать в Inno Setup ?

Rosich 08-08-2009 23:20 1189091

Цитата:

Цитата mitek_gsm
Добрый вечер всем.
Есть папка A и папка Б, в папке А лежит файл 1.txt, его нужно перенести в папку Б c именем 2.txt (после копирования файлов)
Как это реализовать в Inno Setup ? »

Легко:
[Files]
Source: папка а\1.txt; DestDir: {app}\папка б; DestName: 2.txt; Flags: ignoreversion
Поясняю: в DestName: – задается новое название файла, в нашем случае - 2.txt.

Serega 08-08-2009 23:29 1189095

Цитата:

Цитата Rosich
Легко: »

Если я правильно понял, то нужно после копирования, т.е. после установки...
Цитата:

Цитата mitek_gsm
Как это реализовать в Inno Setup ? »

В секции кода, запишите:
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpFinished then // выполнится на финальной странице
  if FileExists(ExpandConstant('{app}\A\1.txt')) then // проверка на присутствие файла
    begin
      // создаём папку, если её нет
      if not DirExists(ExpandConstant('{app}\B')) then CreateDir(ExpandConstant('{app}\B'));
      // копируем файл
      FileCopy(ExpandConstant('{app}\A\1.txt'), ExpandConstant('{app}\B\2.txt'), False);
      // удаляем файл
      DeleteFile(ExpandConstant('{app}\A\1.txt'));
    end;
end;


mitek_gsm 09-08-2009 00:22 1189140

Rosich, В вашем примере файл копируется в папку еще на этапе компиляции, а мне нужно было после установки. В этом случае код Serega, более правильный.

P.S. и новая задачка )) Есть {app}, в ней есть папка A, нужно после установки скопировать содержимое в папку B (должно получится {app}В)

Serega 09-08-2009 01:56 1189171

Цитата:

Цитата mitek_gsm
новая задачка »

Приблизительно так же, как и в SHFileOperation.iss:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Code]
type
  TSHFileOpStruct =  record
    wFunc: UINT;
    pFrom: PChar;
    pTo: PChar;
    fFlags: Word;
  end;

const
  FO_MOVE            = $0001;
  FO_COPY            = $0002;
  FOF_SILENT        = $0004;
  FOF_NOCONFIRMATION = $0010;
  FOF_FILESONLY      = $0080;
  FOF_NOCONFIRMMKDIR = $0200;

function SHFileOperation(const lpFileOp: TSHFileOpStruct):Integer; external 'SHFileOperation@shell32.dll stdcall';

function MoveDir(const fromDir, toDir: string; IsMove: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: string;
  SR: TFindRec;
  res: Boolean;
begin
    ForceDirectories(toDir);
  if IsMove then
    fos.wFunc  := FO_MOVE else
    fos.wFunc  := FO_COPY;
    fos.fFlags := FOF_FILESONLY or FOF_SILENT or
              FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
    _fromDir:= AddBackslash(fromDir);
    _toDir  := AddBackslash(toDir);
  if (Length(fromDir) = Length(_fromDir)) then
    begin
        res:= FindFirst(_fromDir + '*', SR);
      try
        while res do
        begin
          if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
          begin
            if SR.Attributes = FILE_ATTRIBUTE_DIRECTORY then
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir + #0#0;
                fos.pFrom  := PChar(_fromDir);
                fos.pTo    := PChar(_toDir);
              end else
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir  + SR.Name + #0#0;
                fos.pFrom  := PChar(_fromDir);
                fos.pTo    := PChar(_toDir);
              end;
                Result := (0 = ShFileOperation(fos));
                _fromDir:= ExtractFilePath(_fromDir);
                _toDir:= ExtractFilePath(_toDir);
          end;
          res := FindNext(SR);
        end;
      finally
        FindClose(SR);
      end;
    end else
    begin
      _fromDir:= RemoveBackslashUnlessRoot(_fromDir) + #0#0;
      _toDir  := RemoveBackslashUnlessRoot(_toDir)  + #0#0;
      fos.pFrom  := PChar(_fromDir);
      fos.pTo    := PChar(_toDir);
      Result := (0 = ShFileOperation(fos));
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpFinished then
  if DirExists(ExpandConstant('{app}\A')) then
    begin
      MoveDir(ExpandConstant('{app}\A'), ExpandConstant('{app}\B'), True);
    end;
end;


zl0ybot 09-08-2009 09:19 1189220

Здравствуйте, кто может сделать: чтобы архив freearc распаковал Precomp а патом распаковал эти архивы .

Serega 09-08-2009 12:42 1189312

Цитата:

Цитата zl0ybot
кто может сделать: чтобы архив freearc распаковал Precomp а патом распаковал эти архивы . »

zl0ybot, здравствуйте, сказать честно, звучит как, сделайте за меня скрипт, который я бы хотел в последствии использовать...
Нет, чтоб, вот у меня рабочий код (не скрипт, скрипты есть в интернете и много ума не надо, чтоб скопировать) распаковки FreeArc'a и код распаковки Precomp'a, а как сделать распаковку сначала одного, а затем другого. Либо, вот распаковываю так, а здесь вылетает ошибка...

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

Mihail88 09-08-2009 13:05 1189320

Цитата:

Цитата Serega
Вы сделайте, хоть что-нибудь сами, т.е. своими руками, а в моментах, где не будет получаться, вам обязательно помогут и подскажут. »

Проигрывание mp3 с возможность ютключения чекбоксом, прописал bass.dll с коммандами, но что то не выходит. не пропускает "if BASS_StreamCreateFile(FALSE, PAnsiChar(Name1), 0, 0, BASS_SAMPLE_LOOP) then"
Скрипт http://webfile.ru/3827892

Вверху ссобщение с dll и mp3 файлом.

BlackSelf 09-08-2009 15:05 1189373

Mihail88, пробуйте:
читать дальше »
Код:

[Setup]
AppName=Example.Play.MP3.Music.On.Start.Up.With.Texture
AppVerName=Example.Play.MP3.Music.On.Start.Up.With.Texture
AppPublisher=genri.sampron.iTASmania_Inc.uncle
DefaultDirName=C:\Play.MP3
OutputBaseFilename=play.mp3.by.genri.sampron.iTASmania_Inc.uncle


[Files]
Source: compiler:BASS.dll; DestDir: "{tmp}"; Flags: dontcopy noencryption
Source: G:\Inet\Music\Marselle\Marselle - MarsFM (mixtape)\13 - Marselle - Он был.mp3; DestDir: {tmp}; Flags: dontcopy noencryption nocompression


[_Code]
const
  BASS_ACTIVE_STOPPED = 0;
  BASS_ACTIVE_PLAYING = 1;
  BASS_ACTIVE_STALLED = 2;
  BASS_ACTIVE_PAUSED = 3;
  BASS_SAMPLE_LOOP = 4;

var
  mp3Handle: HWND;
  mp3Name: String;
  cb:TCheckBox;

function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
  external 'BASS_Init@files:BASS.dll stdcall delayload';

function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): DWORD;
  external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

function BASS_Start(): Boolean;
  external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
  external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function BASS_ChannelIsActive(handle: DWORD): Integer;
  external 'BASS_ChannelIsActive@files:BASS.dll stdcall delayload';

function BASS_ChannelPause(handle: DWORD): Boolean;
  external 'BASS_ChannelPause@files:BASS.dll stdcall delayload';

function BASS_Stop(): Boolean;
  external 'BASS_Stop@files:BASS.dll stdcall delayload';

function BASS_Pause(): Boolean;
  external 'BASS_Pause@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
  external 'BASS_Free@files:BASS.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('13 - Marselle - Он был.mp3');
  mp3Name := ExpandConstant('{tmp}\13 - Marselle - Он был.mp3');
  BASS_Init(-1, 44100, 0, 0, 0);
  mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
  BASS_Start();
  BASS_ChannelPlay(mp3Handle, False);
  Result := True;
end;

procedure cbmusic(Sender: TObject);
begin
if cb.checked = true then
 begin
  case BASS_ChannelIsActive(mp3Handle) of
    BASS_ACTIVE_PAUSED:
      begin
        BASS_ChannelPlay(mp3Handle, False);
      end;
    BASS_ACTIVE_STOPPED:
      begin
        BASS_Init(-1, 44100, 0, 0, 0);
        mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
        BASS_Start();
        BASS_ChannelPlay(mp3Handle, False);
      end;
  end;
end;
if cb.checked = false then
  BASS_ChannelPause(mp3Handle);
end;


procedure InitializeWizard();
begin
  cb:=TCheckBox.Create(WizardForm);
  cb.Parent:=WizardForm;
  cb.Width:=ScaleX(220);
  cb.Left:=ScaleY(10);
  cb.Top:=ScaleY(330);
  cb.CAPTION:='Проигрывание музыки';
  cb.ONCLICK:=@cbmusic;
  cb.checked:=true
end;

procedure DeinitializeSetup();
begin
  BASS_Stop();
  BASS_Free();
end;


Mihail88 09-08-2009 15:32 1189386

BlackSelf, спасибо работает

YikxX 09-08-2009 16:25 1189411

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

STR1KEE 09-08-2009 16:28 1189413

А мне помоч можете, пожалуйста очень надо...сообщение было на 123 стр. в конце

Serega 09-08-2009 16:58 1189435

Цитата:

Цитата YikxX
Или придется в скрипт лезть? »

В идеале, лучше переупаковать, но можно и так, без переупаковки...
Цитата:

Цитата YikxX
В результате чего всякие тасккиллы не катят, так как команда на запуск инсталлятора еще не отработала. »

Просто она отрабатывает раньше, чем запускается программа... можно реализовать цикл ожидания с помощью ISTask.dll, но это всё равно писать отдельный скрипт, который бы запускал инсталлятор, ожидал его завершения и прибивал программу при запуске...
Так же можно применить Avtoit или тоже самое реализовать на Inno, т.е. нажатие на кнопки и галочки.

Mihail88 09-08-2009 17:11 1189445

YikxX, можно sfx инсталятор сделать, но он завершит свою работу после установки

;!@Install@!UTF-8!

GUIFlags="2+512"
RunProgram="Convert.exe"
GUIMode="2"
InstallPath="C:\\"
OverwriteMode="0"
;!@InstallEnd@!

YikxX 09-08-2009 17:15 1189451

Вложений: 1
Serega, я пытаюсь перепаковать, убрав секцию [Run] - не компилируется, ошибку выдает. :(

Сам скрипт
читать дальше »
[Setup]
AppName=Driver Genius Professional Edition
AppVerName=Driver Genius Professional Edition
DefaultDirName={pf}\DriverGenius
OutputBaseFilename={D263644A-89A4-46FA-9C03-8E8F8AACD9F3}
Compression=lzma
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp

[Files]
Source: "{app}\DriverGenius.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\LiveUpdate.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\DriversDB.dbd"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\DriverGenius.cfg"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\AlphaImageControl.ocx"; DestDir: "{app}"; Flags: restartreplace regserver ignoreversion
Source: "{app}\clinetsuitex6.ocx"; DestDir: "{app}"; Flags: restartreplace regserver ignoreversion
Source: "{app}\CodejockControls.ocx"; DestDir: "{app}"; Flags: restartreplace regserver ignoreversion
Source: "{app}\AniGIF.ocx"; DestDir: "{app}"; Flags: restartreplace regserver ignoreversion
Source: "{app}\XceedZip.dll"; DestDir: "{app}"; Flags: restartreplace regserver ignoreversion
Source: "{app}\zlib1.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{app}\aspr_ide.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{sys}\ASYCFILT.DLL"; DestDir: "{sys}"; OnlyBelowVersion: 0.0,6.0; Flags: uninsneveruninstall restartreplace sharedfile
Source: "{sys}\COMCAT.DLL"; DestDir: "{sys}"; OnlyBelowVersion: 0.0,6.0; Flags: uninsneveruninstall restartreplace regserver sharedfile
Source: "{sys}\OLEAUT32.DLL"; DestDir: "{sys}"; OnlyBelowVersion: 0.0,6.0; Flags: uninsneveruninstall restartreplace regserver sharedfile
Source: "{sys}\OLEPRO32.DLL"; DestDir: "{sys}"; OnlyBelowVersion: 0.0,6.0; Flags: uninsneveruninstall restartreplace regserver sharedfile
Source: "{sys}\stdole2.tlb"; DestDir: "{sys}"; OnlyBelowVersion: 0.0,6.0; Flags: uninsneveruninstall restartreplace regtypelib sharedfile
Source: "{sys}\MSVBVM60.DLL"; DestDir: "{sys}"; Flags: uninsneveruninstall restartreplace regserver sharedfile
Source: "{app}\License\License_Eng.txt"; DestDir: "{app}\License"; Flags: ignoreversion
Source: "{app}\Help\DriverGenius_Eng.chm"; DestDir: "{app}\Help"; Flags: ignoreversion
Source: "{app}\Languages\English.lng"; DestDir: "{app}\Languages"; Flags: ignoreversion

[Registry]
Root: HKLM; Subkey: "Software\Driver-Soft\DriverGenius"; Flags: uninsdeletekey noerror
Root: HKLM; Subkey: "Software\Driver-Soft\DriverGenius"; ValueName: "InstallPath"; ValueType: String; ValueData: "{app}";
Root: HKLM; Subkey: "Software\Driver-Soft\DriverGenius"; ValueName: "Language"; ValueType: String; ValueData: "0409"; Languages: "English";

[Icons]
Name: "{group}\Driver Genius Professional Edition"; Filename: "{app}\DriverGenius.exe";
Name: "{userdesktop}\Driver Genius Professional Edition"; Filename: "{app}\DriverGenius.exe"; Tasks: "desktopicon";
Name: "{group}\User's Guide"; Filename: "{app}\Help\DriverGenius_Eng.chm"; Languages: "English";
Name: "{group}\Driver Genius Professional Edition on the web"; Filename: "{app}\DriverGenius.url"; Languages: "English";
Name: "{group}\Uninstall Driver Genius Professional Edition"; Filename: "{uninstallexe}"; Languages: "English";

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}";
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}";

[CustomMessages]
English.NameAndVersion=%1 version %2
English.AdditionalIcons=Дополнительные иконки:
English.CreateDesktopIcon=Создать значок на &Рабочем столе
English.CreateQuickLaunchIcon=Создать значок в &Панели быстрого запуска
English.ProgramOnTheWeb=%1 в Сети
English.UninstallProgram=Удалить %1
English.LaunchProgram=Запуск %1
English.AssocFileExtension=&Associate %1 with the %2 file extension
English.AssocingFileExtension=Associating %1 with the %2 file extension...

[Languages]
; These files are stubs
; To achieve better results after recompilation, use the real language files
Name: "English"; MessagesFile: "embedded\English.isl"; LicenseFile: "embedded\EnglishLicense.txt";

Serega 09-08-2009 17:25 1189459

Цитата:

Цитата STR1KEE
2. Читал, читал так и не понял как можно изменить скин установки »

Про какой скин имеете ввиду, если про картинки с левой стороны (большая 164х314) и вверху с правой (маленькая 55х55), то в секции [Setup] добавьте:
Код:

[Setup]
;;;;;;;;;;;;;;;;;;;;;;
WizardImageFile=путь до большой картинки\Image.bmp
WizardSmallImageFile=путь до маленкой\SmallImage.bmp
;;;;;;;;;;;;;;;;;;;;;

Цитата:

Цитата STR1KEE
А еще если можно и не составить труда вставте в этот скрипт с пояснениями, а то до меня долго доходит))) »

Что нужно вставить, пояснения? Рекомендую немного ознакомиться со справкой к Inno Setup, она на русском языке и вы сможете найти там ответы на многие вопросы...

YikxX, рекомендую вытаскивать скрипт, с помощью InnoUnpaker 2.6b3 [от valeron87], ссылка в шапке темы, но даже распаковав и сохранив скрипт, нет гарантии (50х50), что полученный после компиляции инсталлятор будет делать всё также как родной, т.к. секцию [Code] вытащить из скрипта невозможно. Здесь поможет RegShot, т.е. снимок до установки и после, затем добавляя данные в распакованный скрипт...
Цитата:

Цитата YikxX
ошибку выдает. »

Уберите секцию [Languages] из скрипта...

YikxX 09-08-2009 17:42 1189474

Всем спасибо, разобрался сам. :)

Цитата:

Цитата Serega
Уберите секцию [Languages] из скрипта... »

Не совсем так. Вернее, совсем не так. :)

Mihail88 09-08-2009 18:40 1189509

STR1KEE Если ты про те скины... Оказывается эти скрипты не полностью понимает версия 5.3 beta.

немного поправил http://webfile.ru/3828298

STR1KEE 09-08-2009 18:51 1189518

А еще такая ситуация.. Идет полоса установки..можно сделать чтобы показывались проценты установки и еще чтобы слайды менялись в зависимости от процента установки

mitek_gsm 09-08-2009 21:57 1189650

YikxX, а почему у вас в скрипте смесь русских и английских фраз ?
по скрину видно что он не может найти русские фразы в English.isl
читать дальше »

English.ProgramOnTheWeb=%1 в Сети
English.UninstallProgram=Удалить %1
English.LaunchProgram=Запуск %1
English.AssocFileExtension=&Associate %1 with the %2 file extension
English.AssocingFileExtension=Associating %1 with the %2 file extension...


Используйте только тот язык который указан в секции Languages.

volk1234 10-08-2009 02:57 1189808

YikxX
Надо бы опубликовать решение для остальных. Как вы считаете?

x-net 10-08-2009 08:55 1189891

Скажите кто здесь хорошо разбирается в inno, в скриптах, диалогах, рисунках и т.д?

zl0ybot 10-08-2009 10:55 1189947


Цитата zl0ybot:
кто может сделать: чтобы архив freearc распаковал Precomp а патом распаковал эти архивы . »
zl0ybot, здравствуйте, сказать честно, звучит как, сделайте за меня скрипт, который я бы хотел в последствии использовать...
Нет, чтоб, вот у меня рабочий код (не скрипт, скрипты есть в интернете и много ума не надо, чтоб скопировать) распаковки FreeArc'a и код распаковки Precomp'a, а как сделать распаковку сначала одного, а затем другого. Либо, вот распаковываю так, а здесь вылетает ошибка...

Вы сделайте, хоть что-нибудь сами, т.е. своими руками, а в моментах, где не будет получаться, вам обязательно помогут и подскажут.
ну ты же ГУру

STR1KEE 10-08-2009 12:10 1190021

А подскажите как поставить не по секундную смену слайдов, а процентную?
читать дальше »

procedure CurStepChanged(CurStep: TSetupStep);
begin

if CurStep=ssInstall
then
begin
ExtractTemporaryFile('3.bmp');
ExtractTemporaryFile('4.bmp');
ExtractTemporaryFile('6.bmp');
ExtractTemporaryFile('5.bmp');
isxbb_AddImage(ExpandConstant('{tmp}')+'\3.bmp',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\4.bmp',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\6.bmp',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\5.bmp',BACKGROUND or TIMER);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));

isxbb_StartTimer(180,BACKGROUND)
end

else if CurStep=ssPostInstall then
isxbb_KillTimer(BACKGROUND);
end;

И еще, когда слайды делаешь там сначала синий фон появляется, а через секунду, две, картинка, а можно этот фон изменить на другой цвет например черный

YikxX 10-08-2009 13:21 1190061

mitek_gsm, это не мой скрипт.

Цитата:

Цитата volk1234
Надо бы опубликовать решение для остальных. Как вы считаете? »

Да какое там решение? :) Удалил из English.lsi параметр LicenseText (зачем он при тихой установке) да и все.

A1EXXX 10-08-2009 15:21 1190193

Вложений: 1
Ребята, у меня такой вопрос: как сделать, чтобы проценты устаноки показывались пропорционально сегментам (там вроде ~ 100 сегментов, чтоб каждый соответствовал 1 проценту) ?? У меня есть скрипт (прикрепил), но там проценты установки меняются по извлечении файлов (неактуально, когда несколько больших файлов). И вот скрин Я хочу перенести проценты из 1 в 2 (как это зделать, я знаю), но чтоб это не выглядело как на 3, т.е. строка статуса закрывает их, а мне нужно, чтоб проценты были поверх... Ну как-то так.. надеюсь вопрос понятен :) :grin:

Serega 10-08-2009 17:44 1190297

Цитата:

Цитата zl0ybot
ну ты же ГУру »

Я такой же пользователь как и вы...

Цитата:

Цитата STR1KEE
А подскажите как поставить не по секундную смену слайдов, а процентную? »

По-моему страниц двадцать или раньше, поднимался этот вопрос...

Цитата:

Цитата A1EXXX
У меня есть скрипт (прикрепил), но там проценты установки меняются по извлечении файлов (неактуально, когда несколько больших файлов). »

Из скрипта видно, что создаётся Label, в котором отображается процент распакованных файлов, т.е прогрессбар дёргаться не должен, смена текста в Label'е бывает на больших файлах запаздывает.
Выход, только переписывать всё вручную, но поверьте, игра не стоит свеч, т.е писать много...
Цитата:

Цитата A1EXXX
Я хочу перенести проценты из 1 в 2 (как это зделать, я знаю), но чтоб это не выглядело как на 3 »

поиграйтесь со значениями в procedure InitializeWizard с:
Код:

      ProgressLabel.Top:= ScaleY(107)
      ProgressLabel.Left:= ScaleX(392)


Mihail88 10-08-2009 18:33 1190325

Как называется элемент чекбокс "Не создавать папку в меню «Пуск»"?

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

пример c кнопкой "отмена" в идеале:
procedure InitializeWizard();
begin
WizardForm.CancelButton.Left:=ScaleY(10);
WizardForm.CancelButton.Top:=ScaleY(327);
end;

serg aka lain 10-08-2009 19:30 1190349

Цитата:

Цитата Mihail88
Как называется элемент чекбокс "Не создавать папку в меню «Пуск»"? »

WizardForm.NoIconsCheck

A1EXXX 10-08-2009 19:33 1190353

Цитата:

Цитата Serega
Из скрипта видно, что создаётся Label, в котором отображается процент распакованных файлов, т.е прогрессбар дёргаться не должен, смена текста в Label'е бывает на больших файлах запаздывает.
Выход, только переписывать всё вручную, но поверьте, игра не стоит свеч, т.е писать много... »

тогда понятно, я думал, может есть что-то проще....
Цитата:

Цитата Serega
поиграйтесь со значениями в procedure InitializeWizard с:
Код:
ProgressLabel.Top:= ScaleY(107)
ProgressLabel.Left:= ScaleX(392) »

это я знаю, указать координаты не сложно. проблема в том, что я хочу, чтобы проценты были на одной строке с надписью "Установка...", но если я просто перемещаю их туда, они скрываются, т.е. строка статуса получается поверх процентов (даже если я размещаю проценты почти в конце прогресс-бара), а мне надо наоборот.....

Serega 10-08-2009 19:59 1190367

Цитата:

Цитата Mihail88
Как называется элемент чекбокс "Не создавать папку в меню «Пуск»"? »

Попробуйте скомпилировать этот скрипт:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
AllowNoIcons=yes
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe

[Code]
procedure InitializeWizard();
begin
  WizardForm.NoIconsCheck.Caption:= 'привет';
  WizardForm.NoIconsCheck.Checked:= True;
  WizardForm.NoIconsCheck.Enabled:= True;
  WizardForm.NoIconsCheck.Left:= 180;
  WizardForm.NoIconsCheck.Top:= 150;
end;



Цитата:

Цитата A1EXXX
это я знаю, указать координаты не сложно. проблема в том, что я хочу, чтобы проценты были на одной строке с надписью "Установка...", но если я просто перемещаю их туда, они скрываются, »

Самое простое изменить, т.е. уменьшить значение WizardForm.FilenameLabel.Width

x-net 10-08-2009 20:03 1190371

Помогите с ошибкой ничего не могу понять ,
пишет ошибку типа неверна комадная строка

читать дальше »
[setup]
AppName=Grandia 2
AppVerName=Grandia 2 [Repack]
AppPublisher=X-NET
DefaultDirName={pf}\Grandia 2
OutputDir=D:\Репаки\Prototype
DefaultGroupName=Grandia 2
UninstallFilesDir={app}\Uninstall
Compression=lzma/ultra64
InternalCompressLevel=ultra64
SolidCompression=true
DiskSpanning=yes
SlicesPerDisk=3
DiskSliceSize=1100000000
DisableProgramGroupPage=true
;DisableReadyPage=true
UninstallDisplayIcon={app}\Grandia2.exe, 0
UninstallDisplayName=Grandia 2
SetupIconFile=C:\Users\Администратор\Desktop\MAINICON.ico

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

[Icons]
Name: "{group}\Запустить игру"; Filename: "{app}\Grandia2.exe"; WorkingDir: "{app}"; Check: GroupIcons
Name: "{group}\Удалить игру"; Filename: {app}\Uninstall\unins000; WorkingDir: {app}; Check: GroupIcons
Name: "{group}\Настроить"; Filename: {app}\GmConfig.exe; WorkingDir: {app}; Check: GroupIcons
Name: "{userdesktop}\Grandia 2"; Filename: {app}\Grandia2.exe; WorkingDir: {app}; Check: CreateIcons

;GameUx

[Files]
Source: ISSkin.dll; DestDir: {app}; Flags: dontcopy
Source: WinX1.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: get_hw_caps.dll; Flags: dontcopy
Source: 1.bmp; DestDir: {tmp}; Flags: dontcopy
Source: "C:\Program Files\Grandia 2\Grandia2.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files\Grandia 2\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

;GameUx

[Run]
Filename: "{src}\DirectX\DXSETUP.exe"; Parameters: "\silent"; StatusMsg: ExpandConstant('{cm:UP}'); Check: InstallDirectX
Filename: "{src}\Redist\vcredist_x86.exe"; Parameters: "\q"; StatusMsg: "Идет установка Microsoft Visual C++ Redistibutable"; WorkingDir: "{src}\Redist"; Check: InstallRedist

A1EXXX 10-08-2009 20:23 1190377

Цитата:

Цитата Serega
Самое простое изменить, т.е. уменьшить значение WizardForm.FilenameLabel.Width »

спасибо, понял!

Serega 10-08-2009 20:36 1190389

Цитата:

Цитата x-net
пишет ошибку типа неверна комадная строка »

всё правильно, где вы видели обратный слеш '\' в ком. строке?
Замените '\' на '/', т.е.
Код:

[Run]
Filename: "{src}\DirectX\DXSETUP.exe"; Parameters: "/silent"; StatusMsg: ExpandConstant('{cm:UP}'); Check: InstallDirectX
Filename: "{src}\Redist\vcredist_x86.exe"; Parameters: "/q"; StatusMsg: "Идет установка Microsoft Visual C++ Redistibutable"; WorkingDir: "{src}\Redist"; Check: InstallRedist


Mihail88 10-08-2009 21:11 1190415

serg aka lain, Serega, благодарю.
То что нужно, если не секрет как вы их узнаёте? Всмысле используемые элементы инсталлятора.

zl0ybot 10-08-2009 21:24 1190423

Serega ты не как я и ни как другие ты мега гуру Inno setup...... (может сделаешь?)

x-net 10-08-2009 22:03 1190455

Serega, блин всё получилось спасибо тебе, но теперь одна ошибка осталось в аську выйди, вопросы бы задавал по inno

serg aka lain 10-08-2009 23:30 1190523

Цитата:

Цитата Mihail88
То что нужно, если не секрет как вы их узнаёте? Всмысле используемые элементы инсталлятора. »

Ну, можно взглянуть в файл Setup.e32 в папке Inno, с помощью редактора ресурсов (ResHacker , etc) TWIZARDFORM
или вот готовый
читать дальше »

object WizardForm: TWizardForm
Left = 191
Top = 139
BorderIcons = [biSystemMenu]
BorderStyle = bsDialog
Caption = 'WizardForm'
ClientHeight = 360
ClientWidth = 497
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Scaled = False
OnClose = FormClose
PixelsPerInch = 96
TextHeight = 13
object Bevel: TBevel
Left = 0
Top = 313
Width = 497
Height = 2
Shape = bsTopLine
end
object CancelButton: TNewButton
Left = 464
Top = 327
Width = 17
Height = 23
Cancel = True
Caption = '*'
TabOrder = 4
OnClick = CancelButtonClick
end
object NextButton: TNewButton
Left = 440
Top = 327
Width = 17
Height = 23
Caption = '*'
Default = True
TabOrder = 3
OnClick = NextButtonClick
end
object BackButton: TNewButton
Left = 424
Top = 327
Width = 16
Height = 23
Caption = '*'
TabOrder = 2
OnClick = BackButtonClick
end
object OuterNotebook: TNewNotebook
Left = 0
Top = 0
Width = 497
Height = 313
ActivePage = InnerPage
Color = clBtnFace
ParentColor = False
TabOrder = 0
object WelcomePage: TNewNotebookPage
Color = clWindow
ParentColor = False
object WizardBitmapImage: TBitmapImage
Left = 0
Top = 0
Width = 164
Height = 314
end
object WelcomeLabel2: TNewStaticText
Left = 176
Top = 76
Width = 301
Height = 234
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 1
WordWrap = True
end
object WelcomeLabel1: TNewStaticText
Left = 176
Top = 16
Width = 301
Height = 54
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
object InnerPage: TNewNotebookPage
object Bevel1: TBevel
Left = 0
Top = 58
Width = 499
Height = 3
Shape = bsTopLine
end
object InnerNotebook: TNewNotebook
Left = 40
Top = 72
Width = 417
Height = 237
ActivePage = LicensePage
TabOrder = 1
object LicensePage: TNewNotebookPage
object LicenseNotAcceptedRadio: TNewRadioButton
Left = 0
Top = 216
Width = 417
Height = 17
Caption = '*'
Checked = True
TabOrder = 3
TabStop = True
OnClick = LicenseNotAcceptedRadioClick
end
object LicenseAcceptedRadio: TNewRadioButton
Left = 0
Top = 196
Width = 417
Height = 17
Caption = '*'
TabOrder = 2
OnClick = LicenseAcceptedRadioClick
end
object LicenseMemo: TRichEditViewer
Left = 0
Top = 24
Width = 417
Height = 161
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 1
WantReturns = False
UseRichEdit = False
end
object LicenseLabel1: TNewStaticText
Left = 0
Top = 0
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
object PasswordPage: TNewNotebookPage
object PasswordEdit: TPasswordEdit
Left = 0
Top = 40
Width = 265
Height = 21
TabOrder = 2
end
object PasswordEditLabel: TNewStaticText
Left = 0
Top = 24
Width = 417
Height = 14
AutoSize = False
Caption = '*'
FocusControl = PasswordEdit
TabOrder = 1
WordWrap = True
end
object PasswordLabel: TNewStaticText
Left = 0
Top = 0
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
object InfoBeforePage: TNewNotebookPage
object InfoBeforeMemo: TRichEditViewer
Left = 0
Top = 24
Width = 417
Height = 205
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 1
WantReturns = False
UseRichEdit = False
end
object InfoBeforeClickLabel: TNewStaticText
Left = 0
Top = 0
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
object UserInfoPage: TNewNotebookPage
object UserInfoSerialEdit: TNewEdit
Left = 0
Top = 120
Width = 417
Height = 21
MaxLength = 255
TabOrder = 5
OnChange = UserInfoEditChange
end
object UserInfoSerialLabel: TNewStaticText
Left = 0
Top = 104
Width = 417
Height = 14
AutoSize = False
Caption = '*'
FocusControl = UserInfoSerialEdit
TabOrder = 4
WordWrap = True
end
object UserInfoOrgEdit: TNewEdit
Left = 0
Top = 68
Width = 417
Height = 21
MaxLength = 255
TabOrder = 3
OnChange = UserInfoEditChange
end
object UserInfoOrgLabel: TNewStaticText
Left = 0
Top = 52
Width = 417
Height = 14
AutoSize = False
Caption = '*'
FocusControl = UserInfoOrgEdit
TabOrder = 2
WordWrap = True
end
object UserInfoNameEdit: TNewEdit
Left = 0
Top = 16
Width = 417
Height = 21
MaxLength = 255
TabOrder = 1
OnChange = UserInfoEditChange
end
object UserInfoNameLabel: TNewStaticText
Left = 0
Top = 0
Width = 417
Height = 14
AutoSize = False
Caption = '*'
FocusControl = UserInfoNameEdit
TabOrder = 0
WordWrap = True
end
end
object SelectDirPage: TNewNotebookPage
object SelectDirBitmapImage: TBitmapImage
Left = 0
Top = 0
Width = 32
Height = 32
end
object DiskSpaceLabel: TNewStaticText
Left = 0
Top = 216
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 4
WordWrap = True
end
object DirBrowseButton: TNewButton
Left = 400
Top = 67
Width = 17
Height = 23
Caption = '*'
TabOrder = 3
OnClick = DirBrowseButtonClick
end
object DirEdit: TEdit
Left = 0
Top = 68
Width = 397
Height = 21
TabOrder = 2
Text = 'DirEdit'
end
object SelectDirBrowseLabel: TNewStaticText
Left = 0
Top = 44
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 1
WordWrap = True
end
object SelectDirLabel: TNewStaticText
Left = 44
Top = 0
Width = 373
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
object SelectComponentsPage: TNewNotebookPage
object ComponentsDiskSpaceLabel: TNewStaticText
Left = 0
Top = 216
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 3
end
object ComponentsList: TNewCheckListBox
Left = 0
Top = 48
Width = 417
Height = 157
Offset = 2
OnClickCheck = ComponentsListClickCheck
RequireRadioSelection = True
TabOrder = 2
end
object TypesCombo: TNewComboBox
Left = 0
Top = 24
Width = 417
Height = 21
Style = csDropDownList
ItemHeight = 0
TabOrder = 1
OnChange = TypesComboChange
end
object SelectComponentsLabel: TNewStaticText
Left = 0
Top = 0
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
object SelectProgramGroupPage: TNewNotebookPage
object SelectGroupBitmapImage: TBitmapImage
Left = 0
Top = 0
Width = 32
Height = 32
end
object NoIconsCheck: TNewCheckBox
Left = 0
Top = 215
Width = 417
Height = 17
Caption = '*'
TabOrder = 4
OnClick = NoIconsCheckClick
end
object GroupBrowseButton: TNewButton
Left = 400
Top = 67
Width = 17
Height = 23
Caption = '*'
TabOrder = 3
OnClick = GroupBrowseButtonClick
end
object GroupEdit: TNewEdit
Left = 0
Top = 68
Width = 397
Height = 21
TabOrder = 2
Text = 'GroupEdit'
end
object SelectStartMenuFolderBrowseLabel: TNewStaticText
Left = 0
Top = 44
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 1
WordWrap = True
end
object SelectStartMenuFolderLabel: TNewStaticText
Left = 44
Top = 0
Width = 373
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
object SelectTasksPage: TNewNotebookPage
object TasksList: TNewCheckListBox
Left = 0
Top = 24
Width = 417
Height = 205
Color = clBtnFace
RequireRadioSelection = True
ShowLines = False
TabOrder = 1
WantTabs = True
end
object SelectTasksLabel: TNewStaticText
Left = 0
Top = 0
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
object ReadyPage: TNewNotebookPage
object ReadyMemo: TNewMemo
Left = 0
Top = 24
Width = 417
Height = 205
Color = clBtnFace
ReadOnly = True
ScrollBars = ssBoth
TabOrder = 1
WantReturns = False
WordWrap = False
end
object ReadyLabel: TNewStaticText
Left = 0
Top = 0
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
object PreparingPage: TNewNotebookPage
object PreparingErrorBitmapImage: TBitmapImage
Left = 0
Top = 0
Width = 16
Height = 16
Visible = False
end
object PreparingLabel: TNewStaticText
Left = 24
Top = 0
Width = 393
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
Visible = False
WordWrap = True
end
end
object InstallingPage: TNewNotebookPage
object FilenameLabel: TNewStaticText
Left = 0
Top = 16
Width = 417
Height = 16
AutoSize = False
ForceLTRReading = True
ShowAccelChar = False
TabOrder = 1
end
object StatusLabel: TNewStaticText
Left = 0
Top = 0
Width = 417
Height = 16
AutoSize = False
ShowAccelChar = False
TabOrder = 0
end
object ProgressGauge: TNewProgressBar
Left = 0
Top = 42
Width = 417
Height = 21
Min = 0
Max = 100
end
end
object InfoAfterPage: TNewNotebookPage
object InfoAfterMemo: TRichEditViewer
Left = 0
Top = 24
Width = 417
Height = 205
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 1
WantReturns = False
UseRichEdit = False
end
object InfoAfterClickLabel: TNewStaticText
Left = 0
Top = 0
Width = 417
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
end
object MainPanel: TPanel
Left = 0
Top = 0
Width = 497
Height = 58
BevelOuter = bvNone
Color = clWindow
TabOrder = 0
object WizardSmallBitmapImage: TBitmapImage
Left = 440
Top = 0
Width = 55
Height = 58
BackColor = clWindow
end
object PageDescriptionLabel: TNewStaticText
Left = 40
Top = 26
Width = 389
Height = 29
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 1
WordWrap = True
end
object PageNameLabel: TNewStaticText
Left = 24
Top = 10
Width = 405
Height = 14
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
end
end
end
object FinishedPage: TNewNotebookPage
Color = clWindow
ParentColor = False
object WizardBitmapImage2: TBitmapImage
Left = 0
Top = 0
Width = 164
Height = 314
end
object NoRadio: TNewRadioButton
Left = 176
Top = 184
Width = 301
Height = 17
Caption = '*'
TabOrder = 4
Visible = False
end
object YesRadio: TNewRadioButton
Left = 176
Top = 156
Width = 301
Height = 17
Caption = '*'
Checked = True
TabOrder = 3
TabStop = True
Visible = False
end
object RunList: TNewCheckListBox
Left = 176
Top = 156
Width = 301
Height = 149
BorderStyle = bsNone
ParentColor = True
TabOrder = 2
Visible = False
WantTabs = True
end
object FinishedLabel: TNewStaticText
Left = 176
Top = 76
Width = 301
Height = 53
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 1
WordWrap = True
end
object FinishedHeadingLabel: TNewStaticText
Left = 176
Top = 16
Width = 301
Height = 54
AutoSize = False
Caption = '*'
ShowAccelChar = False
TabOrder = 0
WordWrap = True
end
end
end
object BeveledLabel: TNewStaticText
Left = 0
Top = 306
Width = 5
Height = 14
Caption = '*'
Enabled = False
ShowAccelChar = False
TabOrder = 1
end
end

zl0ybot 10-08-2009 23:39 1190529

serega
читать дальше »
procedure CurStepChanged(CurStep: TSetupStep);
var
res:Integer;
s,s1:string;
begin
If CurStep=ssInstall
then
begin


if (FileExists(AddBackslash(ExpandConstant('{src}')) + 'data1.bin')) and (FileExists(AddBackslash(ExpandConstant('{src}')) + 'data.bin')) then
begin

s:=ExpandConstant('{src}')+'\data.bin';
s1:=ExpandConstant('{app}');
Exec(s, '-y -o"'+ s1 + '"', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 1

s:=ExpandConstant('{src}')+'\data1.bin';
s1:=ExpandConstant('{app}');
Exec(s, '-y -o"'+ s1 + '"', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 3

Exec(ExpandConstant('{app}\zone\russian\pre.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);


WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 6



s:=ExpandConstant('{src}')+'\data2.bin';
s1:=ExpandConstant('{app}');
Exec(s, '-y -o"'+ s1 + '"', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 8

Exec(ExpandConstant('{app}\zone\russian\pre.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);
DeleteFile(ExpandConstant('{app}\zone\russian\msvcr80.dll'));
DeleteFile(ExpandConstant('{app}\zone\russian\packjpg_dll.dll'));
DeleteFile(ExpandConstant('{app}\zone\russian\zlib1.dll'));
DeleteFile(ExpandConstant('{app}\zone\russian\precomp.exe'));
DeleteFile(ExpandConstant('{app}\zone\russian\pre.bat'));


WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 11



s:=ExpandConstant('{src}')+'\data3.bin';
s1:=ExpandConstant('{app}');
Exec(s, '-y -o"'+ s1 + '"', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 13

Exec(ExpandConstant('{app}\main\1.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 14

Exec(ExpandConstant('{app}\main\2.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 15

s:=ExpandConstant('{src}')+'\data4.bin';
s1:=ExpandConstant('{app}');
Exec(s, '-y -o"'+ s1 + '"', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 17

Exec(ExpandConstant('{app}\main\3.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);
DeleteFile(ExpandConstant('{app}\msvcr80.dll'));
DeleteFile(ExpandConstant('{app}\packjpg_dll.dll'));
DeleteFile(ExpandConstant('{app}\zlib1.dll'));
DeleteFile(ExpandConstant('{app}\precomp.exe'));

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 19

s:=ExpandConstant('{src}')+'\data5.bin';
s1:=ExpandConstant('{app}');
Exec(s, '-y -o"'+ s1 + '"', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 20

Exec(ExpandConstant('{app}\main\dec1.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 23

Exec(ExpandConstant('{app}\main\dec2.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 26

Exec(ExpandConstant('{app}\main\dec3.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 29

Exec(ExpandConstant('{app}\main\4.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 30

Exec(ExpandConstant('{app}\main\5.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 31

Exec(ExpandConstant('{app}\main\6.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 32

Exec(ExpandConstant('{app}\main\7.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 33

Exec(ExpandConstant('{app}\main\8.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 34

Exec(ExpandConstant('{app}\main\9.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 35

Exec(ExpandConstant('{app}\main\10.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 37

s:=ExpandConstant('{src}')+'\data6.bin';
s1:=ExpandConstant('{app}');
Exec(s, '-y -o"'+ s1 + '"', '', SW_HIDE, ewWaitUntilTerminated, res);

WizardForm.StatusLabel.Caption:='Распаковка файлов...';
ProgressBar1.Position := 39










end else begin
MsgBox(ExpandConstant('{cm:file}'), mbInformation, MB_OK);
Abort;
end;
end;

end;
вот на ру.бораде нашёл

zl0ybot 10-08-2009 23:43 1190534

Вложений: 1
и еще Serega не мог бы вот это доделать? вотЪ

Mihail88 11-08-2009 00:05 1190551

serg aka lain не устаю благодарить :)
Тоже пользуюсь ResHacker'om ещё Res.Tuner не плох.
В общем буду разбератся.

Serega 11-08-2009 05:51 1190700

Вложений: 1
zl0ybot, повторюсь: я такой же пользователь как и вы, просто умею пользоваться литературой...
Если вы будете продолжать в таком направлении, я начну вас игнорировать...

Цитата:

Цитата zl0ybot
и еще Serega не мог бы вот это доделать? »

Вообще-то это я и делал, только для примера, а то говорили, что такое на Inoo Setup не сделаешь...
Что конкретно вам в нём не понятно?

Цитата:

Цитата serg aka lain
Ну, можно взглянуть в файл Setup.e32 в папке Inno, с помощью редактора ресурсов (ResHacker , etc) TWIZARDFORM
или вот готовый »

Согласен, а я пользуюсь редактором от Restools.
Допустим пишем в коде WizardForm, ставим точку и через секунду появляется список с возможными вариантами для WizardForm. Прикрепил к сообщению скриншот, как это всё выглядит...

x-net 11-08-2009 08:48 1190727


Скажите как это убрать? и ещё не запускается с галочки в конце установки
Код в вложении

zl0ybot 11-08-2009 09:46 1190754

Serega что бы она работала я как понял ты сделал его для показа а надо что бы работали функции устоновить/удалить
после установки работала кнопка играть и т.д. И еще вот скрипт
читать дальше »
#define MainExe "{app}\Bully.exe"
#define GDFBinary "{app}\Bully.exe"

[Setup]
AppName=Bully
AppVerName=Bully 1.00.0154
DefaultDirName={pf}\Bully
OutputDir=Output
Compression=none
DisableReadyPage=true
InternalCompressLevel=ultra64
SolidCompression=true
ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64 x86
RestartIfNeededByRun=false
UsePreviousAppDir=false
DirExistsWarning=no
DisableProgramGroupPage=true
DefaultGroupName=Bully
UsePreviousGroup=false
UsePreviousSetupType=false
UsePreviousTasks=false
UninstallFilesDir={app}\Uninstall
WizardImageFile=WizardImage.bmp

[Files]
Source: arc.exe; DestDir: {tmp}; Flags: dontcopy
Source: GameuxInstallHelper.dll; DestDir: {app}\Uninstall; Flags: overwritereadonly ignoreversion
Source: {src}\Gamedata\*; Destdir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs external
Source: Bully.exe; DestDir: {app}
Source: msvcp71.dll; DestDir: {app}
Source: msvcr71.dll; DestDir: {app}
Source: version.cfg; DestDir: {app}
Source: Readme.txt; DestDir: {app}
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Messages]
SelectDirBrowseLabel=Нажмите «Установить», чтобы начать установку. Если Вы хотите выбрать другую папку, нажмите «Обзор».
BeveledLabel=RepacK by leek
[LangOptions]
WelcomeFontName=Tahoma
WelcomeFontSize=11

[Registry]
Root: HKLM; SubKey: SOFTWARE\Rockstar Games\Bully Scholarship Edition; ValueType: dword; ValueName: Language; ValueData: $00000419
Root: HKLM; SubKey: SOFTWARE\Rockstar Games\Bully Scholarship Edition; ValueType: string; ValueName: SerialNum; ValueData: 0000-0000-0000-0000
Root: HKLM; SubKey: SOFTWARE\Rockstar Games\Bully Scholarship Edition; ValueType: string; ValueName: Version; ValueData: 1.00.0154


[Run]
Filename: {app}\Bully.exe; WorkingDir: {app}\; Description: Начать игру; Flags: postinstall
Filename: {src}\DirectX\DXSETUP.exe; Parameters: /silent; StatusMsg: Обновление:Microsoft DirectX 9.0c...; Check: InstallDirectX
Filename: {src}\Redistributables\vcredist_x86.exe; Parameters: "/q:a /c:""VCREDI~3.EXE /q:a /c:""""msiexec /i vcredist.msi /qn"""" """; StatusMsg: Обновление:Microsoft Visual C++ 2005...; Check: InstallDirectX

[Icons]
Name: {group}\Bully; Filename: {app}\Bully.exe; WorkingDir: {app}\
Name: {group}\ReadMe; Filename: {app}\ReadMe.txt
Name: {group}\Удалить игру; Filename: {uninstallexe}
Name: {commondesktop}\Bully; Filename: {app}\Bully.exe; WorkingDir: {app}\; Check: MakeDesktopIcon

[UninstallDelete]
Name: {app}\*; Type: filesandordirs

[code]
type
TGUID = record
Data1: Cardinal;
Data2,
Data3: Word;
Data4: array [0..8] of char;
end;

function GenerateGUID(var GUID: TGUID): Cardinal; external 'GenerateGUID@files:GameuxInstallHelper.dll stdcall setuponly';
function AddToGameExplorer(Binary: String; Path: String; InstallType: Integer; var GUID: TGUID): Cardinal; external 'AddToGameExplorerA@files:GameuxInstallHelper.dll stdcall setuponly';
function CreateTask(InstallType: Integer; var GUID: TGUID; TaskType: Integer; TaskNumber: Integer; TaskName: String; Binary: String; Parameters: String): Cardinal; external 'CreateTaskA@files:GameuxInstallHelper.dll stdcall setuponly';
function RetrieveGUIDForApplication(Binary: String; var GUID: TGUID): Cardinal; external 'RetrieveGUIDForApplicationA@{app}\Uninstall\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveFromGameExplorer(var GUID: TGUID): Cardinal; external 'RemoveFromGameExplorer@{app}\Uninstall\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveTasks(var GUID: TGUID): Cardinal; external 'RemoveTasks@{app}\Uninstall\GameuxInstallHelper.dll stdcall uninstallonly';

const
PlayTask = 0;
SupportTask = 1;

var
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
DesktopIcon, DirectX: TCheckBox;
GUID: TGUID;
ProgressBar1: TNewProgressBar;
/////Вычисление свободного места на диске
procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure animateprogress;
begin ProgressBar1.Position := ProgressBar1.Position+1
end;

procedure GetNeedSpaceCaption; /////Вычисление требуемого места для установки
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';end;

function MakeDesktopIcon: Boolean;
begin
Result:=DesktopIcon.Checked;end;

function InstallDirectX: Boolean;
begin
Result:=DirectX.Checked;end;

procedure InitializeWizard();
begin
begin
NeedSize := 4210; //Здесь указывается место для приложения
WizardForm.DiskSpaceLabel.Hide;
WizardForm.FilenameLabel.Hide;
WizardForm.ProgressGauge.Top:=ScaleY(100); //Изменение стандартного прогрессбара
WizardForm.ProgressGauge.Width:=262; //
WizardForm.ProgressGauge.Left:=155; //
WizardForm.StatusLabel.Top:=ScaleY(80);
WizardForm.WelcomeLabel2.Top:=ScaleY(90);
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;
end;
FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
begin //Создание чекбокса для создания ярлыка на рабочем столе
DesktopIcon := TCheckBox.Create(WizardForm);
with DesktopIcon do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Добавить ярлык на Рабочий стол';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top+35;
Width := ScaleX(400);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;
begin //Создание чекбокса для установки DirectX
DirectX := TCheckBox.Create(WizardForm);
with DirectX do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Установить дополнительное программное обеспечение';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top+55;
Width := ScaleX(400);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;
begin ///Создание нового прогрессбара
ProgressBar1 := TNewProgressBar.Create(wizardform);
with ProgressBar1 do
begin
Parent := wizardform.installingpage;
Top := 100
Width := 150;
Height := wizardform.progressgauge.height;
Max :=3; //кол-во архивов
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
begin
if CurPageID=wpSelectDir then
begin //Тут если Свободное место на диске < требуемого то кнопка "Установвить" на PageSelectDir неактивна
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
WizardForm.NextButton.Caption:='Установить'; //Rename кнопки "Далее" на SelectDir
end;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep); ///Регистрация в GameExplorer
var
Binary, MainExe: String;
ResultCode:Integer;
begin
if CurStep = ssInstall then //Перед установкой
begin
GenerateGUID(GUID);
ExtractTemporaryFile('arc.exe'); //Извлечение Arc.exe в Temp
if (FileExists(AddBackslash(ExpandConstant('{tmp}')) + 'arc.exe')) and (FileExists(AddBackslash(ExpandConstant('{src}')) + 'data-a.bin')) then
begin
WizardForm.StatusLabel.Caption:='Распаковка файлов...'; //Извлечение из 1-го архива
Exec(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(ExpandConstant('{src}\data-a.bin'))+' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
ProgressBar1.Position := ProgressBar1.Position+1

WizardForm.StatusLabel.Caption:='Распаковка файлов...'; //Извлечение из 2-го архива
Exec(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(ExpandConstant('{src}\data-b.bin'))+' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
ProgressBar1.Position := ProgressBar1.Position+1

WizardForm.StatusLabel.Caption:='Распаковка файлов...'; //Извлечение из 3-го архива
Exec(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(ExpandConstant('{src}\data-c.bin'))+' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
ProgressBar1.Position := ProgressBar1.Position+1

end else begin
MsgBox('Исполняемый файл:' + #13#10#13#10 + (AddBackslash(ExpandConstant('{tmp}')) + 'arc.exe') + #13#10#13#10 + 'не найден. Установка отменена', mbInformation, MB_OK);
Abort;
end;
end;
if CurStep = ssPostInstall then
begin
Binary:=ExpandConstant('{#GDFBinary}');
MainExe:=ExpandConstant('{#MainExe}');
AddToGameExplorer(Binary, ExpandConstant('{app}'), 3, GUID);
CreateTask(3, GUID, PlayTask, 0, 'Play', MainExe, '');
end;
end;

function InitializeSetup(): Boolean;
var
UnStr: String;
ErrorCode, Mesages: Integer;
begin //Повторный запуск
Result := True;
if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Bully_is1', 'UninstallString', UnStr) then
begin
If UnStr <> '' then
begin
Mesages := MsgBox('Bully уже установлена в Вашей системе.'+#10#10+'Хотите удалить приложение?', mbInformation, MB_YESNOCANCEL);
case Mesages of
idYes:
begin
UnStr := RemoveQuotes(UnStr);
Exec(UnStr, '/silent', '', SW_Show, ewWaitUntilTerminated, ErrorCode);
Result := True;
end
idNo:
begin
Result := True;
end
idCancel:
begin
Result := False;
end;
end;
end;
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
ResultStr:String;
Binary: String;
GUID: TGUID;
begin /////////////////////////////////////////Удаление игровых сохранений
if CurUninstallStep=usPostUninstall then
begin
RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Bully_is1', 'UnInstConfirm', ResultStr)
if DirExists(ExpandConstant('{userdocs}')+'\Prince of Persia') then
if MsgBox('Удалить сохраненные игры и настройки?',mbconfirmation, mb_YesNo) = IDYES then
begin
if not DelTree(ExpandConstant('{userdocs}')+'\Bully', True, True, True)
then
MsgBox('Папка не удалена!' #13#13 'Папка не существует или задействована.', mbError, MB_OK);
end;
end;
begin
if CurUninstallStep=usUninstall then //Удаление из GameExplorer
begin
Binary:=ExpandConstant('{#GDFBinary}');
RetrieveGUIDForApplication(Binary, GUID);
RemoveFromGameExplorer(GUID);
RemoveTasks(GUID);
UnloadDll(ExpandConstant('{app}\Uninstall\GameuxInstallHelper.dll'));
end;
end;
end;
можно ли отсюда вынуть весь мусор только что бы осталось распаковка freearc'а и progressbar (оба)

FlatX007 11-08-2009 16:40 1191140

Доброго времени суток. Вопрос такой ...

Есть некий инсталятор, его единственная задача дополнить unins000.dat списком новых файлов, что бы они удалились деинстилятором. Как мне сделать сторонный модуль (скрипт) что бы в нём указать файлы для секции
Код:

[UninstallDelete]
, это нужно для того чтобы каждый раз не "перепаковывать" экзэшник.

Alfiks 13-08-2009 10:34 1192562

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

Код:

[Setup]
AppName=Обновление для программы заказа продукции фирмы ЗАО"Арнебия"
AppVerName=Обновление для программы заказа продукции фирмы ЗАО"Арнебия" ver. 0.1
AppPublisher=Arnebia Inc
AppPublisherURL=http://www.arnebia.ru/
AppSupportURL=http://www.arnebia.ru/
AppUpdatesURL=http://www.arnebia.ru/
DefaultDirName={reg:HKLM\SOFTWARE\Arnebia,AppPath|{pf}\Arnebia\ArnebiaProduct}
DisableDirPage=yes
DefaultGroupName=Arnebia
OutputDir=C:\test progr
OutputBaseFilename=setup
SetupIconFile=C:\test progr\ArnebiaProduct\ArnebiaDoc.ico
Compression=lzma
SolidCompression=yes

[Dirs]
Name: {app}\img

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked



[Icons]
Name: {group}\; Filename: {app}\ArnebiaDoc.ico; IconFilename: {app}\ArnebiaDoc.ico; Flags: runminimized
[Files]
Source: ..\..\..\test progr\ArnebiaProduct\img\img_installer\AP_Setup.jpg; DestDir: {app}\img\img_installer
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия 25s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия 26s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия 27s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия 28s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия Копия 25s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия Копия 26s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия Копия 27s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия Копия 28s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия Копия Копия 25s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия Копия Копия 26s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия Копия Копия 27s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\img\img_product\Копия Копия Копия 28s.gif; DestDir: {app}\img\img_product
Source: ..\..\..\test progr\ArnebiaProduct\ArnebiaDoc.ico; DestDir: {app}
Source: ..\..\..\test progr\ArnebiaProduct\client.xml; DestDir: {app}
Source: ..\..\..\test progr\ArnebiaProduct\data.mdb; DestDir: {app}

[Code_]
procedure MyAfterInstall();
begin
  MsgBox('Just installed ArnebiaProduct.exe as ' + CurrentFileName + '.', mbInformation, MB_OK);
end;



var
UpDate:string;

function GetInstallPath( AppID: String ): String;
var
Path: String;
    begin
    Path:= '';
    RegQueryStringValue(HKLM, 'SOFTWARE\Arnebia', 'AppPath', Path);
    Result:= Path;
    end;

function InitializeSetup(): Boolean;
var
Version,s:string;
    begin
    Result:=True;
    UpDate:='2.0.0.7';
// Проверка через реестр
    if not RegValueExists(HKLM, 'SOFTWARE\Arnebia', 'AppPath') then
        begin
        s:='Программа не установлена.' #13#13 'Дальнейшая работа невозможна.';
        MsgBox(s, mbError, mb_Ok);
        Result:=False;
        end else
// Проверка присутствия файла в папке с установленной программой
          begin
          If (FileSearch('ArnebiaProduct.exe', ExpandConstant('{code:GetInstallPath}'))='') then
              begin
              s:='Извините, в директории '+ExpandConstant('{code:GetInstallPath}')+'' #13 'не обнаружены файлы, подтверждающие подлинность программы.' #13#13 'Пожалуйста, выберите правильный путь.';
              MsgBox(s, mbError, mb_Ok);
              Result:= False;
              end else
 //                MsgBox('Версия:'+ Version, mberror, mb_Ok)
 begin
                    if Version < UpDate then //сравниваем
                        begin
                        RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Arnebia', 'AppVers', Version);
                        Result:=true;
                        end else begin
                        MsgBox('Обновление на данную версию не устанавливается.', mberror, mb_Ok);
                        Result:=false;
                        end;
                    end;
                end;
          end;



       
procedure DeinitializeSetup();
 begin
    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Arnebia', 'AppVers', UpDate);
 end;

Заранее очень благодарен за помощь. А то на работе трясут... сроки, а я застрял на этих моментах.pi

Elka80 13-08-2009 19:28 1193004

Всем привет!
Установил "Inno Setup 5.2.3 RU". Программа запустилось Анг. Как русс сделать?

Спасибо!

FlatX007 13-08-2009 21:08 1193071

Цитата:

Цитата Alfiks
1)Как заставить инсталяшку не оставлять след в установке-удалении программ »

CreateUninstallRegKey
Возможные значения : yes or no
Значение по умолчанию : yes
Описание:
При значении no инсталлятор не будет создавать пункта программы в диалоге Установка и удаление программ. Это может быть полезно,
если программа является обновлением для уже установленного приложения и запись в этом диалоге не нужна, но надо сохранить возможность удаления обновления (Uninstallable=no).
Также при значении no UpdateUninstallLogAppName равно no.


Цитата:

Цитата Elka80
Всем привет!
Установил "Inno Setup 5.2.3 RU". Программа запустилось Анг. Как русс сделать? »

Вы имеете ввиду язык инсталятора или меню программы ?

Если язык инсталятора - то залазим в папку с установленной программой
C:\Program Files\Inno Setup 5\Languages\.. находим файл Russian.isl переименовываем в Default.isl и копируем его в C:\Program Files\Inno Setup 5\

Elka80 13-08-2009 22:41 1193136

FlatX007
Спасибо!


Вопрос: Как создать в C:\Documents and Settings\All Users\Главное меню\Программы. Добавит Удалить игру+ReadME+Настройки игры.?
С какой прогой Inno Setup (Компилятор) или ISTool и как?





Два дня голову ломаю, :( Надеюсь тут мне ответят.

Mihail88 13-08-2009 23:00 1193149

Elka80

[Icons]
Name: {group}\Удалить Игру; Filename: {uninstallexe}; WorkingDir: {app}
Name: {group}\Запустить Игру; Filename: {app}\Игра.exe; WorkingDir: {app}
Name: {group}\Readme; Filename: {app}\ReadmeFile.txt; WorkingDir: {app}

"{app}\Игра.exe" в зависимости где в папке с игрой находится пускавой exe файл или текстовой readme. у unreal tournament например в подкаталоге System пускавик "{app}\System\ut.exe"
____________________=)

To All

Добавил TRichEditViewer на первую страницу, как подгрузить ему файл RTF?
Хотел "InfoBefore.rtf" ему прописать, но низнаю как его в "стринги надели" :D.

горе код:
[Files]
Source: "Info.rtf"; DestDir: {tmp}; Flags: dontcopy noencryption

[code]

var
InfoMemo: TRichEditViewer;

procedure InitializeWizard();

var
RTFString: String;
begin
InfoMemo:= TRichEditViewer.Create(WizardForm);
with InfoMemo do
begin
Parent:= WizardForm.WelcomePage;
Left:= 175;
Top:= 10;
Width:= ScaleX(312);
Height:= ScaleY(293);
ReadOnly:= True
ScrollBars:= ssVertical
TabOrder:= 4
WantReturns:= False
UseRichEdit:= False
end;
end;
begin
ExtractTemporaryFile('Info.rtf')
LoadStringFromFile(ExpandConstant('{tmp}\Info.rtf'), RTFString)
WizardForm.WelcomePage.InfoMemo.RTFText := RTFString;
end;

Elka80 13-08-2009 23:22 1193163

Mihail88,
Спасибо!

У вас
Цитата:

Цитата Mihail88
[Icons]
Name: {group}\Удалить Игру; Filename: {uninstallexe}; WorkingDir: {app}
Name: {group}\Запустить Игру; Filename: {app}\Игра.exe; WorkingDir: {app}
Name: {group}\Readme; Filename: {app}\ReadmeFile.txt; WorkingDir: {app} »


У меня (создал)
[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon

Почему у меня так? не как у вас!

Mihail88 13-08-2009 23:35 1193178

Elka80

Могу только предполагать, может {#MyAppName} прописан как запускаемый файл, ищите в коде где он упоменается и на какой файл ровняется.

serg aka lain 14-08-2009 00:15 1193209

Цитата:

Цитата Mihail88
Добавил TRichEditViewer на первую страницу, как подгрузить ему файл RTF? »

можно так
читать дальше »

Код:

; Inno Setup Compiler 5.3.3(u)

[Setup]
AppName=My Program
AppVerName=My Program
OutputDir=userdocs:.
OutputBaseFilename=My Program
DefaultDirName={pf}\My Program

[Files]
Source: "Info.rtf"; DestDir: {tmp}; Flags: dontcopy noencryption;

код:
procedure InitializeWizard();
var
  MyInfo: TRichEditViewer;
  RTF: AnsiString;
begin
  ExtractTemporaryFile('Info.rtf');
  LoadStringFromFile(ExpandConstant('{tmp}\Info.rtf'), RTF);

  MyInfo := TRichEditViewer.Create(WizardForm);
  MyInfo.Parent:= WizardForm.WelcomePage;
  MyInfo.SetBounds(ScaleX(175), ScaleY(10), ScaleX(312), ScaleY(293));
  MyInfo.ScrollBars := ssVertical;
  MyInfo.ReadOnly := True;
  MyInfo.RTFText := RTF;
end;


Elka80 14-08-2009 00:50 1193221

Еще вопрос у меня все файлы Удалить игру+ReadME+Настройки игры в (D:\games\pes2009)

Name: {group}\setup.exe; Filename: {uninstallexe}; WorkingDir: {app} Удалить Игру
Name: {group}\pes2009.exe; Filename: {app}\Игра.exe; WorkingDir: {app} Запустить Игру
Name: {group}\ReadMe.txt; Filename: {app}\ReadmeFile.txt; WorkingDir: {app} » Readme

Я правильно написал?

boss911 14-08-2009 01:07 1193227

Цитата:

Цитата FlatX007
Если язык инсталятора - то залазим в папку с установленной программой
C:\Program Files\Inno Setup 5\Languages\.. находим файл Russian.isl переименовываем в Default.isl и копируем его в C:\Program Files\Inno Setup 5\ »

Пардон, а зачем такой изврат, если можно поступить более красивым способом - прописать это в самом скрипте:
Код:

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

Имя языка в 'Name', можно задать любое.

serg aka lain 14-08-2009 01:15 1193229

Elka80
правильно будет скорее так:

Name: "{group}\Удалить PES2009"; Filename: "{uninstallexe}"; Comment: "Удалить игру PES2009";
Name: "{group}\PES2009"; Filename: "{app}\pes2009.exe"; WorkingDir: "{app}"; Comment: "Запуск игры PES2009";
Name: "{group}\ReadMe"; Filename: "{app}\ReadmeFile.txt"; WorkingDir: "{app}"; Comment: "Прочитать файл ReadMe";

Elka80 14-08-2009 01:23 1193231

serg aka lain,
Спасибо щас проверю!

Elka80 14-08-2009 02:07 1193252

serg aka lain,
Спасибо еше раз, получилось, толко readmi не показывать (сам редми показывает, толко файл не показывает)

Цитата:

Цитата FlatX007
или меню программы ? »

Как?

FlatX007 14-08-2009 06:58 1193283

Цитата:

Цитата boss911
Пардон, а зачем такой изврат, если можно поступить более красивым способом - прописать это в самом скрипте: »

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

Цитата:

Цитата Elka80
или меню программы ? »
Как? »

Вот этого я незнаю, всегда сам пользовался английской оболочкой ... а что там сопсно непонятного ?

Цитата:

Цитата Elka80
толко readmi не показывать (сам редми показывает, толко файл не показывает) »

Это как так , 3 раза прочитал непонял ... :)

Mihail88 14-08-2009 08:34 1193312

Цитата:

Цитата Elka80
толко readmi не показывать (сам редми показывает, толко файл не показывает) »

Elka80
{app} - папка установки
ReadmeFile.txt - имя файла, запускаемый ярлыком

возможно у вас Readme.txt

Elka80 14-08-2009 14:21 1193546

Цитата:

Цитата Mihail88
возможно у вас Readme.txt »

Так и ест) Спс!

Serega 15-08-2009 00:18 1193897

Цитата:

Цитата zl0ybot
не мог бы вот это доделать? »

время будет по свободней - доделаю...

Цитата:

Цитата x-net
Скажите как это убрать? »

Я так понимаю, вы решили этот вопрос?

Цитата:

Цитата FlatX007
его единственная задача дополнить unins000.dat списком новых файлов, »

В скрипте в секции [Setup] запишите:
DirExistsWarning=no - не показывать сообщение о существовании папки;
UninstallLogMode=append - стоит по умолчанию, т.е. можно не указывать.
В секции [UninstallDelete]:
Name: {app}; Type: filesandordirs

Цитата:

Цитата Alfiks
Как заставить инсталяшку не оставлять след в установке-удалении программ »

В секции [Setup]:
Uninstallable=no
Цитата:

Цитата Alfiks
Встал вопрос с правами. При обновлении файла сбрасываются права на файл. Как их можно сохранить? »

Как понять обновление файла? В любом случае - это перезапись.
Цитата:

Цитата Alfiks
Нужно перед инсталляцией (обновлением) сделать бэкап файлов »

Не так давно этот вопрос уже обсуждался, поищите на предыдущих страницах...

p3rf3ct1c 16-08-2009 13:47 1194768

Inno Setup 5.3.4

Цитата:

5.3.4 (2009-08-15)

* On Windows 7 the Compiler IDE now displays a progress indicator on its taskbar button.
* Pascal Scripting: Documented function IDispatchInvoke, which can be used to access a COM Automation property or method whose name is a reserved word.
* Unicode Inno Setup fixes:
o [Registry] section entries with ValueType set to binary did not set the correct value.
o Pascal scripting: setting a COM Automation property or method parameter to a Unicode string variable caused an 'Invalid Type' error.
http://files.jrsoftware.org/ispack/ispack-5.3.4.exe

http://files.jrsoftware.org/ispack/i....4-unicode.exe

A1EXXX 18-08-2009 01:27 1196228

Русификатор для Inno Setup 5.3.4

http://vadimsva.ucoz.org/Inno_Setup_5_rus.7z

Содержит версии: cтандарт, ISPP (для 2х версий один файл), стандарт unicode, ISPP unicode (для 2х версий один файл, лежит в папке unicode).

aToVille 18-08-2009 08:21 1196338

есть ли restools (слева добавляется колонка и текст скрипта более нагляден) для новой версии? а то на их сайте по китайски ничего не понял :)

heNch1g 18-08-2009 14:00 1196607

Доброго времени суток. Я опять с вопросами :)

Задача:

на странице дополнительных компонентов нужна кнопка "Подхватить конфиг", при нажатии на которую вылезе стандартное окно выбора файла *.cfg, который в последующем будет копироваться в папку с программой под именем config.cfg.
Как вариант - сделать чекбокс, при включении которого появляется это самое окно, так думаю даже будет проще.

Как еще один вариант, сделать новую страницу, на которой будет та самая кнопка, рядом на лабеле - имя выбранного файла (хотя зачем?), и внизу - выдержки из этого файла. По структуре он в виде:
Код:

name "myname"
commanda_primer "9"

Как по замыслам - чтобы параметры name и sensetivity вместе со значениями считывались из файла и писались на лабелах пониже кнопки. Наглядно это реализовано в инсталляторе любого продукта касперского в момент выбора ключа)

Надеюсь на вашу помощь, я по вашим постам уже молюсь на вас) первый вариант предпочтительней, но второй для общего развития было бы неплохо)

Elka80 18-08-2009 18:08 1196826

Скажите, Что я не правильно сделал?


p3rf3ct1c 18-08-2009 19:06 1196869

Elka80, в вашей Akella Games папке наверно нет файлов

Serega 18-08-2009 19:50 1196888

Цитата:

Цитата aToVille
есть ли restools ... для новой версии? »

Самая последняя - InnoCompiler090506_English.zip, сделана на основе Inno Setup 5.2.3, но возможностей больше.

Цитата:

Цитата heNch1g
на странице дополнительных компонентов нужна кнопка "Подхватить конфиг", при нажатии на которую вылезе стандартное окно выбора файла *.cfg, который в последующем будет копироваться в папку с программой под именем config.cfg. »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Tasks]
Name: cfg; Description: Использовать ваш файл настроек; GroupDescription: Дополнительно:; Flags: unchecked

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Tasks: cfg

[UninstallDelete]
Name: {app}; Type: filesandordirs

[Code]
var
  str: string;
  btn: TButton;
  edt: TEdit;
  text1, text2: TNewstatictext;

procedure TasksListOnClick(Sender: TObject);
begin
  if IsTaskSelected('cfg') then
    begin
      btn.Enabled:= True;
      edt.Enabled:= True;
      edt.Color:= clWindow;
    end
  else
    begin
      btn.Enabled:= False;
      edt.Enabled:= False;
      edt.Color:= clBtnFace;
      edt.Clear;
    end;
end;

procedure btnOnClick(Sender: TObject);
var
  S: TArrayOfString;
  i: Integer;
begin
  if GetOpenFileName('', str, ExpandConstant('{srcexe}'), 'Файл настроек (*.cfg)|*.cfg', '') then
  if str <> '' then
    begin
      edt.Text:= str;
      if LoadStringsFromFile(str, S) then
        begin
          for i:= 0 to GetArrayLength(S)-1 do
            begin
              if Pos('name "myname"', S[i]) > 0 then
                text1.Caption:= 'Строка № ' + IntToStr(i)+ ': ' + S[i];
              if Pos('commanda_primer "9"', S[i]) > 0 then
                text2.Caption:= 'Строка № ' + IntToStr(i)+ ': ' + S[i];
            end;
        end;
    end;
end;

procedure InitializeWizard();
begin
  btn:= TButton.Create(WizardForm);
  with btn do
    begin
      SetBounds(330, 83, 75, 25);
      Caption:= 'Обзор';
      OnClick:= @btnOnClick;
      Enabled:= False;
      Parent:= WizardForm.SelectTasksPage;
    end;

  edt:= TEdit.Create(WizardForm);
  with edt do
    begin
      SetBounds(20, 85, 300, 23);
      Enabled:= False;
      Color:= clBtnFace;
      Parent:= WizardForm.SelectTasksPage;
    end;

  text1:= TNewstatictext.Create(WizardForm);
  with text1 do
    begin
      SetBounds(20, 110, 300, 23);
      AutoSize:= True;
      Parent:= WizardForm.SelectTasksPage;
    end;

  text2:= TNewstatictext.Create(WizardForm);
  with text2 do
    begin
      SetBounds(20, 130, 300, 23);
      AutoSize:= True;
      Parent:= WizardForm.SelectTasksPage;
    end;

  WizardForm.TasksList.OnClickCheck:= @TasksListOnClick;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID > wpInstalling then
    begin
      if IsTaskSelected('cfg') then
      if str <> '' then
        FileCopy(str, ExpandConstant('{app}\config.cfg'), False);
    end;
end;



Цитата:

Цитата heNch1g
Наглядно это реализовано в инсталляторе любого продукта касперского в момент выбора ключа) »

К сожалению, не видел...

heNch1g 19-08-2009 11:36 1197337

Serega, спасибо за скрипт, но есть вопросы:

1) Если уже запускал инсталлятор и выбрал галочку "подхватить", то при повторном запуске галочка уже стоит, а поле ввода - неактивно.
2) У меня страница Tasks забита под завязку, делать с прокруткой не катит. Можно ли перенести на другую страницу, которая активировалась бы при отмечании определённой задачи в секции Tasks?
3) Если выбрал конфиг, то путь к нему появляется в Edit'e. Но если убрать галочку "использовать ваш файл настроек" и включить опять, то поле очищается...а лучше бы если оставалось.
4) Я забыл раньше указать, но нужно чтобы инсталятор копировал файл не в корень папки, а в подпапку (в {app}\cstrike). Я изменил строчку
Код:

FileCopy(str, ExpandConstant('{app}\config.cfg'), False);
Изменил на {app}\cstrike\config.cfg, но он не копирует файл если папки cstrike нету.

Заранее огромное спасибо.

serg aka lain 19-08-2009 20:55 1197770

Цитата:

Цитата heNch1g
Изменил на {app}\cstrike\config.cfg, но он не копирует файл если папки cstrike нету.
Заранее огромное спасибо. »

Видимо, нужно её создать.
Код:

CreateDir(ExpandConstant('{app}\cstrike'));
FileCopy(str, ExpandConstant('{app}\cstrike\config.cfg'), False);


Serega 19-08-2009 21:22 1197786

Цитата:

Цитата heNch1g
но есть вопросы »

Попробуйте
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Tasks]
Name: cfg; Description: Использовать ваш файл настроек; GroupDescription: Дополнительно:; Flags: unchecked

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Tasks: cfg

[UninstallDelete]
Name: {app}; Type: filesandordirs

[Code]
var
  str: string;
  btn: TButton;
  edt: TEdit;
  lbl, lbl1, lbl2: TLabel;
  MainPage: TWizardPage;

procedure btnOnClick(Sender: TObject);
var
  S: TArrayOfString;
  i: Integer;
begin
  if GetOpenFileName('', str, ExpandConstant('{srcexe}'), 'Файл настроек (*.cfg)|*.cfg', '') then
  if str <> '' then
    begin
      edt.Text:= str;
      if LoadStringsFromFile(str, S) then
        begin
          lbl1.Caption:= '';
          lbl2.Caption:= '';
          for i:= 0 to GetArrayLength(S)-1 do
            begin
              if Pos('name "myname"', S[i]) > 0 then
                lbl1.Caption:= 'Строка № ' + IntToStr(i)+ ': ' + S[i];
              if Pos('commanda_primer "9"', S[i]) > 0 then
                lbl2.Caption:= 'Строка № ' + IntToStr(i)+ ': ' + S[i];
            end;
        end;
    end;
end;

procedure CreatePage;
begin
  MainPage:= CreateCustomPage(wpSelectTasks, 'Caption', 'Description');

  btn:= TButton.Create(MainPage);
  with btn do
    begin
      SetBounds(330, 83, 75, 25);
      Caption:= 'Обзор';
      OnClick:= @btnOnClick;
      Parent:= MainPage.Surface;
    end;

  edt:= TEdit.Create(MainPage);
  with edt do
    begin
      SetBounds(20, 85, 300, 23);
      Parent:= MainPage.Surface;
    end;

  lbl:= TLabel.Create(MainPage);
  with lbl do
    begin
      SetBounds(0, 30, 300, 80);
      AutoSize:= True;
      Caption:= 'бла-бла-бла...';
      Parent:= MainPage.Surface;
    end;

  lbl1:= TLabel.Create(MainPage);
  with lbl1 do
    begin
      SetBounds(20, 110, 300, 23);
      AutoSize:= True;
      Parent:= MainPage.Surface;
    end;

  lbl2:= TLabel.Create(MainPage);
  with lbl2 do
    begin
      SetBounds(20, 130, 300, 23);
      AutoSize:= True;
      Parent:= MainPage.Surface;
    end;
end;

procedure InitializeWizard();
begin
  CreatePage;
end;

function ShouldSkipPage(CurPage: Integer): Boolean;
begin
  if not IsTaskSelected('cfg') then
  if CurPage = MainPage.ID then Result:= True;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID > wpInstalling then
    begin
      if IsTaskSelected('cfg') then
      if str <> '' then
        begin
          if not DirExists(ExpandConstant('{app}\cstrike')) then
          CreateDir(ExpandConstant('{app}\cstrike'));
          FileCopy(str, ExpandConstant('{app}\cstrike\config.cfg'), False);
        end;
    end;
end;


kolobrodik 19-08-2009 21:41 1197795

Люди хелп!При компиляции выбивает ошибку вот на етом месте:
BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
BmpFile.SetBounds(0, 0, 497, 360);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.WelcomePage;
BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
BmpFile.SetBounds(0, 0, 497, 360);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.LicensePage;
BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp'));
BmpFile.SetBounds(0, 0, 497, 360);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.SelectDirPage;
BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\2.bmp'));
BmpFile.SetBounds(0, 0, 497, 360);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.InstallingPage;
BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp'));
BmpFile.SetBounds(0, 0, 497, 360);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.FinishedPage;
BmpFile:= TBitmapImage.Create(WizardForm);
Подскажите плз решение.

Serega 19-08-2009 22:05 1197811

Цитата:

Цитата kolobrodik
При компиляции выбивает ошибку »

Какую ошибку?
Предполагаю, что не при компиляции, а в момент запуска инсталлятора, следовательно, вы пытаетесь загрузить файл, которого нет.
В секции [Files] должно быть:
Код:

[Files]
Source: ..\1.bmp; DestDir: {tmp}

т.е. вы должны изначально извлечь файл 1.bmp в 'Temp', а потом уже пытаться его загрузить...

P.S.
Пользуйтесь тегами, а именно при показе скрипта, используйте [mоre][сode][/code][/more]

zl0ybot 19-08-2009 23:59 1197885

Hello all! вы не могли бы довести этот скрипт до ума и вставить freearc (в архиве скрипт, dl, video *.swf) надо бы так сделать :) жду вашего ответа http://rapidshare.com/files/266190726/1.7z.htm или хотя бы были надписи появились

BlackSelf 20-08-2009 01:18 1197952

zl0ybot, EagleSH делает инсталляторы не в инно, поэтому, кроме как вставить swf, которое перекроет все элементы, кроме кнопок и edit'ов, на wizardform, ничего не получится.

heNch1g 20-08-2009 06:04 1198024

Serg aka lain и Serega - большое вам спасибо, опять выручили!

boss911 22-08-2009 07:07 1199967

Inno Setup Unpacker

0.22 (20.08.2009)
  • Added support for Unicode versions
  • Added support for IS versions 5.3.0 - 5.3.4 (both ANSI and Unicode)
  • Fixed rare issue with double backslashes in file path
Скачать (108 Kb)

zl0ybot 22-08-2009 23:15 1200716

Все привет надо бы вот этот скрипт доделать
читать дальше »
[setup]
AppName=Hitman
AppVerName=Hitman
DefaultDirName={pf}\Hitman
OutputDir=.
WizardImageFile=WizardImageFile.bmp
WizardSmallImageFile=WizardSmallImageFile.bmp
DisableReadyPage=true
UninstallFilesDir={app}\Uninstall

[Languages]
Name: "ENG"; MessagesFile: "compiler:Default.isl"
Name: "RUS"; MessagesFile: "compiler:Languages\Russian.isl"

[Files]

Source: 3.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1.bmp; Flags: dontcopy;

[Run]
Filename: {src}\DirectX\dxsetup.exe; Parameters: /silent; StatusMsg: ExpandConstant('{cm:UP}'); Check: DirectX

[CustomMessages]
ENG.PAGE_CAPTION=Setup has finished installing Vin Diesel Wheelman on your computer.
RUS.PAGE_CAPTION=Программа Vin Diesel Wheelman установлена на Ваш компютер.
ENG.STR=Click Finish to exit Setup.
RUS.STR=Нажмите «Завершить», чтобы выйти из программы установки.
ENG.BUT=Install
RUS.BUT=Установить
ENG.SPACE=Available place on disk:
RUS.SPACE=Доступно места на диске:
ENG.SPACE1=Place is Required on disk:
RUS.SPACE1=Требуется места на диске:
ENG.DRT=Will Update DirectX
RUS.DRT=Обновить DirectX
ENG.UP=Goes the renovation DirectX...
RUS.UP=Идет обновление DirectX...
ENG.GB=GB
RUS.GB=Гб
[_CODE_]

var
Upload: TCheckBox;
bottom_img:TBitmapImage;
lblCheckBox, lblSelectDir, lblSelectDirBrowse: TLabel;
PageNameLabel, PageDescriptionLabel: TLabel;
WLabel1, WLabel2,
FLabel1, FLabel2, FLabel3: TLabel;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
BmpFile: TBitmapImage;

function DirectX: Boolean;
begin
Result:=Upload.Checked;
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ FloatToStr(round(FreeMB/1024*100)/100) + ExpandConstant(' {cm:GB}') else
FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True;
end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ FloatToStr(round(NeedSize/1024*100)/100) + ExpandConstant(' {cm:GB}') else
NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ IntToStr(NeedSize)+ ' MB';
end;

// задал процедуру, чтоб отмечался чебокс еси кликнуть по надписи lblCheckBox
procedure lblCheckBoxOnClick(Sender: TObject);
begin
if Upload.Checked = False then
Upload.Checked:= True else
Upload.Checked:= False;
end;

procedure InitializeWizard();
begin
WizardForm.FileNameLabel.Visible:= False;
ExtractTemporaryFile('1.bmp');
ExtractTemporaryFile('3.bmp');

NeedSize:= 7000;

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
BmpFile.Width:= ScaleX(497);
BmpFile.Height:= ScaleY(252);
BmpFile.Parent:= WizardForm.SelectDirPage;


bottom_img:= TBitmapImage.Create(WizardForm);
bottom_img.Bitmap.LoadFromFile(ExpandConstant('{tmp}\3.bmp'));
{первые 2 параметра - координаты левогого верхнего угла по горизонтали и вертикали, дальше ширина и высота,
до которой растянуть}
bottom_img.SetBounds(0, 315, 497, 48);
bottom_img.Parent:= WizardForm;
bottom_img.Stretch:= True;

with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
WelcomeLabel1.Hide;
WelcomeLabel2.Hide;
DiskSpaceLabel.Hide;
SelectDirBitmapImage.Hide;
SelectDirBrowseLabel.Hide;
SelectDirLabel.Hide;
FinishedHeadingLabel.Hide;
FinishedLabel.Hide;

DirBrowseButton.Left:= DirBrowseButton.Left + ScaleX(40);
DirBrowseButton.Top:= DirBrowseButton.Top + ScaleY(12);
DirEdit.Left:= DirEdit.Left + ScaleX(40);
DirEdit.Top:= DirEdit.Top + ScaleY(12);

WizardBitmapImage.Width:= 497;
WizardBitmapImage.Height:= 314;
WizardBitmapImage2.Width:= 497;
WizardBitmapImage2.Height:= 314;
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left:= Mainpanel.Left;
Top:= Mainpanel.Top;
Width:= Mainpanel.Width;
Height:= MainPanel.Height;
end;
end;
end;

WLabel1:= TLabel.Create(WizardForm);
with WLabel1 do
begin
Left:= ScaleX(176);
Top:= ScaleY(16);
Width:= ScaleX(301);
Height:= ScaleY(54);
AutoSize:= False;
WordWrap:= True;
Font.Size:= 12;
Font.Style:= [fsBold];
Font.Color:= clwhite;
ShowAccelChar:= False;
Caption:= WizardForm.WelcomeLabel1.Caption;
Transparent:= True;
Parent:= WizardForm.WelcomePage;
end;

WLabel2:=TLabel.Create(WizardForm);
with WLabel2 do
begin
Top:= ScaleY(76);
Left:= ScaleX(176);
Width:= ScaleX(301);
Height:= ScaleY(234);
AutoSize:= False;
WordWrap:= True;
Font.Color:= clWhite;
ShowAccelChar:= False;
Caption:= WizardForm.WelcomeLabel2.Caption;
Transparent:= True;
Parent:= WizardForm.WelcomePage;
end;

FLabel1:= TLabel.Create(WizardForm);
with FLabel1 do
begin
Left:= ScaleX(176);
Top:= ScaleY(16);
Width:= ScaleX(301);
Height:= ScaleY(54);
AutoSize:= False;
WordWrap:= True;
Font.Size:= 12;
Font.Style:= [fsBold];
Font.Color:= clWhite;
ShowAccelChar:= False;
Caption:= WizardForm.FinishedHeadingLabel.Caption;
Transparent:= True;
Parent:= WizardForm.FinishedPage;
end;

FLabel2:=TLabel.Create(WizardForm);
with FLabel2 do
begin
Top:= ScaleY(76);
Left:= ScaleX(176);
Width:= ScaleX(301);
Height:= ScaleY(53);
AutoSize:= False;
WordWrap:= True;
Font.Color:= clWhite;
ShowAccelChar:= False;
Caption:= ExpandConstant('{cm:PAGE_CAPTION}');
Transparent:= True;
Parent:= WizardForm.FinishedPage;
end;

FLabel3 :=TLabel.Create(WizardForm);
with FLabel3 do
begin
Top := ScaleY(110);
Left := ScaleX(176);
Width := ScaleX(301);
Height := ScaleY(53);
AutoSize := False;
WordWrap := True;
Font.Color:= clblack;
ShowAccelChar := False;
Caption := ExpandConstant('{cm:STR}');
Transparent := True;
Parent := WizardForm.FinishedPage;
end;

// уменьшил размер CheckBox'а, по другому никак
Upload:= TCheckBox.Create(WizardForm);
with Upload do
begin
Parent:= WizardForm.SelectDirPage;
Left:= WizardForm.DirEdit.Left;
Top:= WizardForm.DirEdit.Top + 35;
Width:= ScaleX(14);
Height:= ScaleY(14);
TabOrder:= 0;
Checked:= False;
end;

// создаём надпись для CheckBox'а
lblCheckBox:= TLabel.Create(WizardForm);
with lblCheckBox do
begin
Caption:= ExpandConstant('{cm:DRT}');
Left:= WizardForm.DirEdit.Left + 20;
Top:= WizardForm.DirEdit.Top + 35;
Width:= ScaleX(150);
Height:= ScaleY(13);
Transparent := True;
Parent:= WizardForm.SelectDirPage;
OnClick:= @lblCheckBoxOnClick;
end;

// создаём lblSelectDir
lblSelectDir:= TLabel.Create(WizardForm);
with lblSelectDir do
begin
Caption:= WizardForm.SelectDirLabel.Caption;
Left:= ScaleX(40);
Top:= WizardForm.SelectDirLabel.Top + ScaleY(12);
Width:= WizardForm.SelectDirLabel.Width;
Height:= WizardForm.SelectDirLabel.Height;
Transparent := True;
Parent:= WizardForm.SelectDirPage;
end;

// создаём lblSelectDirBrowse
lblSelectDirBrowse:= TLabel.Create(WizardForm);
with lblSelectDirBrowse do
begin
Caption:= WizardForm.SelectDirBrowseLabel.Caption;
Left:= ScaleX(40);
Top:= WizardForm.SelectDirBrowseLabel.Top + ScaleY(12);
Width:= WizardForm.SelectDirBrowseLabel.Width;
Height:= WizardForm.SelectDirBrowseLabel.Height;
WordWrap:= True;
Transparent:= True;
Parent:= WizardForm.SelectDirPage;
end;

NeedSpaceLabel:= TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent:= WizardForm.SelectDirPage;
Left:= WizardForm.DirEdit.Left;
Top:= ScaleY(202);
Width:= ScaleX(209);
Height:= ScaleY(13);
Transparent:= True;
end;

FreeSpaceLabel:= TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent:= WizardForm.SelectDirPage;
Left:= WizardForm.DirEdit.Left;
Top:= ScaleY(220);
Width:= ScaleX(209);
Height:= ScaleY(13);
Transparent:= True;
end;

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;

PageNameLabel:= TLabel.Create(WizardForm);
with PageNameLabel do
begin
Left:= ScaleX(10);
Top:= ScaleY(10);
Width:= ScaleX(300);
Height:= ScaleY(14);
AutoSize:= False;
WordWrap:= True;
Font.Color:= clblack;
Font.Style:= [fsBold];
Transparent:= True;
Parent:= WizardForm.MainPanel;
end;

PageDescriptionLabel:= TLabel.Create(WizardForm);
with PageDescriptionLabel do
begin
Left:= ScaleX(15);
Top:= ScaleY(25);
Width:= ScaleX(475);
Height:= ScaleY(30);
AutoSize:= False;
WordWrap:= True;
Font.Color:= clblack;
Transparent:= True;
Parent:= WizardForm.MainPanel;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;
if CurPageID = wpSelectDir then
begin
WizardForm.NextButton.Caption:= ExpandConstant('{cm:BUT}');
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False;
with WizardForm do
begin
InnerNotebook.Left := ScaleX(0);
InnerNotebook.Top := ScaleY(60);
InnerNotebook.Width := ScaleX(497);
InnerNotebook.Height := ScaleY(252)
end;
end;
if CurPageID = wpInstalling then
begin
with WizardForm do
begin
BmpFile.Parent:= WizardForm.InstallingPage;
ProgressGauge.Left:= 20;
ProgressGauge.Top:= 160;
ProgressGauge.Width:= 215;
ProgressGauge.Height:= 20;
end;
end;
end;
вот не достататки а патом все соединить с этим скриптом
читать дальше »
#define MainExe "{app}\Smersh.exe"
#define GDFBinary "{app}\Smersh.exe"

[Setup]
AppName=Смерть шпионам.Момент истины
AppVerName=Смерть шпионам.Момент истины
DefaultDirName={pf}\Смерть шпионам.Момент истины
OutputDir=Output
Compression=none
DisableReadyPage=true
InternalCompressLevel=ultra64
SolidCompression=true
ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64 x86
RestartIfNeededByRun=false
UsePreviousAppDir=false
DirExistsWarning=no
DisableProgramGroupPage=true
DefaultGroupName=Bully
UsePreviousGroup=false
UsePreviousSetupType=false
UsePreviousTasks=false
UninstallFilesDir={app}\Uninstall
[Files]
Source: arc.exe; DestDir: {tmp}; Flags: dontcopy
Source: GameuxInstallHelper.dll; DestDir: {app}\Uninstall; Flags: overwritereadonly ignoreversion
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Messages]
SelectDirBrowseLabel=Нажмите «Установить», чтобы начать установку. Если Вы хотите выбрать другую папку, нажмите «Обзор».
[LangOptions]
WelcomeFontName=Tahoma
WelcomeFontSize=11

[Registry]
Root: HKLM; SubKey: SOFTWARE\1C\{{E07CEDD1-108A-4304-B820-EAFF5D37F5F0}; ValueType: string; ValueName: InstallDir; ValueData: {app}\
Root: HKLM; SubKey: SOFTWARE\1C\{{E07CEDD1-108A-4304-B820-EAFF5D37F5F0}; ValueType: string; ValueName: AppFile; ValueData: {app}\SmershAddon.exe
Root: HKLM; SubKey: SOFTWARE\1C\{{E07CEDD1-108A-4304-B820-EAFF5D37F5F0}; ValueType: string; ValueName: AppVersion; ValueData: 1.0.0.0

[Run]
Filename: {app}\Smersh.exe; WorkingDir: {app}\; Description: Начать игру; Flags: postinstall
Filename: {src}\DirectX\DXSETUP.exe; Parameters: /silent; StatusMsg: Обновление:Microsoft DirectX 9.0c...; Check: InstallDirectX
Filename: {src}\Redistributables\vcredist_x86.exe; Parameters: "/q:a /c:""VCREDI~3.EXE /q:a /c:""""msiexec /i vcredist.msi /qn"""" """; StatusMsg: Обновление:Microsoft Visual C++ 2005...; Check: InstallDirectX

[Icons]
Name: {group}\Играть; Filename: {app}\Smersh.exe; WorkingDir: {app}\
Name: {group}\Настроить игру; Filename: {app}\SmershSetup.exe; WorkingDir: {app}\
Name: {group}\Удалить игру; Filename: {uninstallexe}
Name: {commondesktop}\Смерть шпионам.Момент истины; Filename: {app}\Smersh.exe; WorkingDir: {app}\; Check: MakeDesktopIcon

[UninstallDelete]
Name: {app}\*; Type: filesandordirs

[_Code_]
type
TGUID = record
Data1: Cardinal;
Data2,
Data3: Word;
Data4: array [0..8] of char;
end;

function GenerateGUID(var GUID: TGUID): Cardinal; external 'GenerateGUID@files:GameuxInstallHelper.dll stdcall setuponly';
function AddToGameExplorer(Binary: String; Path: String; InstallType: Integer; var GUID: TGUID): Cardinal; external 'AddToGameExplorerA@files:GameuxInstallHelper.dll stdcall setuponly';
function CreateTask(InstallType: Integer; var GUID: TGUID; TaskType: Integer; TaskNumber: Integer; TaskName: String; Binary: String; Parameters: String): Cardinal; external 'CreateTaskA@files:GameuxInstallHelper.dll stdcall setuponly';
function RetrieveGUIDForApplication(Binary: String; var GUID: TGUID): Cardinal; external 'RetrieveGUIDForApplicationA@{app}\Uninstall\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveFromGameExplorer(var GUID: TGUID): Cardinal; external 'RemoveFromGameExplorer@{app}\Uninstall\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveTasks(var GUID: TGUID): Cardinal; external 'RemoveTasks@{app}\Uninstall\GameuxInstallHelper.dll stdcall uninstallonly';

const
PlayTask = 0;
SupportTask = 1;

var
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
DesktopIcon, DirectX: TCheckBox;
GUID: TGUID;
ProgressBar1: TNewProgressBar;
/////Вычисление свободного места на диске
procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure animateprogress;
begin ProgressBar1.Position := ProgressBar1.Position+1
end;

procedure GetNeedSpaceCaption; /////Вычисление требуемого места для установки
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';end;

function MakeDesktopIcon: Boolean;
begin
Result:=DesktopIcon.Checked;end;

function InstallDirectX: Boolean;
begin
Result:=DirectX.Checked;end;

procedure InitializeWizard();
begin
begin
NeedSize := 3210; //Здесь указывается место для приложения
WizardForm.DiskSpaceLabel.Hide;
WizardForm.FilenameLabel.Hide;
WizardForm.ProgressGauge.Top:=ScaleY(100); //Изменение стандартного прогрессбара
WizardForm.ProgressGauge.Width:=262; //
WizardForm.ProgressGauge.Left:=155; //
WizardForm.StatusLabel.Top:=ScaleY(80);
WizardForm.WelcomeLabel2.Top:=ScaleY(90);
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;
end;
FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
begin //Создание чекбокса для создания ярлыка на рабочем столе
DesktopIcon := TCheckBox.Create(WizardForm);
with DesktopIcon do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Добавить ярлык на Рабочий стол';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top+35;
Width := ScaleX(400);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;
begin //Создание чекбокса для установки DirectX
DirectX := TCheckBox.Create(WizardForm);
with DirectX do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Установить дополнительное программное обеспечение';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top+55;
Width := ScaleX(400);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;
begin ///Создание нового прогрессбара
ProgressBar1 := TNewProgressBar.Create(wizardform);
with ProgressBar1 do
begin
Parent := wizardform.installingpage;
Top := 100
Width := 150;
Height := wizardform.progressgauge.height;
Max :=3; //кол-во архивов
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
begin
if CurPageID=wpSelectDir then
begin //Тут если Свободное место на диске < требуемого то кнопка "Установвить" на PageSelectDir неактивна
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
WizardForm.NextButton.Caption:='Установить'; //Rename кнопки "Далее" на SelectDir
end;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep); ///Регистрация в GameExplorer
var
Binary, MainExe: String;
ResultCode:Integer;
begin
if CurStep = ssInstall then //Перед установкой
begin
GenerateGUID(GUID);
ExtractTemporaryFile('arc.exe'); //Извлечение Arc.exe в Temp
if (FileExists(AddBackslash(ExpandConstant('{tmp}')) + 'arc.exe')) and (FileExists(AddBackslash(ExpandConstant('{src}')) + 'data-a.bin')) then
begin
WizardForm.StatusLabel.Caption:='Распаковка файлов...'; //Извлечение из 1-го архива
Exec(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(ExpandConstant('{src}\data-a.bin'))+' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
ProgressBar1.Position := ProgressBar1.Position+1

WizardForm.StatusLabel.Caption:='Распаковка файлов...'; //Извлечение из 2-го архива
Exec(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(ExpandConstant('{src}\data-b.bin'))+' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
ProgressBar1.Position := ProgressBar1.Position+1

WizardForm.StatusLabel.Caption:='Распаковка файлов...'; //Извлечение из 3-го архива
Exec(ExpandConstant('{tmp}\Arc.exe'), 'x '+AddQuotes(ExpandConstant('{src}\data-c.bin'))+' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
ProgressBar1.Position := ProgressBar1.Position+1

end else begin
MsgBox('Исполняемый файл:' + #13#10#13#10 + (AddBackslash(ExpandConstant('{tmp}')) + 'arc.exe') + #13#10#13#10 + 'не найден. Установка отменена', mbInformation, MB_OK);
Abort;
end;
end;
if CurStep = ssPostInstall then
begin
Binary:=ExpandConstant('{#GDFBinary}');
MainExe:=ExpandConstant('{#MainExe}');
AddToGameExplorer(Binary, ExpandConstant('{app}'), 3, GUID);
CreateTask(3, GUID, PlayTask, 0, 'Play', MainExe, '');
end;
end;

function InitializeSetup(): Boolean;
var
UnStr: String;
ErrorCode, Mesages: Integer;
begin //Повторный запуск
Result := True;
if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Smersh2_is1', 'UninstallString', UnStr) then
begin
If UnStr <> '' then
begin
Mesages := MsgBox('Смерть шпионам.Момент истины уже установлена в Вашей системе.'+#10#10+'Хотите удалить приложение?', mbInformation, MB_YESNOCANCEL);
case Mesages of
idYes:
begin
UnStr := RemoveQuotes(UnStr);
Exec(UnStr, '/silent', '', SW_Show, ewWaitUntilTerminated, ErrorCode);
Result := True;
end
idNo:
begin
Result := True;
end
idCancel:
begin
Result := False;
end;
end;
end;
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
ResultStr:String;
Binary: String;
GUID: TGUID;
begin /////////////////////////////////////////Удаление игровых сохранений
if CurUninstallStep=usPostUninstall then
begin
RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Smersh2_is1', 'UnInstConfirm', ResultStr)
if DirExists(ExpandConstant('{userdocs}')+'\smersh') then
if MsgBox('Удалить сохраненные игры и настройки?',mbconfirmation, mb_YesNo) = IDYES then
begin
if not DelTree(ExpandConstant('{userdocs}')+'\Smersh', True, True, True)
then
MsgBox('Папка не удалена!' #13#13 'Папка не существует или задействована.', mbError, MB_OK);
end;
end;
begin
if CurUninstallStep=usUninstall then //Удаление из GameExplorer
begin
Binary:=ExpandConstant('{#GDFBinary}');
RetrieveGUIDForApplication(Binary, GUID);
RemoveFromGameExplorer(GUID);
RemoveTasks(GUID);
UnloadDll(ExpandConstant('{app}\Uninstall\GameuxInstallHelper.dll'));
end;
end;
end;
через joins script ни как

evgenik123456 23-08-2009 13:03 1201000

нужна помощь! хочу записать игровой файл но так записать чтобы путь брался из реестра,а вот мой код:
[Setup]
AppName=3My Program
AppVerName=My Program version 1.4
DefaultDirName={reg:HKLM\SOFTWARE\Wow6432Node\Electronic Arts\SPORE,DataDir|\default_dir_name}\My Program
DefaultGroupName=My Program


запускаю установку: и вот что происходит там где должен путь игры вот такая фигня:
C:\Program Files (x86)\Inno Setup 5\Examples\Output\"f:\Program Files (x86)\Electronic Arts\SPORE\Data\"\My Program

сама игра находится f:\Program Files (x86)\Electronic Arts\SPORE\Data\
тоесть путь должен быть только этот а почемуто впереди C:\Program Files (x86)\Inno Setup 5\Examples\Output\ а потом идет путь что я делаю не так помогите

serg aka lain 23-08-2009 13:51 1201040

Цитата:

Цитата evgenik123456
что я делаю не так помогите »

возможно, так:
Код:

DefaultDirName={reg:HKLM\Software\Electronic Arts\SPORE,DataDir|{pf}\My Program}

evgenik123456 23-08-2009 14:08 1201056

нет не вышло по такому пути в реестре записей нет, проблема в том что сначало идет путь а потом в кавычках второй путь вот так
C:\Program Files (x86)\Inno Setup 5\Examples\Output\"f:\Program Files (x86)\Electronic Arts\SPORE\Data\"\My Program в одну строку

serg aka lain 23-08-2009 14:30 1201077

Цитата:

Цитата evgenik123456
нет не вышло по такому пути в реестре записей нет »

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

З.Ы. Ну, и я не знаю какой точно ключ содержит путь к папке с игрой, вот и предположил;
{reg:HKLM\Software\Electronic Arts\SPORE,DataDir|{pf}\My Program}, если ключа "HKLM\Software\Electronic Arts\SPORE" valuetype: DataDir - нет,
то по умолчанию путь будет "{pf}\My Program"

evgenik123456 23-08-2009 14:43 1201090

а по другому как нибуть можно? чтобы инсталяция как нибуть нашла эту папку с игрой

serg aka lain 23-08-2009 15:17 1201116

Цитата:

Цитата evgenik123456
а по другому как нибуть можно? »

Так какой ключ содержит путь к папке? DataDir или какой ... ?

evgenik123456 23-08-2009 15:25 1201124

DataDir

serg aka lain 23-08-2009 15:38 1201132

evgenik123456,
Сейчас специально создал в реестре ключ
Код:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Electronic Arts\SPORE  "DataDir=C:\Games\Spore"
и вот этот код прекрасно всё находит
Код:

; Inno Setup Compiler 5.3.4(u)

[Setup]
AppName=My Program
AppVerName=My Program 1.4
DefaultDirName={reg:HKLM\Software\Electronic Arts\SPORE,DataDir|{pf}\My Program}
AppendDefaultDirName=False
OutputDir=userdocs:My Program.


evgenik123456 23-08-2009 16:02 1201152

Цитата:

Цитата serg aka lain
и вот этот код прекрасно всё находит »

у меня наверное ino setup глюченый неполучается а сам шаблон скинуть сможеш?

serg aka lain 23-08-2009 16:15 1201162

Вложений: 1
Цитата:

Цитата evgenik123456
шаблон скинуть сможеш? »


evgenik123456 23-08-2009 16:23 1201168

а у тебя работоет? я имею в виду с путём назначения всё в порядке! значит уменя какойто глюк?

serg aka lain 23-08-2009 16:30 1201175

Цитата:

Цитата evgenik123456
а у тебя работоет? я имею в виду с путём назначения всё в порядке! »

именно этот код - работает.

evgenik123456 23-08-2009 16:40 1201183

может с ino setup проблемы

serg aka lain 23-08-2009 17:39 1201240

evgenik123456,
Можно ещё и так
Код:


; Inno Setup Compiler 5.3.4(u)

[Setup]
AppName=Spore
AppVerName=Spore
DefaultDirName={code:GetInstallDataDir}
AppendDefaultDirName=False
ShowLanguageDialog=auto
OutputDir=userdocs:Spore.


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

[code]

function GetInstallDataDir(InstallDataDir: String): String;
begin
  RegQueryStringValue(HKLM, 'Software\Electronic Arts\SPORE', 'DataDir', InstallDataDir);
  if InstallDataDir <> '' then
    Result := InstallDataDir
  else
    Result := AddBackSlash(ExpandConstant('{pf}\Spore'));
end;

Что есть тоже самое, что и
Код:

DefaultDirName={reg:HKLM\Software\Electronic Arts\SPORE,DataDir|{pf}\My Program}

BlackSelf 23-08-2009 18:41 1201294

evgenik123456, чуть-чуть изменил вариант serg aka lain. Попробуйте:
читать дальше »
Код:

[Setup]
AppName=Spore
AppVerName=Spore
DefaultDirName={code:GetInstallDataDir}
AppendDefaultDirName=False
ShowLanguageDialog=auto
OutputDir=.


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

[_Code]

function GetInstallDataDir(InstallDataDir: String): String;
begin
  RegQueryStringValue(HKLM, 'Software\Electronic Arts\SPORE', 'DataDir', InstallDataDir);
  if InstallDataDir <> '' then
    Result := RemoveQuotes(InstallDataDir)
  else
    Result := AddBackSlash(ExpandConstant('{pf}\Spore'));
end;


serg aka lain 23-08-2009 19:02 1201312

BlackSelf,
Так RemoveQuotes(); нужна чтобы кавычки в пути (значении ключа убрать),
обычно их в этой ветке не замечал, но в принципе пускай будет
Result := RemoveQuotes(InstallDataDir), не помешает.

BlackSelf 23-08-2009 19:07 1201316

serg aka lain, просто мне кажется, что подобная проблема:
C:\Program Files (x86)\Inno Setup 5\Examples\Output\"f:\Program Files (x86)\Electronic Arts\SPORE\Data\"
получается из-за того, что путь в реестре заключен в кавычки.

serg aka lain 23-08-2009 19:16 1201326

BlackSelf, возможно, но по умолчанию не видел, чтобы с кавычками было,
как уже и говорил Result := RemoveQuotes(InstallDataDir), не помешает.

Serega 23-08-2009 19:37 1201343

Цитата:

Цитата evgenik123456
может с ino setup проблемы »

Нет.
Экспортируйте свой ключ в рег файл и покажите его.

Цитата:

Цитата serg aka lain
но по умолчанию не видел, чтобы с кавычками было, »

serg aka lain, дело в том, что инсталляторы делают люди, ну а в коком виде его туда занесут в таком и будет :) ...
Мне попадались такие, но если экспортировать ключ в рег файл, то строковой параметр обязательно будет в кавычках.

volk1234 23-08-2009 20:13 1201370

Лимит страниц.
Тема закрыта.
продолжаем тут:

Inno Setup. Обсуждение установщика

Скрипты Inno Setup. Помощь и советы


Время: 16:42.

Время: 16:42.
© OSzone.net 2001-