Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

alert30
23-06-2012, 12:24
Некоторые инсталляторы (хоть из оригинального, и из диска) в середине установки может выполнять приложения, скрипты, исполняемые файлы и пр. Вот как бы это сделать? Выполнение приложения не после установки, а в середине установки; то что уже распаковалось в папку назначения.

R.i.m.s.k.y.
23-06-2012, 12:31
alert30, почитать в хелпе / поискать в теме про CurStepChanged и CurPageChanged

Johny777
23-06-2012, 12:43
alert30,
вот пример подобных действий
вместо блокнота можно запустить архив с параметрами и извлечь куда надо
(библиотеки для примера лежат, как файлы)
можно ещё и к позиции прогрессбара прикрутить, но не думаю, что это правильно
делал так со звуками (ну чтоб говорило 10%, 20%...), но дело в том, что позиция скажем на середине может быть там секунды две
поэтому файлы начинали проигрываться несколько раз
в пример в архиве (или коде ниже) действие после распаковки какого-то файла (а это намного лучше)
если тебе нужно запустить архив ближе к началу установки или концу, то из справки мы узнаём о том, что файлы извлекаются в том порядке в котором записаны
в секции, а удаляются в обратном
те ты можешь прикинуть где лучше и после какого файла извлечь, чтоб достичь желаемого результата

код:

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg

[Files]
Source: 1.dll; DestDir: {app}; AfterInstall: Patch()
Source: 2.dll; DestDir: {app}; AfterInstall: Patch()

[ Code]
procedure Patch;
var
ResultCode: Integer;
begin
case ExtractFileName(ExpandConstant(CurrentFileName)) of
'1.dll': begin
if Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
MsgBox('Hello.', mbInformation, MB_OK);
if ResultCode=0 then WizardForm.CancelButton.OnClick(nil);
end;
'2.dll': if Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
MsgBox('Hello 2.', mbInformation, MB_OK);
end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
end;


наглядный пример в архиве:

alert30
23-06-2012, 12:47
Johny777, да, спасибо, уже нашел.

El Sanchez
23-06-2012, 15:07
Johny777, держи, это писать в основном коде, код деинсталлятора не нужен.


#define MyAppName "test"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
UninstallIconFile=icon.ico
AppMutex=testmutex
BitmapResource=unins:Cremator_poster.bmp

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

[CustomMessages]
ru.Cremator=äâîðíèê Àëüÿíñà
en.Cremator=A Combine janitor of sorts

ru.remove=åìó ïîäìåñòè?
en.remove=should he sweep?

ru.Save=èëè ñíà÷àëà
en.Save=would you like to

ru.Save_Btn=ñîõðàíèøü ?
en.Save_Btn=save ?

en.rem=sweep
ru.rem=ñìåñòè

[Files]
Source: steam.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}

[Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
function WINAPI_CreateMutex(lpMutexAttributes: Longint; bInitialOwner: BOOL; lpName: String): THandle; external 'CreateMutexA@kernel32.dll stdcall';
function ReleaseMutex(hMutex: THandle): BOOL; external 'ReleaseMutex@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

var
UninstallForm: TSetupForm;
Save_Label: TLabel;
hl2_Checkbox, ep1_Checkbox, ep2_Checkbox, portal_Checkbox: TCheckBox;
ExitButton, UninstallButton: TButton;
ResultCode: Integer;
hMutex: THandle;

procedure InitializeWizard();
begin
//create installer mutex
hMutex := WINAPI_CreateMutex(0, False, ExpandConstant('{#SetupSetting("AppMutex")}'));

//skin
ExtractTemporaryFile('steam.cjstyles');
LoadSkin(ExpandConstant('{tmp}\steam.cjstyles'), '');
end;

procedure Run_SAVE(Sender: TObject);
begin
if ActiveLanguage = 'en' then Exec(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\SAVE.exe'), '/LANG=English', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
if ActiveLanguage = 'ru' then Exec(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\SAVE.exe'), '/LANG=Russian', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;

function CreateUninstallForm: Integer;
begin
UninstallForm := CreateCustomForm;
with UninstallForm do
begin
BorderStyle := bsSingle;
BorderIcons := [biSystemMenu,biMinimize];
Position := poScreenCenter;
Caption := 'Uninstall';
ClientWidth := ScaleX(634);
ClientHeight := ScaleY(586);

//unins background bitmap image
with TBitmapImage.Create(nil) do
begin
Parent := UninstallForm;
Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS');
SetBounds(ScaleX(0), ScaleY(0), ScaleX(640), ScaleY(586));
Hint := ExpandConstant('{cm:Cremator}');
ShowHint := True;
ParentShowHint := False;
end;

//should he sweep label
Save_Label := TLabel.Create(nil);
with Save_Label do
begin
Parent := UninstallForm;
Left := ScaleX(400);
Top := ScaleY(27);
AutoSize := True;
Caption := ExpandConstant('{cm:remove}');
Font.Color := clWindowText;
Font.Height := -16;
Font.Name := 'Tahoma';
ParentFont := False;
Transparent := False;
Font.Color := $48c1ca;
end;

//would you like to label
with TLabel.Create(nil) do
begin
Parent := UninstallForm;
SetBounds(ScaleX(460), ScaleY(50), ScaleX(270), ScaleY(16));
AutoSize := False;
Caption := ExpandConstant('{cm:Save}');
Transparent := True;
WordWrap := True;
Font.Color := $48c1ca;
Font.Size := 8;
end;

//uninstall button
UninstallButton := TButton.Create(nil);
with UninstallButton do
begin
Parent := UninstallForm;
SetBounds(ScaleX(500), ScaleY(527), ScaleX(69), ScaleY(23));
Cursor := crHand;
Caption := SetupMessage(msgButtonYes);
ModalResult := mrOk;
end;

//exit button
ExitButton := TButton.Create(nil);
with ExitButton do
begin
Parent := UninstallForm;
SetBounds(UninstallButton.Left - UninstallButton.Width - ScaleX(16), UninstallButton.Top, UninstallButton.Width, UninstallButton.Height);
Caption := SetupMessage(msgButtonNo);
Cursor := crHand;
ModalResult := mrCancel;
end;

//save button
with TNewSpeedButton.Create(nil) do
begin
Parent := UninstallForm;
if ActiveLanguage = 'ru' then SetBounds(Save_Label.Left + Save_Label.Width + ScaleX(20), Save_Label.Top + ScaleY(19), ScaleX(73), ScaleY(20));
if ActiveLanguage = 'en' then SetBounds(Save_Label.Left + Save_Label.Width + ScaleX(20), Save_Label.Top + ScaleY(19), ScaleX(40), ScaleY(20));
Caption := ExpandConstant('{cm:Save_Btn}');
Enabled := FileExists(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\SAVE.exe'));
ThemeEnabled := False;
Style := nsbButton;
Font.Size := 8;
Font.Color := $48c1ca;
OnClick := @Run_SAVE;
end;

//hl2 checkbox
hl2_Checkbox := TCheckBox.Create(nil);
with hl2_Checkbox do
begin
Parent := UninstallForm;
Caption := ExpandConstant('{cm:rem}');
SetBounds(UninstallButton.Left, ScaleY(127), ScaleX(80), ScaleY(15));
Checked := False;
Enabled := FileExists(ExpandConstant('{app}\common\half-life 2\hl2.exe'));
end;

//ep1 checkbox
ep1_Checkbox := TCheckBox.Create(nil);
with ep1_Checkbox do
begin
Parent := UninstallForm;
Caption := ExpandConstant('{cm:rem}');
SetBounds(UninstallButton.Left, hl2_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
Checked := False;
Enabled := FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe'));
end;

//ep2 checkbox
ep2_Checkbox := TCheckBox.Create(nil);
with ep2_Checkbox do
begin
Parent := UninstallForm;
Caption := ExpandConstant('{cm:rem}');
SetBounds(UninstallButton.Left, ep1_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
Checked := False;
Enabled := FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe'));
end;

//portal checkbox
portal_Checkbox := TCheckBox.Create(nil);
with portal_Checkbox do
begin
Parent := UninstallForm;
Caption := ExpandConstant('{cm:rem}');
SetBounds(UninstallButton.Left, ep2_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
Checked := False;
Enabled := FileExists(ExpandConstant('{app}\common\portal\hl2.exe'));
end;
Result := ShowModal;
end;
end;

function Unstall(): Boolean;
begin
Result := False;

//del hl2
if hl2_Checkbox.Checked then
begin
DelTree(ExpandConstant('{app}\common\half-life 2'), True, True, True);
DeleteFile(ExpandConstant('{app}\half-life 2 buka russian.gcf'));
DeleteFile(ExpandConstant('{app}\half-life 2 2007 base content.gcf'));
DeleteFile(ExpandConstant('{app}\half-life 2 content.gcf'));
DeleteFile(ExpandConstant('{app}\half-life 2 game dialog.gcf'));
DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));

SetIniString('Installed', 'hl2', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'AuroraB', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'hl2_ru', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'hl2_ru_buka', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'hl2_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'hl2_ru_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
end;

//del ep1
if ep1_Checkbox.Checked then
begin
DelTree(ExpandConstant('{app}\common\half-life 2 episode one'), True, True, True);
DeleteFile(ExpandConstant('{app}\episode one 2007 content.gcf'));
DeleteFile(ExpandConstant('{app}\half-life 2 episode one.gcf'));
DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2 Episode One.lnk'));

SetIniString('Installed', 'ep1', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'ep1_ru', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'ep1_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'ep1_ru_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
end;

//del ep2
if ep2_Checkbox.Checked then
begin
DelTree(ExpandConstant('{app}\common\half-life 2 episode two'), True, True, True);
DeleteFile(ExpandConstant('{app}\episode two content.gcf'));
DeleteFile(ExpandConstant('{app}\episode two maps.gcf'));
DeleteFile(ExpandConstant('{app}\episode two materials.gcf'));
DeleteFile(ExpandConstant('{app}\half-life 2 episode two english.gcf'));
DeleteFile(ExpandConstant('{app}\half-life 2 episode two russian.gcf'));
DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2 Episode Two.lnk'));

SetIniString('Installed', 'ep2', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'ep2_ru', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'ep2_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'ep2_ru_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
end;

//del portal
if portal_Checkbox.Checked then
begin
DelTree(ExpandConstant('{app}\common\portal'), True, True, True);
DeleteFile(ExpandConstant('{app}\portal content.gcf'));
DeleteFile(ExpandConstant('{app}\portal english.gcf'));
DeleteFile(ExpandConstant('{app}\portal russian.gcf'));
DeleteFile(ExpandConstant('{userdesktop}\Portal.lnk'));

SetIniString('Installed', 'portal', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'portal_ru', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'portal_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
SetIniString('Installed', 'portal_ru_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
end;

//del episodes gcf
if not FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe')) and
not FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe')) then
begin
DeleteFile(ExpandConstant('{app}\episode 1 shared.gcf'));
DeleteFile(ExpandConstant('{app}\episodic 2007 shared.gcf'));
DeleteFile(ExpandConstant('{app}\half-life 2 episode one russian.gcf'));
end;

//del russian hl2 gcf
if not FileExists(ExpandConstant('{app}\common\half-life 2\hl2.exe')) and
not FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe')) and
not FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe')) then
DeleteFile(ExpandConstant('{app}\half-life 2_russian.gcf'));

//full uninstall
if not FileExists(ExpandConstant('{app}\common\half-life 2\hl2.exe')) and
not FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe')) and
not FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe')) and
not FileExists(ExpandConstant('{app}\common\portal\hl2.exe')) then
begin
MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#MyAppName}']), mbInformation, MB_OK);
Result := True;
end;

//release deinstall mutex
ReleaseMutex(hMutex);
CloseHandle(hMutex);

UninstallForm.Close;
end;

function InitializeUninstall(): Boolean;
begin
Result := False;

//skin
if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\steam.cjstyles'), ExpandConstant('{tmp}\steam.cjstyles'), True) and
FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True) then
LoadSkinU(ExpandConstant('{tmp}\steam.cjstyles'), '');

if not UninstallSilent then
begin
Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ResultCode);
Exit;
end;

//check install mutex
if CheckForMutexes(ExpandConstant('{#SetupSetting("AppMutex")}')) then
begin
MsgBox(FmtMessage(SetupMessage(msgUninstallAppRunningError), ['{#MyAppName}']), mbError, MB_OK);
Exit;
end;

//create deinstall mutex
hMutex := WINAPI_CreateMutex(0, False, ExpandConstant('{#SetupSetting("AppMutex")}'));

if CreateUninstallForm = mrOk then Result := Unstall();
UninstallForm.Free;
end;

procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\steam.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;

procedure DeinitializeSetup;
begin
UnloadSkin();
ReleaseMutex(hMutex);
CloseHandle(hMutex);
end;

LinkOFF
24-06-2012, 07:44
Здравствуйте. Извините что не по теме, но как настроить FreeArc чтоб максимально сжималось? А то у меня ОЗУ 16 гб а используется только 2 гб.

alert30
24-06-2012, 08:17
LinkOFF, никак, только от без сжатия до ультры. Вроде говорят, как очень сжатый архиватор; это NanoZip.

t16bz
24-06-2012, 13:16
Как называется окно выбора папки установки?

R.i.m.s.k.y.
24-06-2012, 13:34
Как называется окно выбора папки установки? »
я тебе точно не отвечу тк инно нет под рукой, но посмотреть названия можно:
1. В справке поищи описание CurPageChanged, там есть названия страниц
2. в расширенном инно в Inno Form Designer видны все названия окон и элементов с "родителями"

Ivan_009
24-06-2012, 14:33
Как избавится от моргания картинок при переходе с одной странницы на другую :( пользуюсь b2p v0.3.9.2 от VoLT

t16bz
24-06-2012, 14:38
R.i.m.s.k.y., мне нужно название не страница выбора папки установки, а окна, которое появляется при нажатии на кнопку "Обзор"

Johny777
24-06-2012, 20:33
t16bz,
можно поинтересоваться зачем оно тебе?

появляется форма с TFolderTreeView, эдитом и двумя кнопками
в дизайнере это окно не редактируется

не хочу сморозить чушь, но вроде оно вообще не редактируется (разве что в исходном коде самой инно), но его можно воссоздать двумя способами
1. - самый простой - использовать встроенную функцию
function BrowseForFolder(const Prompt: String; var Directory: String; const NewFolderButton: Boolean): Boolean;
наглядный пример

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DirExistsWarning=no


[ Code]
procedure DirBrowseButtonOnClick(Sender: TObject);
var
Dir: String;
begin
if BrowseForFolder(SetupMessage(msgBrowseDialogLabel), Dir, False) then
WizardForm.DirEdit.Text:=Dir + '\My Program'
end;

procedure InitializeWizard();
begin
WizardForm.DirBrowseButton.OnClick:=@DirBrowseButtonOnClick
end;

жирным False отвечает за появление кнопки "создать папку" (False - нет кнопки, True - есть)

2. - рисовать свою форму и всё, что нужно на ней

Ivan_009
25-06-2012, 17:32
Как добавить чекбокс "Не создавать папку в меню пуск" :sorry: подскажите кто знает заранее спасибо...

Johny777
25-06-2012, 18:37
Ivan_009,

[Setup]
AllowNoIcons=yes или no

или тебе кастомный нужен?

Ivan_009
25-06-2012, 18:46
Johny777, мне кастомный нужен :)

Johny777
25-06-2012, 19:06
мне кастомный нужен »

вот:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
EnableDirDoesntExistWarning=false


[Icons]
Name: {group}\Notepad; Filename: notepad.exe; Check: not Is_No_Ico_CheckBox_Checked

[Code]
var
No_Icons_CheckBox: TNewCheckBox;


function Is_No_Ico_CheckBox_Checked: Boolean;
begin
Result := No_Icons_CheckBox.Checked;
end;


procedure No_Icons_CheckBox_OnClick(Sender: TObject);
begin
with WizardForm do
begin
GroupEdit.Enabled := not TNewCheckBox(Sender).Checked;
GroupBrowseButton.Enabled := not TNewCheckBox(Sender).Checked;
end;
end;


procedure InitializeWizard();
begin

{ No_Icons_CheckBox }
No_Icons_CheckBox := TNewCheckBox.Create(WizardForm);
with No_Icons_CheckBox do
begin
Parent := WizardForm.SelectProgramGroupPage;
SetBounds(ScaleX(32), ScaleY(168), ScaleX(200), ScaleY(17));
Caption := SetupMessage(msgNoProgramGroupCheck2);
OnClick :=@No_Icons_CheckBox_OnClick;
end;

end;


если через код значки создаёшь (не через секцию [Icons]), то переделаю

Ivan_009
25-06-2012, 19:14
Johny777, Респект и большое спасибо :clapping: :up

Yury_Prizrak
26-06-2012, 18:04
Всем привет! Вопрос следующий(искал, чесно, чет не нашел - если было - плиз, дайте линку на ответ) - мне в инсталяции надо сделать чекбокс "полная версия" - его я сделал, а как "объяснить" инсталу, что если он не нажат - некоторые файлы устанавливать не надо? Т.е. есть например 5 файлов - 1 2 3 4 5, если чекбокс нажат - устанавливаем все, если нет - устанавливаем 1, 3, 4 а 2 и 5 нет. Заранее спасибо :)

detiedyatosla
27-06-2012, 07:48
Помогите плз
Как это сделать прозрачным ?

bond07
27-06-2012, 11:29
Парни, большая просьба.
Путь установки: "C:\Program Files\Games\Selena6000
В реестре это выглядит так:
[HKEY_LOCAL_MACHINE\SOFTWARE\BaseGame\FileSystem]
"DataPath"="C:\Program Files\Games\Selena6000"

После установки программы нужно заменить "\Selena6000" на "\SELENA~1/>;"
То есть поменять название конечной папки, прога иначе не работает. Выручайте!




© OSzone.net 2001-2012