Войти

Показать полную графическую версию : Скрипты 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

R.i.m.s.k.y.
06-09-2012, 18:13
Snoopak96, извини, протупил

Ivan_009
06-09-2012, 19:43
Snoopak96, Вот глянь пожалуйста....

Snoopak96
06-09-2012, 19:59
Ivan_009, что этот, что тот что прислал в лс у меня всё нормально появляется пб в postinstall, версия инно у меня 5.5.1ee1 (a)

SatHan
06-09-2012, 21:00
R.i.m.s.k.y., опять проблема теперь если один ключ в реестре есть а остальных нет то инсталл выдаёт "На компьютере не найдено установленых игр" а нужно чтоб выдавал это сообщение тогда когда вообще нет ключей в реестре.

Присутствует в реестре Game_1 инсталл работает но скрыты Game_2 и Game_3

Присутствует в реестре Game_1 инсталл работает
Присутствует в реестре Game_2 инсталл работает но скрыт Game_3

Присутствует в реестре Game_1 инсталл работает
Присутствует в реестре Game_2 инсталл работает
Присутствует в реестре Game_3 инсталл работаетне важно в каком порядке.

Отсутствует в реестре Game_1, Game_2 и Game_3 инсталл не запускается и выдаёт сообщение
Ну скрыть компоненты не получится »не понял. а тада это что


[Setup]
AppName=Extende
AppVersion=1.0
AppVerName=Extende 1.0
DefaultDirName={pf}\Games
DefaultGroupName=Extende
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=ExtSetup
Compression=lzma
SolidCompression=yes

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

[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: CheckRegGame1
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: CheckRegGame2
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full; Check: CheckRegGame3

[Files]
Source: Game_1\*; DestDir: {app}\Game_1; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_1
Source: Game_2\*; DestDir: {app}\Game_2; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_2
Source: Game_3\*; DestDir: {app}\Game_3; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_3

[Icons]
Name: {group}\{cm:UninstallProgram,Extende}; Filename: {uninstallexe}

[#code]
Function CheckRegGame1: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') then
Result:= True;
end;

Function CheckRegGame2: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') then
Result:= True;
end;

Function CheckRegGame3: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1') then
Result:= True;
end;
ведь работает же, только осталось пара нюансов.

можно сделать так как вариант: »интересный вариант, но не то.
Johny777, тоже не то.

Snoopak96
06-09-2012, 21:21
SatHan,
т.е. тоже не то?:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(1);
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(2);
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(3);


[ Code]
Function CheckRegGame(nParam: Integer): Boolean;
begin
case nParam of
1: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1');
2: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1');
3: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1');
else
Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') and
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') and
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1')
end;
end;А по моему это тоже самое, что предлагает R.i.m.s.k.y., только упрощенно + автор Johny777 сделал не большую описку, что простительно.

Snoopak96
06-09-2012, 21:56
SatHan, вот в общем допилил код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(1);
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(2);
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(3);


[_Code]
Function CheckRegGame(nParam: Integer): Boolean;
begin
case nParam of
1: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1');
2: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1');
3: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1');
else
Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') and
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') and
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1')
end;
end;

function InitializeSetup:boolean;
begin
if CheckRegGame(1) or CheckRegGame(2) or CheckRegGame(3) then Result:=True else
if MsgBox('На вашем компьютера не найдено ни одной игры.', mbConfirmation, MB_OK) = IDOK then Result:=False;
end;

SatHan
06-09-2012, 22:37
т.е. тоже не то?: »в том смысле
1. брался за один код а у Johny777 совсем другой (не понятный мне)
2. была та же проблема то есть " если один ключ в реестре есть а остальных нет то инсталл выдаёт "На компьютере не найдено установленых игр" а нужно чтоб выдавал это сообщение тогда когда вообще нет ключей в реестре."
теперь все как нада.

R.i.m.s.k.y., Johny777, Snoopak96, Спасибо вам что выручили.

SatHan
06-09-2012, 23:09
Ещё кое что. Как заставить NewStaticText1 который в TBevel-е вместо {pf}\Application отображать C:\Program Files\Application?

[Setup]
AppName=Application
AppVersion=1.0
DefaultDirName={pf}\Application
DefaultGroupName=Application
AllowNoIcons=yes
OutputDir=.

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

[#Code]
var
ISCustomPage1: TWizardPage;
Bevel2: TBevel;
NewStaticText1: TNewStaticText;
NewStaticText2: TNewStaticText;

procedure RedesignWizardForm;
begin
ISCustomPage1 := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');

with ISCustomPage1.Surface do
begin
Name := 'ISCustomPage1';
end;

Bevel2 := TBevel.Create(WizardForm);
with Bevel2 do
begin
Name := 'Bevel2';
Parent := ISCustomPage1.Surface;
Left := ScaleX(32);
Top := ScaleY(32);
Width := ScaleX(346);
Height := ScaleY(186);
end;

NewStaticText1 := TNewStaticText.Create(WizardForm);
with NewStaticText1 do
begin
Name := 'NewStaticText1';
Parent := ISCustomPage1.Surface;
Caption := 'Папака установки:';
Left := ScaleX(56);
Top := ScaleY(56);
Width := ScaleX(98);
Height := ScaleY(14);
end;

NewStaticText2 := TNewStaticText.Create(WizardForm);
with NewStaticText2 do
begin
Name := 'NewStaticText2';
Parent := ISCustomPage1.Surface;
Caption := '{pf}\Application';
Left := ScaleX(160);
Top := ScaleY(56);
Width := ScaleX(77);
Height := ScaleY(14);
end;

NewStaticText1.TabOrder := 0;
NewStaticText2.TabOrder := 1;
end;

procedure InitializeWizard();
begin
RedesignWizardForm;
end;

Mailchik
06-09-2012, 23:23
SatHan,
Caption := ExpandConstant('{pf}\Application');

Johny777
07-09-2012, 02:31
Snoopak96,
позволю себе заметить, что функция CheckRegGame рассчитана на отправку из себя булев значений компонентам и функции InitializeSetup
те если мы отправляем ей целое число 1 или 2 или 3 то она возвращает значение соответствующее существованию определённого ключа
если (else) значение не равно 1, 2, 3 то встроенная переменная Result возвращает значение соответствующее существованию всех 3-х ключей
те CheckRegGame(1) or CheckRegGame(2) or CheckRegGame(3) это всё нормуль, но нет смысла гонять функцию 3 раза
достаточно отправить ей например CheckRegGame(777) :)
SatHan,
замени у себя в коде

function InitializeSetup:boolean;
begin
if CheckRegGame(любое целое число кроме чисел 1, 2, 3) then Result:=True else
if MsgBox('На вашем компьютера не найдено ни одной игры.', mbConfirmation, MB_OK) = IDOK then Result:=False;
end;

или, если хочешь оставь как было но удали лишний код:

else
Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') and
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') and
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1')

MogilShik2007
07-09-2012, 04:55
Привет, появилось пару вопросов:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usUninstall then
begin
if DirExists(ExpandConstant('{pf}\PCGAME\Игра\Saves')) then
begin
if MsgBox('Удалить сохранения игры?',mbconfirmation, mb_yesno) = IDYES then
begin
DelTree(ExpandConstant('{pf}\PCGAME\Игра\Saves'), True, True, True);
MsgBox('Сохранения игры успешно удалены.', mbinformation, mb_ok);
end;
end;
end;
end;

[UninstallDelete]
Type: dirifempty; Name: "{pf}\PCGAME"
Type: dirifempty; Name: "{pf}\PCGAME\Игра"
Type: files; Name: "{pf}\PCGAME\Игра\log.txt"
Type: files; Name: "{pf}\PCGAME\Игра\multiplayer_log.txt"
Type: files; Name: "{pf}\PCGAME\Игра\stronghold.cfg"

1. Как сделать, чтобы выделенное красным тоже удалялось?
2. Если изменить папку назначения то вся эта фигня бессмысленна, как можно это решить?)))

R.i.m.s.k.y.
07-09-2012, 07:25
MogilShik2007, помоему у тебя кнопка ) западает
2. {app}\PCGAME
1. procedure RD(Dir:string);
begin
Exec('cmd.exe', ' /c rd /S /Q ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure RF(file:string);
begin
Exec('cmd.exe', ' /c del /F /Q ' + '"'+file+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then begin
RD(ExpandConstant('{app}'))
end;
end;

MogilShik2007
07-09-2012, 10:16
Не, неканает {app}, пропускает запрос на удаление сохранений...

Gnom_aka_Lexander
07-09-2012, 10:27
MogilShik2007, смотри. Папка {app}(папка, в которую была установлена программа) это то, что удаляется вообще по всякому. соответственно - проверяем - нету, запрос пропускается - чего не понятно?

MogilShik2007
07-09-2012, 10:52
Разобрался)))

MogilShik2007
07-09-2012, 13:08
Такой вопрос, на странице приветствия когда пишется мол будет установлена такая-то программа или игра, реально как-то название этой проги или игры своим цветом сделать?

Gnom_aka_Lexander
07-09-2012, 13:12
MogilShik2007, Можно (http://krinkels.org/showthread.php?p=13011#post13011).

MogilShik2007
07-09-2012, 13:48
Елки, посмотрел этот ReDrawText, там сам черт ногу сломит(((

MogilShik2007
07-09-2012, 16:26
Усе, победил таки с помощью ReDrawText, оказалась отличная штука)))

Подскажите какие цвета в формате color=$FF0000 поддерживает IS, а то не все хавает.

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

[Setup]
AppName=My prog
AppVerName=My prog
DefaultDirName={pf}\My prog

[Files]
Source: ISSkin.dll; DestDir: {app}; Flags: ignoreversion
Source: Tiger.cjstyles; DestDir: {app}; Flags: ignoreversion

[Code]
procedure LoadSkin(lpszPath: string; lpszIniFileName: string );
external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';

procedure LoadSkinUninst(lpszPath: string; lpszIniFileName: string );
external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';

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

procedure UnloadSkinUninst();
external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';

function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

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

function InitializeUninstall(): Boolean;
begin
FileCopy(ExpandConstant('{app}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True);
FileCopy(ExpandConstant('{app}\Tiger.cjstyles'), ExpandConstant('{tmp}\Tiger.cjstyles'), True);
LoadSkinUninst(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result := True;
end;

procedure DeinitializeUninstall();
begin
UnloadSkinUninst();
end;

Устанавливаться то со скином устанавливается, а удаляться не хочет выдает ошибку(((

Yury_Prizrak
07-09-2012, 17:10
Всем привет. Такой вопрос - как сделать чекбокс на последней странице с надписью "Запустить сервис?" и, если он нажат выполнить функцию


//StartService.
procedure StartService();
var
ResultCode: Integer;
ResultString: String;
begin
//Проверка инстал или апдейт
if not Installed then
begin
ResultString := ExpandConstant('start "' + IdentificationServiceEdit.Text + '"');
end
else
begin
ResultString := ExpandConstant('start "' + IdentificationService + '"');
end;

Exec('net', ResultString, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;




© OSzone.net 2001-2012