Войти

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

nik1967
19-06-2012, 12:57
Что-то там не так, ибо и под WinXP и под Win7 одно и то же описание =\ »Правильно, ты сам просил версию OnlyBelowVersion: 0,6.0.5999 - я так и сделал. Чтобы определял Win7, нужно изменить строчкуResult:= (Version.Major = 6) and (Version.Minor = 0) and (Version.Build = 5999);наResult:= (Version.Major = 6) and (Version.Minor = 1);
Windows versions:

4.0.950 Windows 95
4.0.1111 Windows 95 OSR 2 & OSR 2.1
4.0.1212 Windows 95 OSR 2.5
4.10.1998 Windows 98
4.10.2222 Windows 98 Second Edition
4.90.3000 Windows Me

Windows NT versions:

4.0.1381 Windows NT 4.0
5.0.2195 Windows 2000
5.1.2600 Windows XP
or Windows XP 64-Bit Edition Version 2002 (Itanium)
5.2.3790 Windows Server 2003
or Windows XP x64 Edition (AMD64/EM64T)
or Windows XP 64-Bit Edition Version 2003 (Itanium)
6.0.6000 Windows Vista
6.0.6001 Windows Vista with Service Pack 1
or Windows Server 2008
6.1.7600 Windows 7
or Windows Server 2008 R2
6.1.7601 Windows 7 with Service Pack 1
or Windows Server 2008 R2 with Service Pack 1
6.2.8102 Windows 8 Developer Preview

Ivan_009
20-06-2012, 11:34
Как сделать данную область прозрачной, чтобы был только текст... :search: Заранее спасибо за помощь...

Johny777
20-06-2012, 12:41
Ivan_009,
либо используй юникодную версию инно
либо создавай рядом с неименованным чекбоксом лейбл, прозрачный, и при нажатии на него нажимай на чекбокс
потом пример дам в этом сообщении
цвет надписи меняется при наведении на чекбокс?

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

вот пример:
сделал при наведении, но не уверен что работает
о вот с "поставить/снять" галку вроде всё в порядке!

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[ code]
var
Label1: TLabel;
Label_CheckBox: TNewCheckBox;

procedure LabelOnEnter(Sender: TObject);
begin
Label_CheckBox.OnEnter;
end;

procedure LabelOnClick(Sender: TObject);
begin
if Label_CheckBox.Checked = True then
begin
Label_CheckBox.Checked := False;
Exit;
end;

if Label_CheckBox.Checked = False then
begin
Label_CheckBox.Checked := True;
Exit;
end;
end;


procedure InitializeWizard();
begin

{ Label1 }
Label1 := TLabel.Create(WizardForm);
with Label1 do
begin
Parent := WizardForm;
Caption := 'название чекбокса';
Transparent := True;
OnClick := @LabelOnClick;
OnMouseEnter := @LabelOnEnter;
SetBounds(ScaleX(56),ScaleY(332),ScaleX(96),ScaleY(13));
end;

with WizardForm.WizardBitmapImage do
begin
Parent := WizardForm;
end;

{ Label_CheckBox }
Label_CheckBox := TNewCheckBox.Create(WizardForm);
with Label_CheckBox do
begin
Parent := WizardForm;
SetBounds(ScaleX(40),ScaleY(328),ScaleX(17),ScaleY(17));
Caption := '';
end;

end;

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

Ivan_009
20-06-2012, 13:16
Johny777, А это как убрать :o

nik1967
20-06-2012, 13:30
Ivan_009, уменьши размеры чекбокса.

Johny777
20-06-2012, 14:02
Ivan_009,
лейбл можно сделать безымянным
так же можно убрать функцию при наведении
вот используй обновлённый пример




[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[ code]
var
Label_CheckBox: TNewCheckBox;


procedure LabelOnClick(Sender: TObject);
begin
case Label_CheckBox.Checked of
False:
begin
Label_CheckBox.Checked := True;
Exit;
end;
True:
begin
Label_CheckBox.Checked := False;
Exit;
end;
end;
end;


procedure InitializeWizard();
begin

with WizardForm do
begin
OuterNotebook.Hide
with WizardBitmapImage do
begin
Parent := WizardForm;
Align := alClient;
Stretch := True
end;
end;

Label_CheckBox := TNewCheckBox.Create(WizardForm);
with Label_CheckBox do
begin
Parent := WizardForm;
SetBounds(ScaleX(40),ScaleY(328),ScaleX(12),ScaleY(12));
Caption := '';
end;

with TLabel.Create(WizardForm) do
begin
Parent := WizardForm;
Caption := 'название чекбокса';
Transparent := True;
OnClick := @LabelOnClick;
SetBounds(Label_CheckBox.Left + Label_CheckBox.Width + ScaleX(4),Label_CheckBox.Top - ScaleY(1),ScaleX(96),ScaleY(12));
Font.Color := clWhite;
end;

end;

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





если несколько чкебоксов с неименными лейблами, то используй Tag := у лейблов

Ivan_009
20-06-2012, 14:22
Johny777, У меня вопрос а почему при выделении установить дополнительное ПО при отказе установки все равно оно устанавливается.... :o Код:

Johny777
20-06-2012, 14:30
У тебя Ваня, насколько я вижу всё правильно
чекбокс точно не отмечен?
меня только смущает, что на шаге на котором ПО ставится отмену нажать нельзя (если только ты не юзаешь всякие библиотеки или коды, чтоб можно было)
вижу незнакомый мне IsDoneUnpack(CurStep)
может его тоже нужно отменять в процедуре отмены, чтоб до него не доходило

Ivan_009
20-06-2012, 16:21
Johny777, IsDoneUnpack(CurStep) это от IsDone код.... :drug: Можно как нибудь переделать...

nik1967
20-06-2012, 19:25
почему при выделении установить дополнительное ПО при отказе установки все равно оно устанавливается »Попробуй такIf Label_CheckBox.Checked and not CheckError then begin

Ivan_009
20-06-2012, 19:33
nik1967, Все равно устанавливается :( вот код

nik1967
20-06-2012, 19:49
Ivan_009, тогда такif (CurStep = ssPostInstall) and not ISDoneError then begin
If Label_CheckBox.Checked then begin
---------------

insombia
20-06-2012, 19:54
почему то линия стала кривой http://i39.fastpic.ru/big/2012/0620/f0/7ac5c2b284268eab8b5dc617e1ca91f0.jpg
полосы не видно

Johny777
20-06-2012, 23:57
insombia,
эдит пути перекрывается лейблом
тут одно из 2-х

1. Этот лейбл родной. Ты просто своё сообщение вставил. Родной лейбл не поддерживает прозрачность и потому перекрывает. Поэтому уменьши его размер по вертикали
так : Height := ScaleY(15);
или так (я ж не знаю как ты координаты записываешь)
SetBounds(ScaleX(0), ScaleY(0), ScaleX(256), ScaleY(15))
..................слева ........сверху.........ширина.......высота

2. этот лейбл кастомный, те самопальный
поэтому поставь ему в совойствах прозрачность True
Transparent:= True;
и отправь на задний план
SendToBack;
но лучше уменьши по вертикали его размер

insombia
21-06-2012, 11:36
del

t16bz
21-06-2012, 15:50
Здравствуйте, возможно ли использовать iswin 7 на деинсталляторе?

El Sanchez
21-06-2012, 16:36
Здравствуйте, возможно ли использовать iswin 7 на деинсталляторе? »
t16bz, http://forum.ru-board.com/topic.cgi?forum=5&topic=36421&start=2300#6
2. этот лейбл кастомный, те самопальный
поэтому поставь ему в совойствах прозрачность True
Transparent:= True;
и отправь на задний план
SendToBack; »
Johny777, TLabel не окно, его на задний/передний план никак.

Johny777
22-06-2012, 14:39
El Sanchez,
у меня вопрос касательно мутекса
для деинсталятора (использую форму Autorun)
раскидал так


[Setup]
AppMutex=MutexName



var
hMutex: THandle;

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';


procedure CreateAutoRun();
begin
hMutex := WINAPI_CreateMutex(0, False, '{#SetupSetting("AppMutex")}'); /// мутекс /// часть 2 из 3 /// начало
...
end;


procedure DeinitializeSetup;
begin
AutoRun.Hide;
UnloadSkin();


ReleaseMutex(hMutex);
CloseHandle(hMutex);
end;



если запущен деинсталятор и я запускаю основной инсталл, то вылетает месседж бокс "Ок/Отмена"
если запущен основной инсталл и потом запустить деинсталятор, то этого месседж бокса нет

скажи пожалуйста как его добавить

El Sanchez
22-06-2012, 17:23
если запущен деинсталятор и я запускаю основной инсталл, то вылетает месседж бокс "Ок/Отмена"
если запущен основной инсталл и потом запустить деинсталятор, то этого месседж бокса нет »
Johny777, не знаю, что ты там сделал, по коду этого не видно, но ругань работает в обоих случаях. Пример для наглядности:


[Setup]
AppMutex=ggghhhgggfxgxdfgzdfg

[Code]
function WINAPI_CreateMutex(lpMutexAttributes: Longint; bInitialOwner: BOOL; lpName: String): Longint; external 'CreateMutexA@kernel32.dll stdcall';
function ReleaseMutex(hMutex: Longint): BOOL; external 'ReleaseMutex@kernel32.dll stdcall';
function CloseHandle(hObject: Longint): BOOL; external 'CloseHandle@kernel32.dll stdcall';

var
hMutex: Longint;

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

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

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
case CurUninstallStep of
usUninstall: begin
with TForm.Create(nil) do //it's my own uninstaller form
begin
UninstallProgressForm.Hide;
SetBounds(0, 0, 200, 100);
ShowModal;
end;
end;
end;
end;

Johny777
22-06-2012, 18:16
El Sanchez,

в твоём примере мутекс освобождается по завершении работы инсталла и форма деинсталятора создаётся в procedure CurUninstallStepChanged
этот вариант отличный
для него хватило бы и родного (уже делал так)
Setup
AppMutex=ggghhhgggfxgxdfgzdfg
...
CreateMutex('ggghhhgggfxgxdfgzdfg');
у меня была задумка перенести деинсталятор в основной скрипт, но с этим я обломался,
вот наработка

procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload';

var
Delete_Form: TSetupForm;




function InitializeUninstall(): Boolean;
var
hl2_Checkbox, ep1_Checkbox, ep2_Checkbox, portal_Checkbox: TCheckBox;


begin
FileCopy(ExpandConstant('{app}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), False);
FileCopy(ExpandConstant('{app}\steam.cjstyles'), ExpandConstant('{tmp}\steam.cjstyles'), False);

begin
LoadSkinU(ExpandConstant('{tmp}\steam.cjstyles'), '');
Delete_Form := CreateCustomForm();
with Delete_Form do
begin
Position := poScreenCenter;
ClientWidth := ScaleX(500);
ClientHeight := ScaleY(500);
Color := clBtnFace;
DeleteMenu(GetSystemMenu(Delete_Form.Handle,False), $F060,0); /// ñäåëàòü êíîïêó "çàêðûòü" íåàêòèâíîé
SetClassLong(Delete_Form.Handle, -26, GetClassLong(Delete_Form.Handle, -26) or $200); /// áëîêèðîâêà êîìáèíàöèè alt + f4
SendMessage(Delete_Form.Handle, $0080, 0, LoadImage(0,ExpandConstant('{tmp}')+'\LIcon.ico',1,16,16,$1010)); /// èêîíêà â óãëó
end;

with TButton.Create(Delete_Form) do
begin
Parent := Delete_Form;
Caption := ExpandConstant(SetupMessage(msgButtonNo));
SetBounds(ScaleX(3), ScaleY(100), ScaleX(71), ScaleY(25));
ModalResult:= mrCancel;
end;

with TButton.Create(Delete_Form) do
begin
Caption := ExpandConstant(SetupMessage(msgButtonYes));
Parent := Delete_Form;
SetBounds(ScaleX(80), ScaleY(100), ScaleX(71), ScaleY(25));
ModalResult := mrYes;
end;

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

ep1_Checkbox := TCheckBox.Create(Delete_Form);
with ep1_Checkbox do
begin
Parent := Delete_Form;
Caption := 'ep1';
SetBounds(ScaleX(80), 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 := TCheckBox.Create(Delete_Form);
with ep2_Checkbox do
begin
Parent := Delete_Form;
Caption := 'ep2';
SetBounds(ScaleX(80), 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 := TCheckBox.Create(Delete_Form);
with portal_Checkbox do
begin
Parent := Delete_Form;
Caption := 'portal';
SetBounds(ScaleX(80), ep2_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
Checked := False;
Enabled := FileExists(ExpandConstant('{app}\common\portal\hl2.exe'));
end;
end;


case
Delete_Form.ShowModal() of
mrNo :
begin
UnloadSkinU();
Delete_Form.Free;
end;

mrYes :
begin
if hl2_Checkbox.Checked = true 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('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'AuroraB', '', ExpandConstant('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'hl2_ru', '', ExpandConstant('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'hl2_ru_buka', '', ExpandConstant('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'hl2_en', '', ExpandConstant('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'hl2_ru_en', '', ExpandConstant('{app}\uninstall\parameters.ini'));
end;

if ep1_Checkbox.Checked = true 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('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep1_ru', '', ExpandConstant('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep1_en', '', ExpandConstant('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep1_ru_en', '', ExpandConstant('{app}\uninstall\parameters.ini'));
end;

if ep2_Checkbox.Checked = true 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('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep2_ru', '', ExpandConstant('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep2_en', '', ExpandConstant('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep2_ru_en', '', ExpandConstant('{app}\uninstall\parameters.ini'));
end;

if portal_Checkbox.Checked = true 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('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'portal_ru', '', ExpandConstant('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'portal_en', '', ExpandConstant('{app}\uninstall\parameters.ini'));
SetIniString('Installed', 'portal_ru_en', '', ExpandConstant('{app}\uninstall\parameters.ini'));
end;


//

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;

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'));
//
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
DelTree(ExpandConstant('{userprograms}\Source Engine 15'), True, True, True);
UnloadSkinU();
Delete_Form.Free;
Result := True;
end;
end;
end;
end;

не смог в конце Case Yes, если нет всех четырёх экзешников не дать появиться стандартным:
1 месседжбокс "Вы уверены, что хотите удалить "да/Нет""
2 Создание UninstallProgressForm
короче как в параметре VERYSILIENT для деинсталятора, хотя месседж бокс в самом конце с текстом "Приложение полностью удалено" не помешал бы

поэтому, как изначально задумывалось
деинсталятор это отдельно скомпилированная программа (отдельный скрипт),
которая копируется вместе с остальными файлами во время установки в app\uninstall
вот так в основном инсталле

Files
Source: uninstall\Setup\Uninstall.exe; DestDir: {app}\uninstall; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak;


Code

procedure CurStepChanged(CurStep: TSetupStep);


begin
case CurStep of
ssInstall :
begin
...

if FileExists(ExpandConstant('{app}\uninstall\unins000.exe')) then DeleteFile(ExpandConstant('{app}\uninstall\unins000.exe'));
if FileExists(ExpandConstant('{app}\uninstall\unins007.dat')) then DeleteFile(ExpandConstant('{app}\uninstall\unins007.dat'));
if FileExists(ExpandConstant('{app}\uninstall\unins007.exe')) then DeleteFile(ExpandConstant('{app}\uninstall\unins007.exe'));


...

ssDone :
begin

if FileExists(ExpandConstant('{app}\uninstall\unins000.exe')) then RenameFile(ExpandConstant('{app}\uninstall\unins000.exe'), ExpandConstant('{app}\uninstall\unins007.exe'));
if FileExists(ExpandConstant('{app}\uninstall\unins000.dat')) then RenameFile(ExpandConstant('{app}\uninstall\unins000.dat'), ExpandConstant('{app}\uninstall\unins007.dat'));
if FileExists(ExpandConstant('{app}\uninstall\Uninstall.exe')) then RenameFile(ExpandConstant('{app}\uninstall\Uninstall.exe'), ExpandConstant('{app}\uninstall\unins000.exe'));

SetFileAttributes(PChar(ExpandConstant('{app}\uninstall\unins007.exe')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes(PChar(ExpandConstant('{app}\uninstall\unins007.dat')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);

те подменяю созданный автоматом родной инсталл, на свой, который = форма , а родной запускается так (в конце процедуры Uninstall переменная типа Boolean, которая, если Тру даёт команду на запуск родного в очень тихом режиме, в конце деинициализации )
не знаю, что ты там сделал, по коду этого не видно »
вот код самой последней версии деинсталятора (вариант на форме)

#define MyAppName "Uninstall"

[Setup]
AppId=proto15
SourceDir=.
OutputDir=C:\Program Files (x86)\Source Engine 15\uninstall
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false
//SetupIconFile=hl2.ico
//BitmapResource=bgnd:orangebox.bmp
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no
BitmapResource=bgnd:Cremator2.bmp
AppMutex=Mutex_proto15


[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=смести


[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl
Name: en; MessagesFile: compiler:Languages\English.isl

[Files]
Source: ISSkin.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: steam.cjstyles; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: icon.ico; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[ Code]
////////////////////////////////////////////////////////////////////////
var
AutoRun: TForm;
ResultCode: Integer;
hl2_Checkbox, ep1_Checkbox, ep2_Checkbox, portal_Checkbox: TCheckBox;
ExitButton, UninstallButton: TButton;
SaveBtn: TNewSpeedButton;
Delete_All: Boolean;
/// мутекс /// часть 1 из 3 /// начало

var
hMutex: THandle;

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';
/// конец


/// тень окна /// начало
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint; external 'SetClassLongA@user32 stdcall';
/// конец
function LoadImage(hInst: THandle; ImageName: PChar; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle; external 'LoadImageA@user32.dll stdcall delayload'; /// иконка на папку часть 1

////////// скин /// часть 1 из 2 /// начало
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';



/////////// таскать окно за любую область /// начало
type
TANewStatic = record
Static : TNewStaticText;
end;

var
ANewStatic : array of TANewStatic;

function ReleaseCapture(): Longint; external 'ReleaseCapture@user32.dll stdcall';

procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(AutoRun.Handle,$0112,$F012,0)
end;

procedure AddStaticToArray(st:TNewStaticText);
var
i:integer;
begin
i:=GetArrayLength(ANewStatic);
SetArrayLength(ANewStatic,i+1);
ANewStatic[i].Static:=st;
ANewStatic[i].Static.OnMouseDown:=@MouseDown;
end;

procedure StaticChange(c:TWinControl);
var
i:integer;
begin
for i:=0 to c.ControlCount-1 do
if c.Controls[i] is TWinControl then
begin
if c.Controls[i] is TNewStaticText then AddStaticToArray(TNewStaticText(c.Controls[i]));
if TWinControl(c.Controls[i]).ControlCount>0 then StaticChange(TWinControl(c.Controls[i]));
end;
end;
/// конец
//////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////

procedure Unstall(Sender: TObject);
begin
Delete_All := False;

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

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

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

SetIniString('Installed', 'ep1', '', ExpandConstant('{src}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep1_ru', '', ExpandConstant('{src}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep1_en', '', ExpandConstant('{src}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep1_ru_en', '', ExpandConstant('{src}\uninstall\parameters.ini'));
end;

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

SetIniString('Installed', 'ep2', '', ExpandConstant('{src}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep2_ru', '', ExpandConstant('{src}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep2_en', '', ExpandConstant('{src}\uninstall\parameters.ini'));
SetIniString('Installed', 'ep2_ru_en', '', ExpandConstant('{src}\uninstall\parameters.ini'));
end;

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

SetIniString('Installed', 'portal', '', ExpandConstant('{src}\uninstall\parameters.ini'));
SetIniString('Installed', 'portal_ru', '', ExpandConstant('{src}\uninstall\parameters.ini'));
SetIniString('Installed', 'portal_en', '', ExpandConstant('{src}\uninstall\parameters.ini'));
SetIniString('Installed', 'portal_ru_en', '', ExpandConstant('{src}\uninstall\parameters.ini'));
end;


if not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode one\hl2.exe'))) and
not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode two\hl2.exe'))) then

begin
DeleteFile(ExpandConstant('{src}\..\episode 1 shared.gcf'));
DeleteFile(ExpandConstant('{src}\..\episodic 2007 shared.gcf'));
DeleteFile(ExpandConstant('{src}\..\half-life 2 episode one russian.gcf'));
end;


if not(FileExists(ExpandConstant('{src}\..\common\half-life 2\hl2.exe'))) and
not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode one\hl2.exe'))) and
not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode two\hl2.exe'))) then

DeleteFile(ExpandConstant('{src}\..\half-life 2_russian.gcf'));


if not(FileExists(ExpandConstant('{src}\..\common\half-life 2\hl2.exe'))) and
not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode one\hl2.exe'))) and
not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode two\hl2.exe'))) and
not(FileExists(ExpandConstant('{src}\..\common\portal\hl2.exe'))) then

begin
DelTree(ExpandConstant('{userprograms}\Source Engine 15'), True, True, True);
Delete_All := True;
end;

AutoRun.Close;

end;

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

///////////////////////////////////////////////////////////

procedure CreateAutoRun();
var
Save_Label: TLabel;

begin
hMutex := WINAPI_CreateMutex(0, False, '{#SetupSetting("AppMutex")}'); /// мутекс /// часть 2 из 3 /// начало

AutoRun := TForm.Create(nil);
with AutoRun do
begin
BorderStyle := bsDialog;
SetClassLong(AutoRun.Handle, (-26), GetWindowLong(AutoRun.Handle, (-26)) or $00020000); //тень окна
Position := poScreenCenter;
Caption := 'Uninstall';
ClientWidth := ScaleX(634);
ClientHeight := ScaleY(586);

with TBitmapImage.Create(AutoRun) do
begin
Parent := AutoRun;
Bitmap.LoadFromResourceName(HInstance, '_IS_BGND');
SetBounds(ScaleX(0), ScaleY(0), ScaleX(640), ScaleY(586));
Hint := ExpandConstant('{cm:Cremator}');
ShowHint := True
ParentShowHint := False;
OnMouseDown := @MouseDown;
end;

Save_Label := Tlabel.Create(AutoRun)
with Save_Label do
begin
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;
Parent := AutoRun;
Font.Color := $48c1ca;
end;

with Tlabel.Create(AutoRun) do
begin
SetBounds(ScaleX(460), ScaleY(50), ScaleX(270), ScaleY(16));
AutoSize := False;
Caption := ExpandConstant('{cm:Save}');
Transparent := True;
WordWrap := True;
Parent := AutoRun;
Font.Color := $48c1ca;
Font.Size := 8;
end;

with Tlabel.Create(AutoRun) do
begin
SetBounds(ScaleX(343), ScaleY(0), ScaleX(297), ScaleY(586));
AutoSize := False;
Caption := '';
Transparent := True;
Parent := AutoRun;
OnMouseDown := @MouseDown;
end;
end;

///

ExtractTemporaryFile('icon.ico');
SendMessage(AutoRun.Handle, $0080, 0, LoadImage(0,ExpandConstant('{tmp}')+'\icon.ico',1,16,16,$1010));

///

UninstallButton := TButton.Create(AutoRun);
with UninstallButton do
begin
Parent := AutoRun;
SetBounds(ScaleX(500), ScaleY(527), ScaleX(69), ScaleY(23));
Cursor := crHand;
Caption := ExpandConstant(SetupMessage(msgButtonYes));
OnClick := @Unstall;
end;

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


SaveBtn := TNewSpeedButton.Create(AutoRun);
with SaveBtn do
begin
Parent := AutoRun;
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}');
OnClick := @Run_SAVE;
Enabled := FileExists(ExpandConstant('{src}\SAVE.exe'));
ThemeEnabled := False;
Style := nsbButton;
Font.Size := 8;
Font.Color := $48c1ca;
end;


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

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

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

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

AutoRun.Repaint;
AutoRun.ShowModal;
end;

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

procedure DeinitializeSetup;
begin
AutoRun.Hide;
Sleep(200);
UnloadSkin();
/// мутекс /// часть 3 из 3 /// начало
ReleaseMutex(hMutex);
CloseHandle(hMutex);
/// конец
if Delete_All = True then Exec(ExpandConstant('{src}\unins007.exe'),'/VERYSILENT','', SW_SHOW, ewNoWait, ResultCode);
end;


если нужно с файлам, то выложу :)

с этим удалением (у этого кода) и отсутствует месседжбокс при конфликте мутекса,
те код который у тебя в примере выполняется у меня в деинсталяторе, но без месседжбокса не дающего ему, деинсталятору, запуститься
в основном скрипте я товй код пока не использую
там стоит просто
Setup
AppMutex=ggghhhgggfxgxdfgzdfg
...
CreateMutex('ggghhhgggfxgxdfgzdfg');

================================================== нашёл
procedure CreateAutoRun();

begin
if CheckForMutexes('{#SetupSetting("AppMutex")}') then MsgBox('Мутекс', mbError, MB_ICONINFORMATION ); /// мутекса ещё нет и месседжбокса не будет
hMutex := WINAPI_CreateMutex(0, False, '{#SetupSetting("AppMutex")}'); создаём мутекс
if CheckForMutexes('{#SetupSetting("AppMutex")}') then MsgBox('Мутекс', mbError, MB_ICONINFORMATION ); /// появляется месседж бокс
думаю мутекс так и надо создавать в InitializeWizard, а проверку делать в InitializeSetup
буду разбирать!




© OSzone.net 2001-2012