Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]
5) Снова ярлыки. Можно изменить иконку ярлыка?
[Icons]
Name: "{group}\{#MyAppName} Help"; Filename: "{app}\{#MyAppHelpName}"; IconFilename: "{app}\Help.ico";
vk_k14m@vk,
3)
4)
[Components]
Name: Russification; Description: Russification; Flags: exclusive
Name: Anticensor; Description: Anticensor; Flags: exclusive
Name: Anticensor\MKIII; Description: MKIII; Flags: exclusive
Name: Anticensor\SVII; Description: SVII; Flags: exclusive
[Icons]
Name: {userdesktop}\Название игры; Components: Russification; Filename: {app}\AA2Play.exe; Workingdir: {app}
Name: {userdesktop}\Название игры; Components: Anticensor\MKIII; Filename: {app}\illusion_locale_loader.exe; Parameters: "/MKIII"; Workingdir: {app}
Name: {userdesktop}\Название игры; Components: Anticensor\SVII; Filename: {app}\illusion_locale_loader.exe; Parameters: "/SVII"; Workingdir: {app}
Ну как-то так.
El Sanchez
04-10-2017, 21:43
65 гигов для теста. Дорогое удовольствие »
vk_k14m@vk, мне для тестов хватило 23 Кб.
Это ты меня просишь список папок показать? Ладно держи. »
vk_k14m@vk, угу, папок, а пришел список файлов. Ну да ладно.
К слову в *.рр архивы будут запакованы все папки которые начинаются на data\jg2... »
vk_k14m@vk, я прекрасно понимаю чего вам нужно и как оно работает. В общем, AA2Decrypt_fix.exe перенесите в папку 0 Delete after install, все остальное в ней не нужно:
[Components]
Name: "Main"; Description: "Artificial Academy 2"; Types: full compact custom; Flags: fixed
Name: "Anticensor"; Description: "Антицензор"; Types: full custom
Name: "Anticensor\MKIII"; Description: "МКIII"; Types: full custom; Flags: exclusive
Name: "Anticensor\MKIII\clothes"; Description: "Пак одежды для MKIII анцензора"; Types: full custom; Flags: exclusive
Name: "Anticensor\MKIII\clothes\garter_belt"; Description: "Аддон на подвязки"; Types: full custom;
Name: "Anticensor\SVII"; Description: "SVII"; Types: full custom; Flags: exclusive
Name: "Anticensor\SVII\clothes"; Description: "Пак одежды для SVII анцензора"; Types: full custom; Flags: exclusive
Name: "Anticensor\SVII\clothes\texture"; Description: "Пак текстур для одежды"; Types: full custom;
Name: "Anticensor\SVII\clothes\extra_a"; Description: "Extra A пак одежды для SVII анцензора"; Types: full custom
Name: "Anticensor\SVII\clothes\extra_a\texture"; Description: "Пак текстур для одежды Extra A"; Types: full custom
Name: "Anticensor\SVII\clothes\extra_h5"; Description: "Extra H5 пак одежды для SVII анцензора"; Types: full custom
Name: "Anticensor\SVII\clothes\extra_h5\texture"; Description: "Пак текстур для одежды Extra H5"; Types: full custom
Name: "Anticensor\SVII\clothes\garter_belt"; Description: "Аддон на подвязки"; Types: full custom
Name: "Hairpack"; Description: "Пак дополнительных причесок"; Types: full custom
Name: "Override"; Description: "Пак дополнительных лиц и причесок"; Types: full custom
Name: "Russification"; Description: "Русификатор"; Types: full custom
Name: "Russification\Hlimitation_yes"; Description: "Ограничение H-сцен"; Types: full custom; Flags: exclusive
Name: "Russification\Hlimitation_no"; Description: "Без ограничения"; Types: full custom; Flags: exclusive
Name: "ProgramFiles"; Description: "Дополнительные приложения"; Types: full custom
Name: "ProgramFiles\AA2Install"; Description: "AA2Install"; Types: full custom
Name: "ProgramFiles\ReiEditAA2"; Description: "ReiEditAA2"; Types: full custom
Name: "ProgramFiles\AA2Face"; Description: "AA2Face"; Types: full custom
[Files]
Source: "D:\Inno Setup\Installer\0 Delete after install\AA2Decrypt_fix.exe"; DestDir: {tmp}; Flags: deleteafterinstall
Source: "D:\Inno Setup\Installer\1 Artificial Academy 2\Artificial Academy 2\*"; DestDir: "{app}"; Components: Main; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: "D:\Inno Setup\Installer\2a [AA2][Uncensor][3D MK-III][FA][v2.0][Various]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\MKIII; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\2a1 [AA2][HEXA Clothing Collection][MK-III][v5.2][Various]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\MKIII\clothes; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\2a2 [AA2][HEXACC][Garter Belt][v1.5][Various]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\MKIII\clothes\garter_belt; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\2b [AA2][SVII Uncensor][3D Pubes][All-In-One][v1.6]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\SVII; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\2b1 [AA2][SVII Clothing Collection][3D Pubes][v5.0]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\SVII\clothes; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\2b1a SVII Clothing Collection - Texture Pack v5.0\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\SVII\clothes\texture; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\2b2 [AA2][SVII Clothing Collection][Extra A][3D Pubes][v1.2.1]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\SVII\clothes\extra_a; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\2b2a SVII Clothing Collection - Extra A - Texture Pack v1.2\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\SVII\clothes\extra_a\texture; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\2b3 [AA2][SVII Clothing Collection][Extra H5][Uncensored][v1.0]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\SVII\clothes\extra_h5; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\2b3a SVII Clothing Collection - Extra H5 - Texture Pack v1.0\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\SVII\clothes\extra_h5\texture; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\2b4 [AA2][SVII Clothing Collection][Garter Belt][v1.5]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Anticensor\SVII\clothes\garter_belt; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\3 [AA2][HEXA Hairpack][RE][v3.0][Various]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Hairpack; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\4 [AA2][HEXA Override Collection][v3.5][Various]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Override; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\5a [AA2][Interface][Russian user interface v.1][AVA]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Russification; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\5b [AA2][Interface][Russian user interface v.5][AVA]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Russification and Anticensor; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\5ba [AA2][Interface][Russian user interface v.5][AVA]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Russification and Anticensor\MKIII; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\5bb [AA2][Interface][Russian user interface v.5][AVA]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Russification and Anticensor\SVII; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\5bxa [AA2][Interface][Russian user interface v.5][AVA]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Russification\Hlimitation_yes and Anticensor; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\5bxb [AA2][Interface][Russian user interface v.5][AVA]\Artificial Academy 2\*"; DestDir: "{app}"; Components: Russification\Hlimitation_no and Anticensor; Attribs: readonly; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak overwritereadonly
Source: "D:\Inno Setup\Installer\AA2Install v7 b3.1\Artificial Academy 2\*"; DestDir: "{app}"; Components: ProgramFiles\AA2Install; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak
Source: "D:\Inno Setup\Installer\ReiEditAA2 0.9.5.3b\Artificial Academy 2\*"; DestDir: "{app}"; Components: ProgramFiles\ReiEditAA2; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak
Source: "D:\Inno Setup\Installer\SVII Clothing Collection - ReiEdit v5.0\Artificial Academy 2\*"; DestDir: "{app}"; Components: ProgramFiles\ReiEditAA2 and Anticensor\SVII; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak
Source: "D:\Inno Setup\Installer\HEXA Override Collection - ReiEdit\Artificial Academy 2\*"; DestDir: "{app}"; Components: ProgramFiles\ReiEditAA2 and Override; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak
Source: "D:\Inno Setup\Installer\AA2Face 1.4.2\Artificial Academy 2\*"; DestDir: "{app}"; Components: ProgramFiles\AA2Face; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak
[Run]
Filename: {cmd}; Parameters: "/c for /d %? in (jg2*) do ""{tmp}\AA2Decrypt_fix.exe"" ""%?.pp"""; WorkingDir: {app}\data; StatusMsg: "Распаковка pp-файлов"; Components: Anticensor Hairpack Override Russification; Flags: runhidden
Filename: {cmd}; Parameters: "/c for /d %? in (jg2*) do attrib -r ""%?\*"" /s"; WorkingDir: {app}\data; StatusMsg: "Снятие атрибута R c файлов"; Components: Anticensor Hairpack Override Russification; Flags: runhidden
Filename: {cmd}; Parameters: "/c for /d %? in (jg2*) do del /f /q ""%?.pp"""; WorkingDir: {app}\data; StatusMsg: "Удаление pp-файлов"; Components: Anticensor Hairpack Override Russification; Flags: runhidden
Filename: {cmd}; Parameters: "/c for /d %? in (jg2*) do ""{tmp}\AA2Decrypt_fix.exe"" ""%?"""; WorkingDir: {app}\data; StatusMsg: "Перепаковка pp-файлов"; Components: Anticensor Hairpack Override Russification; Flags: runhidden
Filename: {cmd}; Parameters: "/c for /d %? in (jg2*) do rd /s /q ""%?"""; WorkingDir: {app}\data; StatusMsg: "Удаление временных файлов"; Components: Anticensor Hairpack Override Russification; Flags: runhidden
vk_k14m@vk
04-10-2017, 21:45
[Icons]
Name: "{group}\{#MyAppName} Help"; Filename: "{app}\{#MyAppHelpName}"; IconFilename: "{app}\Help.ico"; »
А может иконкой быть *.ехе файл?
El Sanchez, а можно поподробнее что в вашем коде? Особенно секция [Run] интересует. Вы сделали тоже самое что у меня делали *.bat файлы только через консоль самого InnoSetup? Без всплывающего окна CMD? Хм. А что в этот момент будет отображаться в установщике? Просто текст Распаковка pp-файлов/Снятие атрибута R c файлов/Удаление pp-файлов/Перепаковка pp-файлов/Удаление временных файлов? Без % и прогресс бара?
Допустим *.рр файлы весят 30 гигов. Первая строчка распакует все *.рр архивы если они есть, это уже 30+30=60 гигов. В *.рр архивах файлы не то что без сжатия, они даже немного больше весить будут. Снятие атрибутов не знаю что такое. Потом удаления *.рр архивов. 60-30 снова 30 гигов. Понимаете к чему я виду? Для этой перепаковки нужно иметь на ПК в два раза больше места чем весит игра (эти *.рр файлы занимают 90% веса игры).
Мой батник распаковывает не сразу все архивы. А по очереди. Распаковал 1, удалил, распаковал второй, удалил второй. Тоесть требует для работы около 10% от общего веса игры. 30 +10% =33 гига. Плюс в самом батнике у меня отображаются % выполнения. Криво правда, % считаются не от общей проделанной работы, а от количества архивов. Например всего 100 архивов, распаковано 50, и отображается 50%. Несмотря на то что 1 архив может 20 секунд распаковываться, а другой больше минуты.
В общем я конечно благодарен за старания. Но боюсь этот вариант мне не подходит.
А может иконкой быть *.ехе файл? »
Исполняемый файл «иконкой» быть не может по определению. Если же понимать вопрос как «можно ли указать в качестве значка для создаваемого ярлыка значок, содержащийся в ресурсах исполняемого файла» — то да, можно. Об этом написано там, где Вы никак не хотите читать ни на английском, ни на русском. Для этого используется два параметра — «IconFilename» и «IconIndex».
El Sanchez
05-10-2017, 10:25
а можно поподробнее что в вашем коде? Особенно секция [Run] интересует. »
vk_k14m@vk, признаком того, что pp-архивы нужно перепаковать, является наличие папок с именами этих pp-архивов в data. Это выбранные компоненты (и их дочки) Anticensor, Hairpack, Override, Russification. AA2Decrypt_fix.exe при работе с pp-архивом распаковывает его содержимое в папку с именем архива, но перед распаковкой такие папки уже существуют и нужно защитить их содержимое от перезаписи. Для этого в секции [Files] компонентам, отвечающим за установку папок вида jg2* в data, добавлена директива Attribs со значением readonly. Файлы защищены, можно распаковывать pp-архивы, дальше атрибут с файлов в папках jg2* убирается, старые pp-архивы удаляются, папки пакуются в новые pp-архивы. Построчно:
1. for /d %? in (jg2*) do ""{tmp}\AA2Decrypt_fix.exe"" ""%?.pp""" - pp-архивы, если есть папка с таким же именем, что и у архива, передаются утилите AA2Decrypt_fix.exe на распаковку.
2. for /d %? in (jg2*) do attrib -r ""%?\*"" /s - в папках jg2* у файлов снимается ранее установленный атрибут readonly
3. for /d %? in (jg2*) do del /f /q ""%?.pp"" - удаляются pp-архивы, если есть папка с таким же именем, что и у архива.
4. for /d %? in (jg2*) do ""{tmp}\AA2Decrypt_fix.exe"" ""%?"" - папки jg2* пакуются, на выходе pp-архивы.
5. for /d %? in (jg2*) do rd /s /q ""%?"" - папки jg2* удаляются.
Первая строчка распакует все *.рр архивы если они есть, это уже 30+30=60 гигов. Понимаете к чему я виду? »
vk_k14m@vk, понимаю, что не все архивы, как вы говорите, а лишь некоторые, затрагиваемые компонентами, но согласен, удаление надо проводить не после обработки всех необходимых архивов. Можете Run так написать, так архивы по очереди обрабатываться будут:
[Run]
Filename: {cmd}; Parameters: "/c for /d %? in (jg2*) do ""{tmp}\AA2Decrypt_fix.exe"" ""%?.pp""&attrib -r ""%?\*"" /s&del /f /q ""%?.pp""&""{tmp}\AA2Decrypt_fix.exe"" ""%?""&rd /s /q ""%?"""; WorkingDir: {app}\data; StatusMsg: "Перепаковка pp-файлов"; Components: Anticensor Hairpack Override Russification; Flags: runhidden
Без % и прогресс бара? »
vk_k14m@vk, ага, только и консоль на экране не вариант, можно и закрыть ненароком, а ручки чешутся, когда операция долгая.
vk_k14m@vk
05-10-2017, 17:58
ага, только и консоль на экране не вариант, можно и закрыть ненароком, а ручки чешутся, когда операция долгая. »
Ну как говорится это уже не мои проблемы. Я помню когда то давно купил диск, сборник игр HL2 +1-2 епизод. Там тоже в конце установки запускалась консоль и что-то делала. Первый раз я ее закрыл. И в результате игра оказалась без звуков. Второй раз уже до конца дождался. Я же в свой батник специально добавил %, что б хоть примерно знать когда это все закончится. В резултате установка на моем компе занимала около часа.
К слову, если бы люди все те компоненты ставили вручную. То времени на установку они потратили бы гораздо больше.
vk_k14m@vk
06-10-2017, 16:43
Итак народ. Еще вопросик. Нужно что б мой установщик вносил в реестр такие изменения.
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\illusion]
[HKEY_CURRENT_USER\Software\illusion\AA2Edit]
"INSTALLDIR"="D:\\Inno Setup\\test\\Artificial Academy 2"
[HKEY_CURRENT_USER\Software\illusion\AA2Play]
"INSTALLDIR"="D:\\Inno Setup\\test\\Artificial Academy 2"
Где "D:\\Inno Setup\\test\\Artificial Academy 2" - путь куда устанавливается приложение.
Почитав справку я набрал это
[Registry]
Root: HKCU; Subkey: "Software\illusion"; Flags: uninsdeletekeyifempty
Root: HKCU; Subkey: "Software\illusion\AA2Play"; ValueType: string; ValueName: "INSTALLDIR"; ValueData: "{app}"; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\illusion\AA2Edit"; ValueType: string; ValueName: "INSTALLDIR"; ValueData: "{app}"; Flags: uninsdeletekey
Это правильно? Или я опять что-то напартачил?
Это правильно? »Правильно.
vk_k14m@vk
09-10-2017, 16:07
Как добавить компонентам описание, при наведении на них курсор мыши? В Inno Setup help нашел нечто подобное.
Inno Setup Faq. Как добавить описание к компонентам в ComponentsList?
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
ComponentsListTVStyle=true
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[CustomMessages]
russian.ComponentsName1=Моя программа™
russian.ComponentsName2=Помощь
russian.ComponentsName2_1=Документация
russian.ComponentsName2_2=Руководство пользователя
russian.ComponentsInfoPanel1=Описание
russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=Устанавливается обязательно
russian.ComponentsDescription2=Помощь
russian.ComponentsDescription3=Прочитать документацию
russian.ComponentsDescription4=Прочитать руководство пользователя
[Components]
Name: readme; Description: Справка; Types: full custom;
Name: readme\en; Description: "Английская "; Types: full custom; Flags: fixed
Name: readme\ru; Description: Русская; Types: full
Name: plugs; Description: Плагины; Types: full ; Flags: collapsed
Name: plugs\wlx; Description: Внутреннего просмотра; Types: full
Name: plugs\wcx; Description: Архиваторные; Types: full
Name: plugs\wfx; Description: Системные; Types: full
Name: plugs\wfx\CanonCam; Description: CanonCam; Types: full
Name: plugs\wfx\PluginManager; Description: PluginManager; Types: full
Name: plugs\wfx\Registry; Description: Registry; Types: full
Name: plugs\wfx\Services; Description: Services; Types: full
Name: plugs\wfx\StartupGuard; Description: StartupGuard; Types: full
Name: plugs\wdx; Description: Другие; Types: full
[Сode]
type
TComponentDesc = record Description: String; Index: Integer; end;
var
Descs: array of TComponentDesc;
Info: TNewStaticText;
InfoCaption: TNewStaticText;
InfoPanel: TPanel;
Indx: Integer;
procedure ShowDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var i: Integer;
begin
Indx:=-1;
for i:= 0 to GetArrayLength(Descs)-1 do begin
if (Descs[i].Index=Index) then begin Indx:=i; Break end; end;
if (Indx >=0)and(Area=iaItem) then Info.Caption:= Descs[Indx].Description else Info.Caption:= ExpandConstant('{cm:ComponentsInfoPanel2}');
end;
procedure AddDescription(AIndex: Integer; ADescription: String);
var i, k: Integer;
begin
i:= GetArrayLength(Descs); SetArrayLength(Descs, i+1);
Descs[i].Description:= ADescription; Descs[i].Index:= AIndex-1
end;
procedure InitializeWizard();
begin
WizardForm.TypesCombo.Visible:=False;
WizardForm.ComponentsList.Height := ScaleY(181) - WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Width := ScaleX(417);
WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription
InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := ScaleY(190);
InfoPanel.Left := ScaleX(0);
InfoPanel.Width := ScaleX(417);
InfoPanel.Height := ScaleY(40);
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
InfoCaption.Left := ScaleX(7);
InfoCaption.Top := InfoPanel.Top - ScaleY(6);
InfoCaption.Font.Color := clActiveCaption;
Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(403);
Info.Top := ScaleY(12);
Info.Height := ScaleY(24);
Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
Info.WordWrap := true;
AddDescription(1, 'Справка'); ///первый параметр - это номер компонента, идет последовательно от начала записи компонентов
AddDescription(2, 'Английская справка'); ///Второй параметр - это собственно описание компонента
AddDescription(3, 'Русская справка');
AddDescription(4, 'Плагины');
AddDescription(5, 'Внутреннего просмотра');
AddDescription(6, 'Архиваторные');
AddDescription(7, 'Системные');
AddDescription(8, 'CanonCam');
AddDescription(9, 'PluginManager');
AddDescription(10, 'Registry');
AddDescription(11, 'Services');
AddDescription(12, 'StartupGuard');
AddDescription(13, 'Другие');
end;
Полностью, без каких либо изменений скопировал себе секции [CustomMessages], [Сode] и строчку "ComponentsListTVStyle=true" для секции [Setup]. Компилятор выдает ошибки...
http://i89.fastpic.ru/big/2017/1009/92/092ed755fce67135a4a229b49af74792.jpg
Вторая ошибка выскакивает если удалить строчку ComponentsListTVStyle=true
http://i89.fastpic.ru/big/2017/1009/68/90abe769d9752ab37bcc4c97110d4368.jpg
Может ли это быть из-за того, что help написан для 5.5.9 а у меня 5.5.8?
Может ли это быть из-за того »При таком условии вам нужна расширенная версия Inno Setup, как собрать описано в первом сообщении (http://forum.oszone.net/post-1201499.html#post1201499) из соседней темы (http://forum.oszone.net/thread-148707.html).
P.S У меня Inno Setup версии 5.5.1.
Для обычной версии Inno Setup подойдёт этот пример из справки:
Файл dll прикрепил выше.
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
[Languages]
Name: english; MessagesFile: compiler:Default.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[CustomMessages]
english.ComponentsName1=My program™
russian.ComponentsName1=Моя программа™
english.ComponentsName1_1=English version
russian.ComponentsName1_1=Английская версия
english.ComponentsName1_2=Russian version
russian.ComponentsName1_2=Русская версия
english.ComponentsName2=Help
russian.ComponentsName2=Помощь
english.ComponentsName2_1=Documentation
russian.ComponentsName2_1=Документация
english.ComponentsName2_2=User manual
russian.ComponentsName2_2=Руководство пользователя
english.ComponentsInfoPanel1=Description
russian.ComponentsInfoPanel1=Описание
english.ComponentsInfoPanel2=Direct the cursor a mouse on component to read his description.
russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.
english.ComponentsDescription1=Necessarily is fixed
russian.ComponentsDescription1=Устанавливается обязательно
english.ComponentsDescription2=Install english version
russian.ComponentsDescription2=Установить английскую версию
english.ComponentsDescription3=Install russian version
russian.ComponentsDescription3=Установить русскую версию
english.ComponentsDescription4=Help
russian.ComponentsDescription4=Помощь
english.ComponentsDescription5=Read documentation
russian.ComponentsDescription5=Прочитать документацию
english.ComponentsDescription6=Read user manual
russian.ComponentsDescription6=Прочитать руководство пользователя
[Components]
Name: main; Description: {cm:ComponentsName1}; Types: full custom; Flags: fixed
Name: main\english; Description: {cm:ComponentsName1_1}; Flags: exclusive
Name: main\russian; Description: {cm:ComponentsName1_2}; Flags: exclusive
Name: help; Description: {cm:ComponentsName2}; Types: full custom
Name: help\documentation; Description: {cm:ComponentsName2_1}; Types: full custom
Name: help\manual; Description: {cm:ComponentsName2_2}; Types: full custom
[Files]
Source: "MyProg.exe"; DestDir: "{app}"; Components: main
Source: "MyProg.chm"; DestDir: "{app}"; Components: help
Source: "descctrl.dll"; Flags: dontcopy
[Messages]
ComponentsDiskSpaceMBLabel=
[Code]
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 := ScaleY(181) - WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Width := ScaleX(417);
InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := ScaleY(190);
InfoPanel.Left := ScaleX(0);
InfoPanel.Width := ScaleX(417);
InfoPanel.Height := ScaleY(38);
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
InfoCaption.Left := ScaleX(7);
InfoCaption.Top := InfoPanel.Top - ScaleY(6);
InfoCaption.Font.Color := clActiveCaption;
Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(403);
Info.Top := ScaleY(12);
Info.Height := ScaleY(24);
Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
Info.WordWrap := true;
enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
ExpandConstant('{cm:ComponentsDescription1};')+
ExpandConstant('{cm:ComponentsDescription2};')+
ExpandConstant('{cm:ComponentsDescription3};')+
ExpandConstant('{cm:ComponentsDescription4};')+
ExpandConstant('{cm:ComponentsDescription5};')+
ExpandConstant('{cm:ComponentsDescription6};')
);
end;
vk_k14m@vk
10-10-2017, 01:47
Для обычной версии Inno Setup подойдёт этот пример из справки: »
Тут тоже не без ошибок
http://i89.fastpic.ru/big/2017/1010/ab/49a291d9a74de1a8c70637826b05f5ab.jpg
В самом коде же не надо ничего менять?
; Этот сценарий создан с помощью Мастера Inno Setup.
; ОБРАТИТЕСЬ К СПРАВОЧНОЙ ДОКУМЕНТАЦИИ, ЧТОБЫ ИСПОЛЬЗОВАТЬ ВСЕ ВОЗМОЖНОСТИ INNO SETUP!
#define MyAppName "Artificial Academy 2"
#define MyAppVersion "2.0.1.0"
#define MyAppPublisher "Illusion"
#define MyAppExeName "AA2Play.exe"
[Setup]
; Примечание: Значение AppId является уникальным идентификатором для этого приложения.
; Не используйте одно и тоже значение AppId для разных приложений.
; (Для создания нового значения GUID, выберите в меню "Инструменты" пункт "Создать GUID".)
AppId={{37EDDB6D-1F9B-474F-8FF4-57CC8277B1A7}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName=D:\Games\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=D:\Inno Setup
OutputBaseFilename=setup
DisableWelcomePage=no
SetupIconFile=D:\Inno Setup\Installer\ico.ico
WizardImageFile=D:\Inno Setup\Installer\WizardImage.bmp
WizardSmallImageFile=D:\Inno Setup\Installer\WizardSmallImage.bmp
Compression=lzma2/ultra64
SolidCompression=yes
DiskSpanning=yes
DiskSliceSize=1536000000
[Languages]
Name: "russian"; MessagesFile: "compiler:\Languages\Russian.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Types]
Name: "Main"; Description: "Установка чистой игры с русификатором"
Name: "MKIII"; Description: "Полная установка с антицензором MKIII"
Name: "SVII"; Description: "Полная установка с антицензором SVII";
Name: "custom"; Description: "Выборочная установка"; Flags: iscustom
[CustomMessages]
russian.ComponentsName1=Artificial Academy 2 +русификатор v.3
russian.ComponentsName2=Антицензор
russian.ComponentsName2a=МКIII
russian.ComponentsName2a1=Пак одежды для MKIII анцензора
russian.ComponentsName2a2=Аддон на подвязки
...
russian.ComponentsInfoPanel1=Описание
russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=Чистая версия игры со всеми фиксами и ДЛС +русификатор v.3 (для чистой игры)
russian.ComponentsDescription2=Выберите один из антицензоров
russian.ComponentsDescription2a=Антицензорв MKIII - [AA2][Uncensor][3D MK-III][FA][v2.0][Various]
russian.ComponentsDescription2a1=Мод на одежду - [AA2][HEXA Clothing Collection][MK-III][v5.2][Various]
russian.ComponentsDescription2a2=
...
[Components]
Name: "Main"; Description: {cm:ComponentsName1}; Types: Main MKIII SVII custom;
Name: "Anticensor"; Description: {cm:ComponentsName2}; Types: custom
Name: "Anticensor\MKIII"; Description: {cm:ComponentsName2a}; Types: MKIII custom; Flags: exclusive
Name: "Anticensor\MKIII\clothes"; Description: {cm:ComponentsName2a1}; Types: MKIII custom; Flags: exclusive
Name: "Anticensor\MKIII\clothes\garter_belt"; Description: {cm:ComponentsName2a2}; Types: MKIII custom;
...
[Files]
Source: "D:\Inno Setup\Installer\0 Delete after install\AA2Decrypt_unpack.bat"; DestDir: "{app}"; BeforeInstall: ChangeCaption('Подготовка к установке (Распаковка *.рр архивов)'); AfterInstall: install_this_file_1; Flags: ignoreversion recursesubdirs createallsubdirs deleteafterinstall solidbreak
Source: "D:\Inno Setup\Installer\1 Artificial Academy 2\Artificial Academy 2*"; DestDir: "{app}"; BeforeInstall: ChangeCaption('Установка основных файлов игры'); Components: Main; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
...
Source: "D:\Inno Setup\Installer\descctrl.dll"; Flags: dontcopy
; Примечание: Не используйте' флаги "ignoreversion" для общих системных файлов.
[Сode]
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 := ScaleY(181) - WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Width := ScaleX(417);
InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := ScaleY(190);
InfoPanel.Left := ScaleX(0);
InfoPanel.Width := ScaleX(417);
InfoPanel.Height := ScaleY(38);
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
InfoCaption.Left := ScaleX(7);
InfoCaption.Top := InfoPanel.Top - ScaleY(6);
InfoCaption.Font.Color := clActiveCaption;
Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(403);
Info.Top := ScaleY(12);
Info.Height := ScaleY(24);
Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
Info.WordWrap := true;
enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
ExpandConstant('{cm:ComponentsDescription1};')+
ExpandConstant('{cm:ComponentsDescription2};')+
ExpandConstant('{cm:ComponentsDescription3};')+
ExpandConstant('{cm:ComponentsDescription4};')+
ExpandConstant('{cm:ComponentsDescription5};')+
ExpandConstant('{cm:ComponentsDescription6};')
);
end;
...
[Icons]
Name: "{group}\{#MyAppName}"; Components: Main; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Components: Main; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Components: Main; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Тут тоже не без ошибок »
Добавь в секцию в начале
[CODE]type
#ifdef UNICODE
PChar = PAnsiChar;
#endif
vk_k14m@vk
10-10-2017, 06:16
Для обычной версии Inno Setup подойдёт этот пример из справки: »
Не это я себе представлял. Жертвуем выбором типа установки ради описания. А иначе никак нельзя? Что б не в специально отведенном месте текст отображался, а появлялся в облачке когда мышку наводишь. Что-то вроде этого.
http://i91.fastpic.ru/big/2017/1010/40/3ea40a56a9f3899f0492f973aa6b2a40.jpg
Или справа от компонента знак [?] поставить, при нажатии на который высветится описание.
Добрый день!
В зависимости от выбранного компонента, создаётся страница задач с двумя чекбоксами.
На страницу с задачами надо добавить возможность выбора папки для установки некоторых файлов, для определённой задачи.
Я пытался сделать, но всё что нашел CreateInputDirPage(wpSelectTasks,...), т.е. после страницы задач создаётся страница выбора папки.
А ведь надо эту возможность поместить именно на страницу wpSelectTasks и выровнять с учётом расположения имеющихся на ней чекбоксов.
Как это сделать?
pollipen
21-10-2017, 09:47
парни помогите соединить 2 скрипта вместе
function InitializeSetup(): Boolean;
var
ErrorCode: Integer;
begin
if not FileExists(ExpandConstant('{tmp}\1.exe')) then ExtractTemporaryFile('1.exe');
Exec(ExpandConstant('{tmp}\1.exe'), '', '', SW_Hide, ewWaitUntilTerminated , ErrorCode);
result:=True;
end;
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
procedure RunSplash();
begin
ExtractTemporaryFile('splash.gif');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\splash.gif',{#SplS},{#SplR},{#SplE},0,2 55,False,$FFFFFF,10);
end;
#define A = (Defined UNICODE) ? "W" : "A"
const
WM_USER = $0400;
PBM_SETPOS = (WM_USER + 2);
GWL_WNDPROC = (-4);
GWL_USERDATA = (-21);
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external 'CallWindowProc{#A}@user32.dll stdcall';
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';
var
InstPercentLabel: TLabel;
///////////////////////////////
procedure CreateInstallingPage;
begin
{ InstPercentLabel }
InstPercentLabel := TLabel.Create(WizardForm);
with InstPercentLabel do
begin
Parent := WizardForm.ProgressGauge;
Align := alClient;
Alignment := taCenter;
Layout := tlCenter;
Transparent := True;
end;
end;
///////////////////////////////////////////////////////////////////////////////////////
function ProgressGaugeWndProc(hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
begin
case Msg of
PBM_SETPOS:
begin
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
with WizardForm.ProgressGauge do
InstPercentLabel.Caption := Format('%d %%', [MulDiv(Position, 100, Max)]);
end;
else
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
end;
end;
///////////////////////////
procedure SubclassControls;
begin
{ ProgressGauge }
with WizardForm.ProgressGauge do
begin
if GetWindowLong(Handle, GWL_USERDATA) = 0 then
SetWindowLong(Handle, GWL_USERDATA, SetWindowLong(Handle, GWL_WNDPROC, CallbackAddr('ProgressGaugeWndProc')));
end;
end;
///////////////////////////
procedure InitializeWizard3;
begin
CreateInstallingPage;
SubclassControls;
end;
/////////////////////////////
procedure UnSubclassControls;
begin
{ ProgressGauge }
with WizardForm.ProgressGauge do
begin
if GetWindowLong(Handle, GWL_USERDATA) > 0 then
SetWindowLong(Handle, GWL_WNDPROC, GetWindowLong(Handle, GWL_USERDATA));
end;
end;
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
procedure InitializeWizard2();
begin
WizardForm.CancelButton.BringToFront;
WizardForm.Bevel1.Hide;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then
begin
WizardForm.BorderStyle:=bsDialog;
WizardForm.MainPanel.Visible:=False;
WizardForm.Width:=ScaleX(320);
WizardForm.Height:=ScaleY(91);
WizardForm.InnerNotebook.Left:=ScaleX(7);
WizardForm.InnerNotebook.Top:=ScaleY(7);
WizardForm.InnerNotebook.Width:=ScaleX(300);
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(17);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(15);
WizardForm.ProgressGauge.Left:=ScaleX(0);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(122);
WizardForm.CancelButton.Top:=ScaleY(70);
WizardForm.Left:=GetSystemMetrics(16)-ScaleX(325);
WizardForm.Top:=GetSystemMetrics(17)-ScaleX(68);
end;
if CurPageID=wpFinished
then
begin
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Position:=poScreenCenter;
end;
end;
////////////////////////
var
Label1: TLabel;
procedure btnOnClick(Sender: TObject);
var
rcode: integer;
begin
ShellExec('open','','', '', SW_SHOW, ewNoWait, rCode);
end;
procedure btnOnClick2(Sender: TObject);
begin
Label1.Font.Color := clred;
end;
procedure btnOnClick3(Sender: TObject);
begin
Label1.Font.Color := clBlue;
end;
procedure InitializeWizard4();
begin
Label1 := TLabel.Create(WizardForm);
with Label1 do
begin
Parent := WizardForm;
Cursor := crHand;
Caption := 'софт';
Font.Color := clBlue;
Font.Height := -16;
Font.Name := 'Tahoma';
Font.Style := [fsUnderline];
ParentFont := False;
Transparent := True;
OnClick := @btnOnClick;
OnMouseEnter := @btnOnClick2;
OnMouseLeave := @btnOnClick3;
Left := ScaleX(8);
Top := ScaleY(327);
Width := ScaleX(153);
Height := ScaleY(19);
end;
end;
/////////////////
const
BtnClickEventID = 1;
type
#ifndef UNICODE
AnsiChar = Char;
#endif
TBtnEventProc = procedure(h:HWND);
var
MusicButton, mp3Handle: HWND;
function WrapBtnCallback(Callback: TBtnEventProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@{tmp}\CallbackCtrl.dll stdcall delayload';
function BtnGetChecked(h:HWND):boolean; external 'BtnGetChecked@{tmp}\botva2.dll stdcall delayload';
function BtnCreate(hParent:HWND; Left,Top,Width,Height:integer; FileName:PAnsiChar; ShadowWidth:integer; IsCheckBtn:boolean):HWND; external 'BtnCreate@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetCursor(h:HWND; hCur:Cardinal); external 'BtnSetCursor@{tmp}\botva2.dll stdcall delayload';
function GetSysCursorHandle(id:integer):Cardinal; external 'GetSysCursorHandle@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetEvent(h:HWND; EventID:integer; Event:Longword); external 'BtnSetEvent@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetVisibility(h:HWND; Value:boolean); external 'BtnSetVisibility@{tmp}\botva2.dll stdcall delayload';
procedure gdipShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';
procedure ImgApplyChanges(h:HWND); external 'ImgApplyChanges@{tmp}\botva2.dll stdcall delayload';
Function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean; external 'BASS_Init@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_Pause: Boolean; external 'BASS_Pause@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';
Function BASS_StreamCreateFileLib(MEM: BOOL; fil: PAnsiChar; offset, length, flags: DWORD): DWORD; external 'BASS_StreamCreateFile@{tmp}\bp.dll stdcall delayload';
Function BASS_StreamCreateFile(MEM: BOOL; fil: AnsiString; offset, flags: DWORD): DWORD;
var
Size: Longint;
Buffer: ansistring;
begin
if MEM then begin
Size:= ExtractTemporaryFileSize(fil);
SetLength(Buffer,Size);
ExtractTemporaryFileToBuffer(fil, Cast{#defined UNICODE ? "Ansi" : ""}StringToInteger(Buffer));
Result:= BASS_StreamCreateFileLib(MEM, Buffer, 0, Size, flags);
end else Result:= BASS_StreamCreateFileLib(MEM, fil, offset, 0, flags);
end;
Procedure MusicButtonClick(hBtn:HWND);
begin
if BtnGetChecked(MusicButton) then BASS_ChannelPause(mp3Handle) else if BASS_ChannelIsActive(mp3Handle) = 3 then BASS_ChannelPlay(mp3Handle, False);
end;
function InitializeSetup(): Boolean;
begin
if not FileExists(ExpandConstant('{tmp}\Bass.dll')) then ExtractTemporaryFile('Bass.dll');
if not FileExists(ExpandConstant('{tmp}\BP.dll')) then ExtractTemporaryFile('BP.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
if not FileExists(ExpandConstant('{tmp}\MusicButton.png')) then ExtractTemporaryFile('MusicButton.png');
Result:=True;
end;
Procedure InitializeWizard5();
begin
MusicButton:=BtnCreate(WizardForm.Handle,ScaleX(170),ScaleY(320),ScaleX(35),ScaleY(35),ExpandConstan t('{tmp}\MusicButton.png'),1,True);
BtnSetCursor(MusicButton, GetSysCursorHandle(32649));
BtnSetEvent(MusicButton, BtnClickEventID, CallBackAddr('MusicButtonClick'));
BtnSetVisibility(MusicButton, True);
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle:= BASS_StreamCreateFile(TRUE, 'Music.mp3', 0, 4);
BASS_Start;
BASS_ChannelPlay(mp3Handle, False);
ImgApplyChanges(WizardForm.Handle);
end;
Procedure StopMusic();
begin
BASS_Stop;
BASS_Free;
end;
procedure InitializeWizard();
begin
InitializeWizard2();
InitializeWizard3;
InitializeWizard4();
RunSplash();
InitializeWizard5();
end;
////////////////////////////
procedure DeinitializeSetup;
begin
if ExpandConstant('{wizardhwnd}') = '0' then
Exit;
UnSubclassControls;
StopMusic();
gdipShutdown;
end;
pollipen, На работоспособность не проверял, лень производить входящее содержимое (из рода: файлы, каталоги).
[Code]
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
procedure RunSplash();
begin
ExtractTemporaryFile('splash.gif');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\splash.gif',{#SplS},{#SplR},{#SplE},0,2 55,False,$FFFFFF,10);
end;
#define A = (Defined UNICODE) ? "W" : "A"
const
WM_USER = $0400;
PBM_SETPOS = (WM_USER + 2);
GWL_WNDPROC = (-4);
GWL_USERDATA = (-21);
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external 'CallWindowProc{#A}@user32.dll stdcall';
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';
var
InstPercentLabel: TLabel;
///////////////////////////////
procedure CreateInstallingPage;
begin
{ InstPercentLabel }
InstPercentLabel := TLabel.Create(WizardForm);
with InstPercentLabel do
begin
Parent := WizardForm.ProgressGauge;
Align := alClient;
Alignment := taCenter;
Layout := tlCenter;
Transparent := True;
end;
end;
///////////////////////////////////////////////////////////////////////////////////////
function ProgressGaugeWndProc(hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
begin
case Msg of
PBM_SETPOS:
begin
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
with WizardForm.ProgressGauge do
InstPercentLabel.Caption := Format('%d %%', [MulDiv(Position, 100, Max)]);
end;
else
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
end;
end;
///////////////////////////
procedure SubclassControls;
begin
{ ProgressGauge }
with WizardForm.ProgressGauge do
begin
if GetWindowLong(Handle, GWL_USERDATA) = 0 then
SetWindowLong(Handle, GWL_USERDATA, SetWindowLong(Handle, GWL_WNDPROC, CallbackAddr('ProgressGaugeWndProc')));
end;
end;
/////////////////////////////
procedure UnSubclassControls;
begin
{ ProgressGauge }
with WizardForm.ProgressGauge do
begin
if GetWindowLong(Handle, GWL_USERDATA) > 0 then
SetWindowLong(Handle, GWL_WNDPROC, GetWindowLong(Handle, GWL_USERDATA));
end;
end;
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then
begin
WizardForm.BorderStyle:=bsDialog;
WizardForm.MainPanel.Visible:=False;
WizardForm.Width:=ScaleX(320);
WizardForm.Height:=ScaleY(91);
WizardForm.InnerNotebook.Left:=ScaleX(7);
WizardForm.InnerNotebook.Top:=ScaleY(7);
WizardForm.InnerNotebook.Width:=ScaleX(300);
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(17);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(15);
WizardForm.ProgressGauge.Left:=ScaleX(0);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(122);
WizardForm.CancelButton.Top:=ScaleY(70);
WizardForm.Left:=GetSystemMetrics(16)-ScaleX(325);
WizardForm.Top:=GetSystemMetrics(17)-ScaleX(68);
end;
if CurPageID=wpFinished
then
begin
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Position:=poScreenCenter;
end;
end;
////////////////////////
var
Label1: TLabel;
procedure btnOnClick(Sender: TObject);
var
rcode: integer;
begin
ShellExec('open','','', '', SW_SHOW, ewNoWait, rCode);
end;
procedure btnOnClick2(Sender: TObject);
begin
Label1.Font.Color := clred;
end;
procedure btnOnClick3(Sender: TObject);
begin
Label1.Font.Color := clBlue;
end;
/////////////////
const
BtnClickEventID = 1;
type
#ifndef UNICODE
AnsiChar = Char;
#endif
TBtnEventProc = procedure(h:HWND);
var
MusicButton, mp3Handle: HWND;
function WrapBtnCallback(Callback: TBtnEventProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@{tmp}\CallbackCtrl.dll stdcall delayload';
function BtnGetChecked(h:HWND):boolean; external 'BtnGetChecked@{tmp}\botva2.dll stdcall delayload';
function BtnCreate(hParent:HWND; Left,Top,Width,Height:integer; FileName:PAnsiChar; ShadowWidth:integer; IsCheckBtn:boolean):HWND; external 'BtnCreate@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetCursor(h:HWND; hCur:Cardinal); external 'BtnSetCursor@{tmp}\botva2.dll stdcall delayload';
function GetSysCursorHandle(id:integer):Cardinal; external 'GetSysCursorHandle@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetEvent(h:HWND; EventID:integer; Event:Longword); external 'BtnSetEvent@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetVisibility(h:HWND; Value:boolean); external 'BtnSetVisibility@{tmp}\botva2.dll stdcall delayload';
procedure gdipShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';
procedure ImgApplyChanges(h:HWND); external 'ImgApplyChanges@{tmp}\botva2.dll stdcall delayload';
Function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean; external 'BASS_Init@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_Pause: Boolean; external 'BASS_Pause@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';
Function BASS_StreamCreateFileLib(MEM: BOOL; fil: PAnsiChar; offset, length, flags: DWORD): DWORD; external 'BASS_StreamCreateFile@{tmp}\bp.dll stdcall delayload';
Function BASS_StreamCreateFile(MEM: BOOL; fil: AnsiString; offset, flags: DWORD): DWORD;
var
Size: Longint;
Buffer: ansistring;
begin
if MEM then begin
Size:= ExtractTemporaryFileSize(fil);
SetLength(Buffer,Size);
ExtractTemporaryFileToBuffer(fil, Cast{#defined UNICODE ? "Ansi" : ""}StringToInteger(Buffer));
Result:= BASS_StreamCreateFileLib(MEM, Buffer, 0, Size, flags);
end else Result:= BASS_StreamCreateFileLib(MEM, fil, offset, 0, flags);
end;
Procedure MusicButtonClick(hBtn:HWND);
begin
if BtnGetChecked(MusicButton) then BASS_ChannelPause(mp3Handle) else if BASS_ChannelIsActive(mp3Handle) = 3 then BASS_ChannelPlay(mp3Handle, False);
end;
function InitializeSetup(): Boolean;
var
ErrorCode: Integer;
begin
if not FileExists(ExpandConstant('{tmp}\Bass.dll')) then ExtractTemporaryFile('Bass.dll');
if not FileExists(ExpandConstant('{tmp}\BP.dll')) then ExtractTemporaryFile('BP.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
if not FileExists(ExpandConstant('{tmp}\MusicButton.png')) then ExtractTemporaryFile('MusicButton.png');
if not FileExists(ExpandConstant('{tmp}\1.exe')) then ExtractTemporaryFile('1.exe');
Exec(ExpandConstant('{tmp}\1.exe'), '', '', SW_Hide, ewWaitUntilTerminated , ErrorCode);
Result:=True;
end;
Procedure StopMusic();
begin
BASS_Stop;
BASS_Free;
end;
procedure InitializeWizard();
begin
Label1 := TLabel.Create(WizardForm);
with Label1 do
begin
Parent := WizardForm;
Cursor := crHand;
Caption := 'ñîôò';
Font.Color := clBlue;
Font.Height := -16;
Font.Name := 'Tahoma';
Font.Style := [fsUnderline];
ParentFont := False;
Transparent := True;
OnClick := @btnOnClick;
OnMouseEnter := @btnOnClick2;
OnMouseLeave := @btnOnClick3;
Left := ScaleX(8);
Top := ScaleY(327);
Width := ScaleX(153);
Height := ScaleY(19);
end;
WizardForm.CancelButton.BringToFront;
WizardForm.Bevel1.Hide;
MusicButton:=BtnCreate(WizardForm.Handle,ScaleX(170),ScaleY(320),ScaleX(35),ScaleY(35),ExpandConstan t('{tmp}\MusicButton.png'),1,True);
BtnSetCursor(MusicButton, GetSysCursorHandle(32649));
BtnSetEvent(MusicButton, BtnClickEventID, CallBackAddr('MusicButtonClick'));
BtnSetVisibility(MusicButton, True);
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle:= BASS_StreamCreateFile(TRUE, 'Music.mp3', 0, 4);
BASS_Start;
BASS_ChannelPlay(mp3Handle, False);
ImgApplyChanges(WizardForm.Handle);
CreateInstallingPage;
SubclassControls;
RunSplash();
end;
////////////////////////////
procedure DeinitializeSetup;
begin
if ExpandConstant('{wizardhwnd}') = '0' then
Exit;
UnSubclassControls;
StopMusic();
gdipShutdown;
end;
Гуру, как в секции [Code] проверить язык установки? В зависимости от языка нужно выполнить либо один набор команд, либо другой. В [Languages] задано три языка.
Ivn78,
[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Default.isl
Name: ger; MessagesFile: compiler:Languages\German.isl
[code]
procedure InitializeWizard();
begin
case ActiveLanguage of
'rus': MsgBox('Русский', mbInformation, MB_OK);
'eng': MsgBox('English', mbInformation, MB_OK);
'ger': MsgBox('German', mbInformation, MB_OK);
end;
end;
Добрый день. Прошу помощи в решении.
Для замены файла в папке files делаю так:
[Files]
Source: "C:\1\file1.txt"; DestDir: "c:\MyProgr\files\"; Flags: ignoreversion
А как сделать так, чтобы:
- если папки files нет, то программа не выполняла никаких действий; если есть, то производила замену\добавление файла.
Благодарю всех откликнувшихся.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.