Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: NightW0lf
Дата сообщения: 25.05.2007 10:56
ZavadS
Попробуй вариант предложенный мною.
Автор: ZavadS
Дата сообщения: 25.05.2007 11:12
NightW0lf Но мне желательно не по классу окна определять запущенную программу.

Автор: Sero
Дата сообщения: 25.05.2007 12:12
Люди!
как сделать WizardForm - "Always on top"
Автор: Genri
Дата сообщения: 25.05.2007 12:13
ZavadS

Цитата:
Запускаю удаление русификатора, выскакивает вот такая ошибка
...................
Runtime Error (at 27:66):

Could not call proc.


Потому что не найдена длл-ка при деинсталляции. Надо примерно так:

Код:
[Setup]
AppName=My Program
AppVerName=My Program ver.1.5
DefaultDirName={pf}\My Program

[Files]
Source: "ISTask.dll"; DestDir: "{app}"


[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload setuponly';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload setuponly';

function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';


function InitializeSetup(): Boolean;
begin
If RunTask('calc.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTask('calc.exe');
Result := True;
end else
Exit;
end;
Result := True;
begin
If RunTask('notepad.exe', false) then
begin
KillTask('notepad.exe');
Result := True;
end else
Exit;
end;
end;

function InitializeUninstall(): Boolean;
begin
If RunTaskA('calc.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTaskA('calc.exe');
Result := True;
end else
Exit;
end;
Result := True;
begin
If RunTaskA('notepad.exe', false) then
begin
KillTaskA('notepad.exe');
Result := True;
end else
Exit;
end;
end;
Автор: maxdddca123
Дата сообщения: 25.05.2007 12:28
Genri
Подскажи плиз: у меня есть 2 ини файла: 1 на дискете и 1 на компе. Значит мне надо перенести параметр из файла на дискете (в файле на дискете только 1 секция [User_1]) в файл на компе, в котором может быть сколь угодно много однотипных секций с названиями Box_x, где х просто номер абонента.
Вот пример содержания файла на дискете

[User_1]
EMail=********************
FName=Test_7699
IMNS_1=7699
IMNSCount=1
INN=7699999999
Key=NiVbpm
KeyID=TEST2007
KPP=769901001
Login=7699999
Monitor=******************
Password=*************
SName=Test_7699

Вот пример файла на компе:

[Box_1]
SMTPPort=25
SMTPPassword=
SMTPLogin=
SMTPEnabled=1
SMTPAuth=0
SMTPAddr=хххххх
POP3Port=110
POP3Password=ххххххх
POP3Login=ххххххх
POP3Enabled=1
POP3Addr=хххххх
OperatorsCount=1
Operator_1_KeyID=ххххххххх
Operator_1_Addr=хххххххххххххххх
OnlineURL=
Name=Тестовый абонент
KeyID=TEST2007
INN=7699999999
IFNSCount=2
IFNS_2_KeyID=A6ZA7699
IFNS_2_Addr=хххххххххххххх
IFNS_1_KeyID=A6ZA7699
IFNS_1_Addr=ххххххххххх
EMail=7699999@nalog.kamisever.ru
Dialup=
CryptoType=0
BoxName=7699999

[Box_2]
SMTPPort=25
SMTPPassword=
SMTPLogin=
SMTPEnabled=1
SMTPAuth=0
SMTPAddr=ххххххххххх
POP3Port=110
POP3Password=хххххххххххххх
POP3Login=7699999
POP3Enabled=1
POP3Addr=****************
OperatorsCount=1
Operator_1_KeyID=MONITOR6
Operator_1_Addr=*********************
OnlineURL=
Name=Тестовый абонент
KeyID=TEST2007
INN=767777777
IFNSCount=2
IFNS_2_KeyID=A6ZA7699
IFNS_2_Addr=************
IFNS_1_KeyID=A6ZA7699
IFNS_1_Addr=***************
EMail=7699999@nalog.kamisever.ru
Dialup=
CryptoType=0
BoxName=7699998

Вопрос: как мне перенести из файла на дискете например параметр KeyID именно в ту секцию [Box_х] файла на компе, с которой совпадает параметрам BoxName на компе и Login на дискете.... Другими словами алгоритм таков: читается Login с файла на дискете, ищется в файле на компе в каждой секции параметр BoxName, и при совпадении Login и BoxName, KeyID с дискеты перетаскивается в KeyID на компе именно в ту секцию, где найдено совпадение !!!.

Вот скрипт, который необходимо доработать: (работает только для 1 секции)
procedure Boxname();
var
region:string;
begin
if FileExists('A:\Asetup.ini') then begin
region := GetIniString('User_1', 'KeyID', '', 'A:\Asetup.ini');
SetIniString('Box_1', 'KeyID', region, ExpandConstant('{app}\') + 'Referent_setup.ini');
end else MsgBox('Вставлена неверная дискета', mbError, MB_OK);
end;
Автор: Genri
Дата сообщения: 25.05.2007 12:37
ZavadS -- В том варианте, который указан выше, после деинсталляции остается папка программы, так как из нее не удалена длл-ка. Можно, конечно, удаление папки прописать отдельно, но это достаточно опасно, так как теоретически, пользователь может проинсталить программу в папку Windows со всеми вытекающими

Лучше использовать [more=такой вариант]
Код:
[Setup]
AppName=My Program
AppVerName=My Program ver.1.5
DefaultDirName={pf}\My Program

[Files]
Source: "ISTask.dll"; DestDir: "{app}"

[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload setuponly';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload setuponly';

function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';

function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';


function InitializeSetup(): Boolean;
begin
If RunTask('calc.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTask('calc.exe');
Result := True;
end else
Exit;
end;
Result := True;
begin
If RunTask('notepad.exe', false) then
begin
KillTask('notepad.exe');
Result := True;
end else
Exit;
end;
end;

function InitializeUninstall(): Boolean;
begin
RenameFile(ExpandConstant('{app}\ISTask.dll'), ExpandConstant('{tmp}\ISTask.dll'));

If RunTaskA('calc.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTaskA('calc.exe');
Result := True;
end else
Exit;
end;
Result := True;
begin
If RunTaskA('notepad.exe', false) then
begin
KillTaskA('notepad.exe');
Result := True;
end else
Exit;
end;
end;
Автор: maxdddca123
Дата сообщения: 25.05.2007 14:39
Genri
Упрощу задачу, спрошу короче: я нашёл параметр, как мне определить, к какой секции он относится ? Или можеть есть какая нить ф-ция GetSectionName ???
Автор: ZavadS
Дата сообщения: 25.05.2007 15:05
Genri
Все работает. Первый вариант лучший, потому что когда я запускаю деинсталлятор и отказываюсь от удаления, Файл ISTask.dll остается на месте и я могу позже опять запустить деинсталлятор без ошибки. Со вторым вариантом так не сработает, потому нужно еще дописать код для удаления ISTask.dll. Как лучше можно удалить этот файл?



Добавлено:

Цитата:
Можно, конечно, удаление папки прописать отдельно, но это достаточно опасно, так как теоретически, пользователь может проинсталить программу в папку Windows со всеми вытекающими

Я ISTask.dll прописываю в папку Install_Rus а в процедуре на удаление меняю


Цитата:
MoveDir(ExpandConstant('{app}\Install_Rus\Backup\'), ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Install_Rus\Backup\'));
RemoveDir(ExpandConstant('{app}\Install_Rus\'));
end;
end;

на
Цитата:
MoveDir(ExpandConstant('{app}\Install_Rus\Backup\'), ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Install_Rus\Backup\'));
DelTree(ExpandConstant('{app}\Install_Rus'), True, True, True);
end;
end;

но все равно папка Install_Rus с ISTask.dll не удаляется.



Автор: Sero
Дата сообщения: 25.05.2007 15:57

Цитата:
как сделать WizardForm - "Always on top"

Никто не знает?
Автор: Genri
Дата сообщения: 25.05.2007 18:16
maxdddca123 -- к сожалению, аналога ReadSections в инно нет. Приходится прописывать самому.

Код:
var
SectionNames: TArrayOfString;
Asetup, Referent: string;

procedure GetSectionNames(const filename: string; var SectNames: TArrayOfString);
var
i, SectionCount: integer;
IniStrings: TArrayOfString;
begin
LoadStringsFromFile(filename, IniStrings);
for i:= 0 to GetArrayLength(IniStrings)-1 do
begin
if IniStrings[i][1] = '[' then
begin
SectionCount:= SectionCount + 1;
SetArrayLength(SectNames, SectionCount);
Delete(IniStrings[i], 1, 1);
Delete(IniStrings[i], Length(IniStrings[i])-1, 2);
SectNames[SectionCount - 1]:= IniStrings[i];
end;
end;
end;

procedure SetKeyID();
var
login, KeyID: string;
i: integer;
begin
login:= GetIniString('User_1', 'Login', '', Asetup);
KeyID:= GetIniString('User_1', 'KeyID', '', Asetup);
GetSectionNames(Referent, SectionNames);

for i:= 0 to GetArrayLength(SectionNames)-1 do
begin
if GetIniString(SectionNames[i], 'BoxName', '', Referent) = login then
begin
SetIniString(SectionNames[i], 'KeyID', KeyID, Referent);
end;
end;
end;

procedure Boxname();
begin
Referent:= ExpandConstant('{app}\Referent_setup.ini');
Asetup:= 'A:\Asetup.ini';
GetSectionNames(Referent, SectionNames);
SetKeyID();
end;
Автор: boss911
Дата сообщения: 25.05.2007 18:17
Genri

Цитата:
В данном случае, я думаю тебе, тебе без разницы - указывать билд или нет

Ок, а если я укажу билд, тогда на что это повлияет и, чему помешает? Просто так толком и не вьехал, почему необязателен билд!
Автор: Genri
Дата сообщения: 25.05.2007 19:58
boss911
Цитата:
так толком и не вьехал, почему необязателен билд
-- если укажешь, инсталлятор будет проверять номер билда, не укажешь - не будет. Но так как сомневаюсь что тебе попадется Windows XP SP2 билда отличного от 2600 - билд можно не указывать.

Почитай хелп, поэкспериментируй.
Автор: boss911
Дата сообщения: 25.05.2007 22:19
Genri

Цитата:
Почитай хелп, поэкспериментируй.

Так где эксперементировать то, у всех XP SP2.
Автор: GloThin
Дата сообщения: 25.05.2007 22:49
boss911
01:19 26-05-2007
Цитата:
Genri

Цитата:Почитай хелп, поэкспериментируй.

Так где экспериментировать то, у всех XP SP2.


мона с ключами реестра эксперементировать...
Сохрани нормальное состояние для ХП СП2....
А потом подкоректируй...;)
Кличи реестра в энтом топике давно уж, и не раз проявилися...;)
Автор: Genri
Дата сообщения: 26.05.2007 01:41
Sero
Цитата:
как сделать WizardForm - "Always on top"
-- а ты уверен, что этого хочешь ? Ну попробуй:

Код:
[Setup]
AppName=My Program
AppVerName=My Program ver.1.5
DefaultDirName={pf}\My Program

[Code]
Const
HWND_TOP = 0;
HWND_TOPMOST = -1;
HWND_NOTOPMOST = -2;
SWP_NOSIZE = $1;
SWP_NOMOVE = $2;
SWP_NOZORDER = $4;
SWP_NOREDRAW = $8;
SWP_NOACTIVATE = $10;
SWP_FRAMECHANGED = $20;
SWP_SHOWWINDOW = $40;
SWP_HIDEWINDOW = $80;
SWP_NOCOPYBITS = $100;
SWP_NOOWNERZORDER = $200;
SWP_DRAWFRAME = SWP_FRAMECHANGED;
SWP_NOREPOSITION = SWP_NOOWNERZORDER;

function SetWindowPos(hWnd, hWndInsertAfter,
X, Y, cx, cy, wFlags: Longint):Boolean;
external 'SetWindowPos@user32.dll stdcall';

procedure InitializeWizard;
begin
SetWindowPos(WizardForm.Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOSIZE or SWP_NOMOVE or SWP_SHOWWINDOW);
end;
Автор: Genri
Дата сообщения: 26.05.2007 09:17
ZavadS
Цитата:
Как лучше можно удалить этот файл?
-- А попробуй [more=такой вариант]
Код:
[Setup]
AppName=My Program
AppVerName=My Program ver.1.5
DefaultDirName={pf}\My Program

[Files]
Source: "ISTask.dll"; DestDir: "{app}"

[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload setuponly';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload setuponly';

function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';


function InitializeSetup(): Boolean;
begin
If RunTask('calc.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTask('calc.exe');
Result := True;
end else
Exit;
end;
Result := True;
begin
If RunTask('notepad.exe', false) then
begin
KillTask('notepad.exe');
Result := True;
end else
Exit;
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
UnloadDLL(ExpandConstant('{app}\ISTask.dll'));
end;
end;

function InitializeUninstall(): Boolean;
begin
If RunTaskA('calc.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTaskA('calc.exe');
Result := True;
end else
Exit;
end;
Result := True;
begin
If RunTaskA('notepad.exe', false) then
begin
KillTaskA('notepad.exe');
Result := True;
end else
Exit;
end;
end;
Автор: Sero
Дата сообщения: 26.05.2007 10:03
Genri
Спасибо,работает,НО есть проблема:
Например если нажать на Отмена!
Можно исправить это?
Автор: NightW0lf
Дата сообщения: 26.05.2007 10:45
Всем привет!
Такой вопрос - возможноли сделать так т.е. чтобы картинка была во всех окнах [и на всех страницах кроме привествия и завершения] инсталлятора, а то просто у меня пример как сделать только для страницы привествия и завершения.
Автор: jedi81
Дата сообщения: 26.05.2007 12:15
А возможно создать пакет инсталяции с кодом вопрос и ответ? То есть при инсталяции на один ПК программа выдает код вопрос, вводим код ответ. Но если запустить на другом ПК код вопрос будет другой и код ответ соотвественно тоже.
Автор: Yalos
Дата сообщения: 26.05.2007 15:03
соори если уже было...
ситуевина:

[Files]
Source: "D:\Docum\*"; DestDir: "{app}"; Flags: ignoreversion

в исходном каталоге (D:\Docum) лежит чуть меньше тысячи *.html , все они с атрибутами HIDEN и SYSTEM , и только один файл, главный без этих арибутов.
(это сделано для того, чтобы пользователи пользовались икнкой на рабочем столе, а в случае, если забредут в папку где это все лежит, чтобы поднимали не что попало, а индекс).
при создании инсталлятора добавляется только главный файл, остальные игнорирутся...
создавать дополнительный файл, содержащий их не хочется, т.к. они регулярно меняются. как быть?
Автор: maxdddca123
Дата сообщения: 26.05.2007 15:15
Genri
Спасибо за альтернативный вариант, я правда по другому сделал, но твой тоже пригодится. У меня ещё такой каверзный вопрос: мне необходимо сравнить 2 значения ини файла. Они всегда одинаковы, за исключением одной буквы, общяя маска такова:
????[буква]??? (например 7700А000). Дак вот, если буква первого значения более старшая по алфавиу, то прерывать установку (или там цветом подсвечивать это у же я сам), если равны, то не устанавливать просто, а если буква из первого значения более ранняя по алфавиту чем у второго, то производить установку. Вот подскажи как можно осуществить сравнение букв по 'старшинству' ?

И сразу ещё вопрос: как изменить цвет надписи в
MsgBox('Идентификация дискеты:'+ chr(13)+ 'Владелец:'+GetIniString('User_1', 'FName', '', 'A:\Asetup.ini')+ chr(13)+'ИД ключа:'+GetIniString('User_1', 'KeyID', '', 'A:\Asetup.ini')+ chr(13)+ 'Информация верна ?' , mbConfirmation, MB_YESNO)
Мне например надпись ИД ключа:'+GetIniString('User_1', 'KeyID', '', 'A:\Asetup.ini') надо сделать красным цвето. Это возможно ?
Если нет то можешь подсказать как сделать CreateCustomPage с выведением этих же параметров, вопроса о верности информации после нажатия далее и с цветом. Заранее благодарю Вас !
Автор: Yalos
Дата сообщения: 26.05.2007 15:37
maxdddca123
Ord(Copy(Text1,5,1)) > Ord(Copy(Text2,5,1))
Автор: maxdddca123
Дата сообщения: 26.05.2007 15:56
Yalos
Спасибо.
Ещё бы с цветами разобраться....
Автор: Yalos
Дата сообщения: 26.05.2007 16:03
а мне бы с устновкой атрибутов на файлы...

[Run]
Filename: "attrib"; Parameters: " +S +H {app}\listing_*.html"

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

------

цвет в стандартном MsgBox ???? очень сомневаюсь. только если свой прикрутишь
Автор: ZavadS
Дата сообщения: 26.05.2007 16:25
Кто может подправить этот код.


Цитата:
function NextButtonClick(CurPage: Integer): Boolean;
var
sz:Integer;
s:string;
begin
Result:=True;
If CurPage=6 then
//Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения
begin
If (FileSearch('oodcnt.exe', ExpandConstant('{app}'))='')
then
begin
s:='Извините, в директории '+ExpandConstant('{app}')+'' #13 'не обнаружены файлы, подтверждающие подлинность программы.' #13#13 'Пожалуйста, выберите правильный путь для установки обновления.';
MsgBox(s, mbError, mb_Ok);
Result:= False
end
else
//И проверка размера оригинальных файлов
begin
If FileSize(ExpandConstant('{app}')+'\oodcnt.exe', sz)
then
begin
If sz<>2545161 //Проверяемый размер в байтах
then
begin
s:='Размер установленого компонента oodcnt.exe не соответствует.' #13#13 'Для установки обновления требуются оригинальные файлы.';
MsgBox(s, mbCriticalError, mb_Ok);
Result:= False
end;
end;
end;
end;
end;


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

Добавлено:
Genri твой последний код отлично вписался в мой. благодарю за помощь.
Автор: maxdddca123
Дата сообщения: 26.05.2007 16:45
Ещё мелкий вопросик: что означает св-во Tag ? У кнопки например.
Автор: Chuvakstepan
Дата сообщения: 26.05.2007 17:38
Кто-нибудь поможет мне вот с этим вопросом:

Надо скрестить два кода:

1. Мой код в котором реализованны кнопки управления музыкой (без текстур) + те-же кнопки вместе с измененным окном процесса установки: вот [more=код]
[Setup]
AppName=S.T.A.L.K.E.R.: Shadow of Chernobyl
AppVerName=S.T.A.L.K.E.R.: Shadow of Chernobyl (полная русская версия)
AppPublisher=Chuvakstepan Inc.
DefaultDirName={pf}\Chuvakstepan\S.T.A.L.K.E.R
DefaultGroupName=Chuvakstepan\S.T.A.L.K.E.R
Compression=zip
SolidCompression=false
OutputBaseFilename=setup
UninstallFilesDir={app}
WindowVisible=yes
WindowResizable=no
WindowShowCaption=no
BackColor=$000000
BackSolid=yes
VersionInfoVersion=1.0.0.1
VersionInfoCompany=Chuvakstepan Inc.
VersionInfoCopyright=GSC
DiskSpanning=yes
DiskSliceSize=723517440
UseSetupLdr=true
Outputdir=C:\Для кодировки\Test\
LicenseFile=compiler:License.rtf
WizardImageFile=compiler:st_wel.bmp
WizardSmallImageFile=compiler:st_head.bmp


[Files]
Source: compiler:BASS.dll; DestDir: " {tmp} "; Flags: dontcopy noencryption
Source: compiler:sound.mp3; DestDir: {tmp}; Flags: dontcopy noencryption nocompression
Source: compiler:Splash.bmp; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:isxbb.dll; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:splash.bmp; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:1.jpg; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:2.jpg; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:3.jpg; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:4.jpg; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:5.jpg; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:6.jpg; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:7.jpg; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:8.jpg; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:9.jpg; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:License.rtf; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:st_fin.bmp; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:Background.bmp; DestDir: {tmp}; Flags: dontcopy noencryption
Source: compiler:get_hw_caps.dll; Flags: dontcopy noencryption
Source: compiler:website.url; DestDir: {app}; Tasks: url
Source: compiler:websitegameSTALKER.url; DestDir: {app}; Tasks: url
Source: C:\Игры\Test Drive Unlimited\Readme.htm; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: compiler:KillSave from 1C\killsave.exe; DestDir: {app}; Flags: ignoreversion
Source: compiler:KillSave from 1C\Kill.ini; DestDir: {app}; Flags: ignoreversion





[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}
Name: url; Description: Создать ссылки на интернет-сайты в меню пуск; GroupDescription: {cm:AdditionalIcons}


[Icons]
Name: {userdesktop}\S.T.A.L.K.E.R.; Filename: {app}\bin\XR_3DA.exe; Tasks: desktopicon; Flags: createonlyiffileexists; WorkingDir: {app}\bin
Name: {group}\Начать игру; Filename: {app}\bin\XR_3DA.exe; Flags: createonlyiffileexists; WorkingDir: {app}\bin
Name: {group}\Руководство; Filename: {app}\manual.pdf; Flags: createonlyiffileexists
Name: {group}\Трейнер; Filename: {app}\trn.exe; Flags: createonlyiffileexists; WorkingDir: {app}
Name: {group}\Файл Readme; Filename: {app}\ReadMe.txt; Flags: createonlyiffileexists
Name: {group}\Интернет-сайты\Chuvakstepan Inc.; Filename: {app}\website.url; Flags: createonlyiffileexists; Tasks: url
Name: {group}\Интернет-сайты\Сайт игры; Filename: {app}\websitegameSTALKER.url; Flags: createonlyiffileexists; Tasks: url
Name: {group}\{cm:UninstallProgram,игры}; Filename: {uninstallexe}


[Registry]
Root: HKLM; SubKey: SOFTWARE\GSC Game World\STALKER-SHOC1; ValueType: string; ValueName: InstallPath; ValueData: {app} ; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\GSC Game World\STALKER-SHOC1; ValueType: string; ValueName: InstallLang; ValueData: en; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\GSC Game World\STALKER-SHOC1; ValueType: string; ValueName: InstallSource; ValueData: stk-for-pack-securom-keydisk-efis; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\GSC Game World\STALKER-SHOC1; ValueType: string; ValueName: InstallVers; ValueData: 1.0001; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\GSC Game World\STALKER-SHOC1; ValueType: string; ValueName: InstallCDKEY; ValueData: 2J3G-4KJ3-B4J2-4I1N; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\GSC Game World\STALKER-SHOC1; ValueType: string; ValueName: InstallUserName; ValueData: Chuvakstepan; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\GSC Game World\STALKER-SHOC1; ValueType: dword; ValueName: BonusPack1; ValueData: $00000000; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\GSC Game World\STALKER-SHOC1; ValueType: dword; ValueName: BonusPack2; ValueData: $00000000; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\GSC Game World\STALKER-SHOC1; ValueType: string; ValueName: UnInstConfirm; ValueData: Do you want to remove all saved games and profiles?; Flags: uninsdeletekey

Root: HKLM; SubKey: SOFTWARE\Chuvakstepan\STALKER-SHOC; ValueType: string; ValueName: SavePath; ValueData: {app}\bin; Flags: uninsdeletekey

[LangOptions]
TitleFontSize=1
DialogFontName=Tahoma
DialogFontSize=8
WelcomeFontName=Times New Roman
WelcomeFontSize=13
TitleFontName=Arial
CopyrightFontName=Arial
CopyrightFontSize=8

[Messages]
BeveledLabel=Chuvakstepan Inc. 2007

[CustomMessages]
UninstallProgram=Удаление %1

[UninstallRun]
Filename: "{app}\KillSave.exe"; Parameters: "Kill"; WorkingDir: "{app}";


[Code]

//////////Проверка системных требований

const
NeedSize = 20; //Прописать, сколько мегабайт необходимо

DRIVE_UNKNOWN = 0;
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVEABLE = 2;
DRIVE_FIXED = 3;
DRIVE_REMOTE = 4;
DRIVE_CDROM = 5;
DRIVE_RAMDISK = 6;
//Все эффекты анимации
AW_FADE_IN = $00080000;
AW_FADE_OUT = $00090000;
AW_SLIDE_IN_LEFT = $00040001;
AW_SLIDE_OUT_LEFT = $00050002;
AW_SLIDE_IN_RIGHT = $00040002;
AW_SLIDE_OUT_RIGHT = $00050001;
AW_SLIDE_IN_TOP = $00040004;
AW_SLIDE_OUT_TOP = $00050008;
AW_SLIDE_IN_BOTTOM = $00040008;
AW_SLIDE_OUT_BOTTOM = $00050004;
AW_DIAG_SLIDE_IN_TOPLEFT = $00040005;
AW_DIAG_SLIDE_OUT_TOPLEFT = $0005000A;
AW_DIAG_SLIDE_IN_TOPRIGHT = $00040006;
AW_DIAG_SLIDE_OUT_TOPRIGHT = $00050009;
AW_DIAG_SLIDE_IN_BOTTOMLEFT = $00040009;
AW_DIAG_SLIDE_OUT_BOTTOMLEFT = $00050006;
AW_DIAG_SLIDE_IN_BOTTOMRIGHT = $0004000A;
AW_DIAG_SLIDE_OUT_BOTTOMRIGHT = $00050005;
AW_EXPLODE = $00040010;
AW_IMPLODE = $00050010;

var
ListBox: TListBox;

function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean;
external 'AnimateWindow@user32 stdcall';

procedure ListBoxOnClick(Sender: TObject);
var
NewLetter, OldString: String;
i: Integer;
begin
for i:= 0 to ListBox.Items.Count-1 do
begin
if ListBox.Selected[i] then
begin
NewLetter:= Copy(ListBox.Items[i], 0, 1);
OldString:= Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text));
WizardForm.DirEdit.Text:= NewLetter + OldString;
end;
end;
end;

function GetLogicalDrives: DWORD;
external 'GetLogicalDrives@kernel32.dll stdcall';

function GetDriveType(nDrive: String): Longint;
external 'GetDriveTypeA@kernel32.dll stdcall';

function GetVideoCardName(): PChar;
external 'hwc_GetVideoCardName@files:get_hw_caps.dll stdcall';

function GetSoundCardName(): PChar;
external 'hwc_GetSoundCardName@files:get_hw_caps.dll stdcall';

function DetectHardware(): Integer;
external 'hwc_DetectHardware@files:get_hw_caps.dll stdcall';

function GetHardDriveFreeSpace(hdd: integer): Integer;
external 'hwc_GetHardDriveFreeSpace@files:get_hw_caps.dll stdcall';

function GetHardDriveName(hdd: integer): PChar;
external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall';

function GetHardDriveTotalSpace(hdd: integer): Integer;
external 'hwc_GetHardDriveTotalSpace@files:get_hw_caps.dll stdcall';

function GetHardDrivesCount(): Integer;
external 'hwc_GetHardDrivesCount@files:get_hw_caps.dll stdcall';

function GetSoundCards(): Integer;
external 'hwc_GetSoundCards@files:get_hw_caps.dll stdcall';

function GetSystemPage(): Integer;
external 'hwc_GetSystemPage@files:get_hw_caps.dll stdcall';

function GetSystemPhys(): Integer;
external 'hwc_GetSystemPhys@files:get_hw_caps.dll stdcall';

function GetVidMemLocal(): Integer;
external 'hwc_GetVidMemLocal@files:get_hw_caps.dll stdcall';

function GetVidMemNonLocal(): Integer;
external 'hwc_GetVidMemNonLocal@files:get_hw_caps.dll stdcall';

function GetVideoCardDev(): Integer;
external 'hwc_GetVideoCardDev@files:get_hw_caps.dll stdcall';

function GetVideoCardVen(): Integer;
external 'hwc_GetVideoCardVen@files:get_hw_caps.dll stdcall';

function DelSp(const s:string):string;// функция удаления пробелов в начале строки
var
c, i: integer;
stt, st, st1: string;
begin
c := 0;
st := s;

for i := 1 to Length(st) do
begin

stt := copy(st, i, 1);
if (stt = ' ') and (c >= 1) then
begin
st1 := st1;
c := c + 1;
end
else if (stt = ' ') and (c = 0) then
begin
c := c + 1;
st1 := st1 + stt;
end
else if (stt <> ' ') then
begin
c := 0;
st1 := st1 + stt;
end
end;

Result:= st1;
end;

function CheckSystemPage(PreviousPageId: Integer): Integer;
var Page: TWizardPage;
ProcessorName:string;
Processor,VideoCardPanel,AudioCardPanel,RAMPanel,PageFilePanel: TPanel;
ProcessorNamePanel,VideoCardNamePanel,AudioCardNamePanel,RAMTotalPanel,PageFileTotalPanel: TPanel;
ProcessorMHZ: Cardinal;
StaticText,StaticText2:TNewStaticText;
VidRam:integer;
begin
RegQueryStringValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0','ProcessorNameString', ProcessorName);
RegQueryDWordValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0','~MHz', ProcessorMHZ);
GetVidMemLocal;
GetSoundCards;

Page := CreateCustomPage(PreviousPageId,'Апаратное Обеспечение','Программа установки обнаружила следуюшие необходимые компоненты');

StaticText:=TNewStaticText.Create(Page);
with StaticText do
begin
Parent:=Page.Surface;
Caption:='Все компоненты удовлетворяют требованиям игры.';
Left:=0;
Top:=5;
AutoSize:=True;
end;

StaticText2:=TNewStaticText.Create(Page);
with StaticText2 do
begin
Parent:=Page.Surface;
Caption:='Когда будете готовы продолжить установку, нажмите Далее'
Left:=0;
Top:=220;
AutoSize:=True;
end;

Processor := TPanel.Create(Page);
with Processor do
begin
Parent := Page.Surface;
Caption := ' Процессор';
Left := ScaleX(0);
Top := ScaleY(32);
alignment:=taLeftJustify;
Width := ScaleX(121);
Height := ScaleY(25);
BevelInner := bvLowered;
TabOrder := 0;
end;

ProcessorNamePanel := TPanel.Create(Page);
with ProcessorNamePanel do
begin
Parent := Page.Surface;
Caption :=DelSP(ProcessorName)+' '+IntToStr(ProcessorMHZ)+'MHz' ; //новое обработанное значение строки
// Caption :=ProcessorName+' '+IntToStr(ProcessorMHZ)+'MHz' ;
Left := ScaleX(128);
Top := ScaleY(32);
alignment:=taLeftJustify;
Width := ScaleX(281);
Height := ScaleY(25);
BevelInner := bvLowered;
Color :=$ccffcc;
TabOrder := 1;
end;

if ProcessorMHZ<1800then
begin
ProcessorNamePanel.Color:=clRed;
StaticText.Caption:='Не все компоненты удовлетворяют требованиям игры.';
end;

VideoCardPanel:=TPanel.Create(Page);
with VideoCardPanel do
begin
Parent:=Page.Surface;
Caption:=' Видеоадаптер';
Left:=ScaleX(0);
alignment:=taLeftJustify;
Top:=Processor.Top+27;
Width:=ScaleX(121);
Height:=ScaleY(25);
BevelInner:=bvLowered;
TabOrder:=0;
end;

VideoCardNamePanel:=TPanel.Create(Page);
with VideoCardNamePanel do
begin
Parent:=Page.Surface;
Caption:=' '+GetVideoCardName; //+' ОЗУ-'+inttostr(round(GetVidMemLocal/1000000))+' МБ';
//Caption:=' ОЗУ-'+inttostr(GetVidMemLocal)+' МБ';
VidrAM:= GetVidMemLocal/1000000;

if VidRam>127 then
begin
if VidRam<200 then Caption:=Caption+' 128 МB'
else if VidRam<300 then Caption:=Caption+' 256 МB'
else if VidRam<400 then Caption:=Caption+' 384 МB'
else if VidRam>500 then Caption:=Caption+' 512 МB';
end;

Left:=ScaleX(128);
Top:=VideoCardPanel.Top;
alignment:=taLeftJustify;
Width:=ScaleX(281);
Height:=ScaleY(25);
BevelInner:=bvLowered;
Color :=$ccffcc;
TabOrder:=1;
end;

if GetVidMemLocal<127000000 then //128MB
begin
StaticText.Caption:='Не все компоненты удовлетворяют требованиям игры.';
VideoCardNamePanel.Color:=clRed;
end;

AudioCardPanel:=TPanel.Create(Page);
with AudioCardPanel do
begin
Parent:=Page.Surface;
Caption:=' Звуковая карта';
Left:=ScaleX(0);
Top:=VideoCardPanel.Top+27;
alignment:=taLeftJustify;
Width:=ScaleX(121);
Height:=ScaleY(25);
BevelInner:=bvLowered;
TabOrder:=0;
end;

AudioCardNamePanel:=TPanel.Create(Page);
with AudioCardNamePanel do
begin
Parent:=Page.Surface;
Caption:=' '+GetSoundCardName;
Left:=ScaleX(128);
alignment:=taLeftJustify;
Top:=AudioCardPanel.Top;
Width:=ScaleX(281);
Height:=ScaleY(25);
BevelInner:=bvLowered;
TabOrder:=1;
Color :=$ccffcc;
end;

if
GetSoundCards=0 then
begin
StaticText.Caption:='Не все компоненты удовлетворяют требованиям игры.';
AudioCardNamePanel.Color:=clRed;
end;


RAMPanel:=TPanel.Create(Page);
with RAMPanel do
begin
Parent:=Page.Surface;
Caption:=' ОЗУ'
Left:=0;
Top:=AudioCardPanel.Top+27;
alignment:=taLeftJustify;
Width:=ScaleX(121);
Height:=ScaleY(25);
BevelInner:=bvLowered;
TabOrder:=0;
end;

RAMTotalPanel:=TPanel.Create(Page);
with RAMTotalPanel do
begin
Parent:=Page.Surface;
Caption:=' '+IntToStr(GetSystemPhys+1) +' MB'
Left:=AudioCardNamePanel.Left;
Top:=RAMPanel.Top;
alignment:=taLeftJustify;
Width:=AudioCardNamePanel.Width;
Height:=ScaleY(25);
BevelInner:=bvLowered;
TabOrder:=1;
Color :=$ccffcc;
end;

if GetSystemPhys+1<1024 then
begin
RAMTotalPanel.Color:=clRed;
StaticText.Caption:='Не все компоненты удовлетворяют требованиям игры.';
end;

PageFilePanel:=TPanel.Create(Page);
with PageFilePanel do
begin
Parent:=Page.Surface;
Caption:=' Файл подкачки';
alignment:=taLeftJustify;
Left:=0;
Top:=RAMPanel.Top+27;
Width:=RAMPanel.Width;
Height:=ScaleY(25);
BevelInner:=bvLowered;
TabOrder:=0;
end;

PageFileTotalPanel:=TPanel.Create(Page);
with PageFileTotalPanel do
begin
Parent:=Page.Surface;
Caption:=' '+IntToStr(GetSystemPage)+' MB';
Left:=RAMTotalPanel.Left;
Top:=PageFilePanel.Top;
alignment:=taLeftJustify;
Width:=RAMTotalPanel.Width;
Height:=ScaleY(25);
BevelInner:=bvLowered;
TabOrder:=1;
Color :=$ccffcc;
end;

if GetSystemPage<1247 then
begin
PageFileTotalPanel.Color:=clRed;
StaticText.Caption:='Не все компоненты удовлетворяют требованиям игры.';
end;

Result := Page.ID;
end;
//////////////////

//////Сплэш-скрин
var
Splash: TSetupForm;

var
mp3Handle: HWND;
mp3Name: string;
PlayButton : TButton;
PauseButton : TButton;
StopButton : TButton;
Panel1: TPanel;

////////////Функции MP3 + Кнопки
function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';

function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): DWORD;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function BASS_ChannelIsActive(handle: DWORD): Integer;
external 'BASS_ChannelIsActive@files:BASS.dll stdcall delayload';

function BASS_ChannelPause(handle: DWORD): Boolean;
external 'BASS_ChannelPause@files:BASS.dll stdcall delayload';

function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

function BASS_Pause(): Boolean;
external 'BASS_Pause@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';

procedure PauseButtonOnClick(Sender: TObject);
begin
BASS_ChannelPause(mp3Handle);
end;


procedure StopButtonOnClick(Sender: TObject);
begin
BASS_Stop();
BASS_Free();
end;


const
BASS_ACTIVE_STOPPED = 0;
BASS_ACTIVE_PLAYING = 1;
BASS_ACTIVE_STALLED = 2;
BASS_ACTIVE_PAUSED = 3;
BASS_SAMPLE_LOOP = 4;

function InitializeSetup(): Boolean;
var
BitmapImage1: TBitmapImage;
ResultCode: Integer;
MD5,ResultStr:string;
hWnd: Integer;
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('sound.mp3');
mp3Name := ExpandConstant('{tmp}\sound.mp3');
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
Result := True;

begin
Splash := CreateCustomForm;
Splash.BorderStyle := bsNone;
BitmapImage1 := TBitmapImage.Create(Splash);
with BitmapImage1 do begin
AutoSize := True;
Align := alClient;
Left := 0;
Top := 0;
Stretch := True;
Parent := Splash;
end;
ExtractTemporaryFile('Splash.bmp');
BitmapImage1.Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\Splash.bmp');
Splash.Width := BitmapImage1.Width;
Splash.Height := BitmapImage1.Height;
Splash.Center;
Splash.Show;
BitmapImage1.Refresh;
Sleep(2000); //Время показа (здесь 3 секунды)
Result := True;

////////////Функции MP3 + Кнопки
end;
begin
Result:=True;
///////////Проверка электронной подписи
if not FileExists(ExpandConstant('{src}')+'\website.url') then
begin
MsgBox('Электронная подпись не найдена.'#13#13'Вы используете взломанную или пиратскую версию.', mbError, mb_OK);
Result:= False;
end
else
begin
MD5 := GetMD5OfFile(ExpandConstant('{src}\website.url'));
If not (MD5 = '2b5db4b3d57755af4891cd5a53902f48') then
begin
MsgBox('Произошла критическая ошибка!'#13'Электронная подпись повреждена.'#13'Обратитесь к разработчику!', mbCriticalError, mb_OK);
Result:=False;
end;
end;
end;
end;
////////////////////////
////////////////////////
procedure PlayButtonOnClick(Sender: TObject);
begin
case BASS_ChannelIsActive(mp3Handle) of
BASS_ACTIVE_PAUSED:
begin
BASS_ChannelPlay(mp3Handle, False);
end;
BASS_ACTIVE_STOPPED:
begin
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
end;
end;
end;


procedure DirOnClick(Sender: TObject);
var
res: Boolean;
UserSelectDir: string;
begin
UserSelectDir := WizardForm.DirEdit.Text;
res := BrowseForFolder('Выберите директорию для установки и нажмите ''ОК''', UserSelectDir, True);
if res then
begin
WizardForm.DirEdit.Text := UserSelectDir;
end;
end;






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


/////////Функции слайд-шоу
const
BACKGROUND = 6; // "5"-по центру, "6"-растянуто на весь экран, "1,2,3,4"-в разных углах экрана
TIMER = 16;

function isxbb_AddImage(Image: PChar; Flags: Cardinal): Integer;
external 'isxbb_AddImage@files:isxbb.dll stdcall';
function isxbb_Init(hWnd: Integer): Integer;
external 'isxbb_Init@files:isxbb.dll stdcall';
function isxbb_StartTimer(Seconds: Integer; Flags: Cardinal): Integer;
external 'isxbb_StartTimer@files:isxbb.dll stdcall';
function isxbb_KillTimer(Flags: Cardinal): Integer;
external 'isxbb_KillTimer@files:isxbb.dll stdcall';
function GetSystemMetrics(nIndex: Integer): Integer;
external 'GetSystemMetrics@user32.dll stdcall';
///////////////////////////

//////////////Нажатия на Beveled
procedure BevelLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExec('open', 'http://www.chuvakstepan.xost.ru', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
///////////////////////////

/////// Фоновый рисунок
procedure InitializeWizard();
var
BackgroundBitmapImage: TBitmapImage;
s: string;
License: string;
ResultCode_1: Integer;
width, height: Integer;
SplashImage: TBitmapImage;
SplashForm: TForm;
SplashFileName: String;
I : Integer;
b : string;
Name1: string;
PlayButton, PauseButton, StopButton: TButton;
Text: TNewStaticText;
Panel1: TPanel;
License: String;
Path: String;
FreeMB, TotalMB: Cardinal;
drives: DWORD;
begin
WizardForm.Position := poScreenCenter;
WizardForm.DirBrowseButton.OnClick := @DirOnClick;
MainForm.BORDERSTYLE := bsNone;
//2000-скорость, AW_DIAG_SLIDE_IN_BOTTOMRIGHT - эффект
//AnimateWindow(WizardForm.Handle, 500, AW_SLIDE_IN_BOTTOM);
WizardForm.CancelButton.BringToFront;
width := GetSystemMetrics(0);
height := GetSystemMetrics(1);
MainForm.Width := width;
MainForm.Height := height;
width := MainForm.ClientWidth;
height := MainForm.ClientHeight;
ExtractTemporaryFile('Background.bmp');
s := ExpandConstant('{tmp}') + '\Background.bmp';
BackgroundBitmapImage := TBitmapImage.Create(MainForm);
BackgroundBitmapImage.Bitmap.LoadFromFile(s);
BackgroundBitmapImage.Left := 0;
BackgroundBitmapImage.Top := 0;
BackgroundBitmapImage.Width := width;
BackgroundBitmapImage.Height := height;
BackgroundBitmapImage.Parent := MainForm;
BackgroundBitmapImage.Stretch := True;
CheckSystemPage(wpLicense);
MainForm.Visible := True;

////////////Сплэш-скрин


/////////Большые картинки (1-ая WizardImageFile, 2-ая тут)
begin
ExtractTemporaryFile('st_fin.bmp')
b:=ExpandConstant('{tmp}\st_fin.bmp')
with WizardForm do
begin
WizardBitmapImage.Width:=WizardForm.ClientWidth;
WelcomeLabel1.Visible:=False;
WelcomeLabel2.Visible:=False;
WizardBitmapImage2.Bitmap.LoadFromFile(b);
WizardBitmapImage2.Width:=WizardForm.ClientWidth;
FinishedLabel.Visible:=False;
FinishedHeadingLabel.Visible:=False;
end;
end;
///////////////////Маленькая картинка становиться щире
begin
with WizardForm do begin
with MainPanel do
Height := Height - 0;
with WizardSmallBitmapImage do begin
Left := 0; //значение 0 - слева, 347 - справа
Top := 0;
Height := 58; //Размер рисунка
Width := 495; //
end;
with PageNameLabel do begin
Width := Width - 1; //Поставьте здесь значения на 0 если хотите вернуть текст
Visible:= False
Left := Left + 0; //
end;
with PageDescriptionLabel do begin
Width := Width - 80; //Поставьте здесь значения на 0 если хотите вернуть текст
Visible:= False
Left := Left + 0; //
end;
end;
end
begin
Splash.Close;
end;
///////////////Действия, при нажатии на Beveled
begin
with WizardForm.BeveledLabel do
begin
Cursor := crHand; //Вид курсора при наведении на текст
OnClick := @BevelLabelOnClick;
Font.Style := Font.Style + [fsUnderline];
Font.Color := clMaroon; //Цвет текста
Enabled := True;
end;
end;
//////////////////Музыка
begin
WizardForm.Position := poScreenCenter;
WizardForm.CancelButton.BringToFront;
begin
Panel1 := TPanel.Create(WizardForm);
with Panel1 do
begin


PlayButton := TButton.Create(WizardForm);
PlayButton.Left := 10;
PlayButton.Top := WizardForm.ClientHeight - ScaleY(23 + 10);
PlayButton.Width := 30;
PlayButton.Caption := '>';
PlayButton.OnClick := @PlayButtonOnClick;
PlayButton.Parent := WizardForm;
PlayButton.Cursor := crHand;
PauseButton := TButton.Create(WizardForm);
PauseButton.Left := 45;
PauseButton.Top := WizardForm.ClientHeight - ScaleY(23 + 10);
PauseButton.Width:=30;
PauseButton.Caption := 'II';
PauseButton.OnClick := @PauseButtonOnClick;
PauseButton.Parent := WizardForm;
PauseButton.Cursor := crHand;
StopButton := TButton.Create(WizardForm);
StopButton.Left := 80;
StopButton.Top := WizardForm.ClientHeight - ScaleY(23 + 10);
StopButton.Width := 30;
StopButton.Caption := '[]';
StopButton.OnClick := @StopButtonOnClick;
StopButton.Parent := WizardForm;
StopButton.Cursor := crHand;


end;
end;
end;
ExtractTemporaryFile('License.rtf');
LoadStringFromFile(ExpandConstant('{tmp}') + '\License.rtf', License)
WizardForm.LicenseMemo.RTFText := License;
ListBox:= TListBox.Create(WizardForm);
ListBox.Top:= 120;
ListBox.Width:= 300;
ListBox.Height:= ScaleY(90);
ListBox.Parent:= WizardForm.SelectDirPage;
ListBox.OnClick:= @ListBoxOnClick;

drives:= GetLogicalDrives();
for i:= 0 to 31 do
begin
if (drives and (1 shl i)) > 0 then
begin
Path:= chr(ord('A')+i)+':';
if GetDriveType(Path) = DRIVE_FIXED then
begin
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
ListBox.Items.Add(Path + ' Свободно: ' + IntToStr(FreeMB) + 'Мб');
end;
end;
end;
end;


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

////////Процедура слайд-шоу
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall
then
begin
ExtractTemporaryFile('1.jpg'); // это файлы для слайд-шоу, их может быть и больше
ExtractTemporaryFile('2.jpg');
ExtractTemporaryFile('3.jpg');
ExtractTemporaryFile('4.jpg');
ExtractTemporaryFile('5.jpg');
ExtractTemporaryFile('6.jpg');
ExtractTemporaryFile('7.jpg');
ExtractTemporaryFile('8.jpg');
ExtractTemporaryFile('9.jpg');
isxbb_AddImage(ExpandConstant('{tmp}') + '\1.jpg', BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}') + '\2.jpg', BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}') + '\3.jpg', BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}') + '\4.jpg', BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}') + '\5.jpg', BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}') + '\6.jpg', BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}') + '\7.jpg', BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}') + '\8.jpg', BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}') + '\9.jpg', BACKGROUND or TIMER);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
isxbb_StartTimer(10, BACKGROUND) // это таймер для слайд-шоу в секундах
end
else if CurStep = ssPostInstall then
isxbb_KillTimer(BACKGROUND);
end;
////////////////////////


procedure DeinitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;



//////////////////////Изменение окна установки вместе с кнопками управления музыкой
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=1 then
begin
If WizardForm.FindComponent('NextButton') is TButton
then
TButton(WizardForm.FindComponent('NextButton')).Caption:='Начать Установку >>>';
TButton(WizardForm.FindComponent('NextButton')).Width:=ScaleX(135);
WizardForm.NextButton.Left:=WizardForm.ClientWidth - ScaleX(217 + 10); //Отступ слева кнопки: Отмена.
WizardForm.NextButton.Top:=WizardForm.ClientHeight - ScaleY(23 + 10); //Отступ сверху кнопки: Отмена.
WizardForm.BackButton.Left:=WizardForm.ClientWidth - ScaleX(300 + 10); //Отступ слева кнопки: Отмена.
WizardForm.BackButton.Top:=WizardForm.ClientHeight - ScaleY(23 + 10); //Отступ сверху кнопки: Отмена.
If WizardForm.FindComponent('CancelButton') is TButton
then
TButton(WizardForm.FindComponent('CancelButton')).Caption:='Выход';
end;
begin
if CurPageID=wpInstalling
then
begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(MainForm.Width-420);
WizardForm.Top:=ScaleY(MainForm.Height-170);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);

PlayButton := TButton.Create(WizardForm);
PlayButton.Left := 10;
PlayButton.Top := WizardForm.ClientHeight - ScaleY(23 + 10);
PlayButton.Width := 30;
PlayButton.Caption := '>';
PlayButton.OnClick := @PlayButtonOnClick;
PlayButton.Parent := WizardForm;
PlayButton.Cursor := crHand;
PauseButton := TButton.Create(WizardForm);
PauseButton.Left := 45;
PauseButton.Top := WizardForm.ClientHeight - ScaleY(23 + 10);
PauseButton.Width:=30;
PauseButton.Caption := 'II';
PauseButton.OnClick := @PauseButtonOnClick;
PauseButton.Parent := WizardForm;
PauseButton.Cursor := crHand;
StopButton := TButton.Create(WizardForm);
StopButton.Left := 80;
StopButton.Top := WizardForm.ClientHeight - ScaleY(23 + 10);
StopButton.Width := 30;
StopButton.Caption := '[]';
StopButton.OnClick := @StopButtonOnClick;
StopButton.Parent := WizardForm;
StopButton.Cursor := crHand;
end
if CurPageID=wpFinished
then
begin
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Position:=poScreenCenter;
PlayButton.Visible := False;
PauseButton.Visible := False;
StopButton.Visible := False;
end;
end;
end;

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

///////////Запрос на выход из установки....
const
MB_ICONINFORMATION = $40;
MB_ICONEXCLAMATION = $30;
MB_ICONQUESTION = $20;
MB_ICONSTOP = $10;
MB_ICONNONE = $0;

function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
var
hWnd: Integer;
begin
Cancel:=False;
Confirm:=False;
hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
if MessageBox(hWnd, 'Вы действительно хотите отменить установку игры?', 'Выход из установки', MB_YESNO or $0) = idYes
then
Cancel:=true;
end;
////////////////////////////////////////////[/more]
2. код, в котором реализованны текстуры этих кнопок: вот [more=код];Пример 2 – музыка воспроизводится сразу при запуске


[Setup]
AppName=Example.Play.MP3.Music.On.Start.Up.With.Texture
AppVerName=Example.Play.MP3.Music.On.Start.Up.With.Texture
AppPublisher=My Company, Inc.
DefaultDirName=C:\Example.Play.MP3.Music.On.Start.Up.With.Texture
OutputBaseFilename=example.play.mp3.music.on.start.up.with.texture.by.genri.sampron


[Files]
Source: "BASS.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption
Source: "sound.mp3"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
;Использован рисунок размером 180х20
Source: "MusicButton.bmp"; DestDir: "{tmp}"; Flags: dontcopy


[Code]
const
BASS_ACTIVE_STOPPED = 0;
BASS_ACTIVE_PLAYING = 1;
BASS_ACTIVE_STALLED = 2;
BASS_ACTIVE_PAUSED = 3;
BASS_SAMPLE_LOOP = 4;


var
mp3Handle: HWND;
mp3Name: string;

PlayButton, PauseButton, StopButton: TPanel;
PlayImage, PauseImage, StopImage: TBitmapImage;
PlayLabel, PauseLabel, StopLabel: TLabel;


function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';

function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): DWORD;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function BASS_ChannelIsActive(handle: DWORD): Integer;
external 'BASS_ChannelIsActive@files:BASS.dll stdcall delayload';

function BASS_ChannelPause(handle: DWORD): Boolean;
external 'BASS_ChannelPause@files:BASS.dll stdcall delayload';

function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

function BASS_Pause(): Boolean;
external 'BASS_Pause@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';


procedure PlayMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if PlayLabel.Enabled then
PlayImage.Left := -90
end;

procedure PlayMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PlayImage.Left := 0
end;

procedure PauseMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if PauseLabel.Enabled then
PauseImage.Left := -120
end;

procedure PauseMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PauseImage.Left := -30
end;

procedure StopMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if StopLabel.Enabled then
StopImage.Left := -150
end;

procedure StopMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StopImage.Left := -60
end;


function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('sound.mp3');
mp3Name := ExpandConstant('{tmp}\sound.mp3');
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
Result := True;
end;


procedure PlayButtonOnClick(Sender: TObject);
begin
case BASS_ChannelIsActive(mp3Handle) of
BASS_ACTIVE_PAUSED:
begin
BASS_ChannelPlay(mp3Handle, False);
end;
BASS_ACTIVE_STOPPED:
begin
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
end;
end;
end;


procedure PauseButtonOnClick(Sender: TObject);
begin
BASS_ChannelPause(mp3Handle);
end;


procedure StopButtonOnClick(Sender: TObject);
begin
BASS_Stop();
BASS_Free();
end;


procedure InitializeWizard();
begin
ExtractTemporaryFile('MusicButton.bmp')

PlayButton := TPanel.Create(WizardForm)
PlayButton.Left := 33
PlayButton.Top := 328
PlayButton.Width := 30
PlayButton.Height := 20
PlayButton.Cursor := crHand
PlayButton.ShowHint := True
PlayButton.Hint := 'Воспроизведение музыки'
PlayButton.OnClick := @PlayButtonOnClick
PlayButton.Parent := WizardForm

PlayImage := TBitmapImage.Create(WizardForm)
PlayImage.Left := 0
PlayImage.Top := 0
PlayImage.Width := 180
PlayImage.Height := 20
PlayImage.Enabled := False
PlayImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
PlayImage.Parent := PlayButton

PlayLabel := TLabel.Create(WizardForm)
PlayLabel.Width := PlayButton.Width
PlayLabel.Height := PlayButton.Height
PlayLabel.Autosize := False
PlayLabel.Transparent := True
PlayLabel.OnClick := @PlayButtonOnClick
PlayLabel.OnMouseDown := @PlayMouseDown
PlayLabel.OnMouseUp := @PlayMouseUp
PlayLabel.Parent := PlayButton

PauseButton := TPanel.Create(WizardForm)
PauseButton.Left := 66
PauseButton.Top := 328
PauseButton.Width := 30
PauseButton.Height := 20
PauseButton.Cursor := crHand
PauseButton.ShowHint := True
PauseButton.Hint := 'Приостановить музыку'
PauseButton.OnClick := @PauseButtonOnClick
PauseButton.Parent := WizardForm

PauseImage := TBitmapImage.Create(WizardForm)
PauseImage.Left := -30
PauseImage.Top := 0
PauseImage.Width := 180
PauseImage.Height := 20
PauseImage.Enabled := False
PauseImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
PauseImage.Parent := PauseButton

PauseLabel := TLabel.Create(WizardForm)
PauseLabel.Width := PauseButton.Width
PauseLabel.Height := PauseButton.Height
PauseLabel.Autosize := False
PauseLabel.Transparent := True
PauseLabel.OnClick := @PauseButtonOnClick
PauseLabel.OnMouseDown := @PauseMouseDown
PauseLabel.OnMouseUp := @PauseMouseUp
PauseLabel.Parent := PauseButton

StopButton := TPanel.Create(WizardForm)
StopButton.Left := 99
StopButton.Top := 328
StopButton.Width := 30
StopButton.Height := 20
StopButton.Cursor := crHand
StopButton.ShowHint := True
StopButton.Hint := 'Остановить музыку'
StopButton.OnClick := @StopButtonOnClick
StopButton.Parent := WizardForm

StopImage := TBitmapImage.Create(WizardForm)
StopImage.Left := -60
StopImage.Top := 0
StopImage.Width := 180
StopImage.Height := 20
StopImage.Enabled := False
StopImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
StopImage.Parent := StopButton

StopLabel := TLabel.Create(WizardForm)
StopLabel.Width := StopButton.Width
StopLabel.Height := StopButton.Height
StopLabel.Autosize := False
StopLabel.Transparent := True
StopLabel.OnClick := @StopButtonOnClick
StopLabel.OnMouseDown := @StopMouseDown
StopLabel.OnMouseUp := @StopMouseUp
StopLabel.Parent := StopButton
end;


procedure DeinitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;




[/more]

У меня не получается правильно убрать старый код с музыкой и вставить новый код с текстурами. И еще бы желательно добавить эти же кнопочки в измененное окно процесса инсталляции
Автор: marat shakirov
Дата сообщения: 26.05.2007 23:14
как можно удалить переменную окружения, создаваемую в разделе

Добавлено:
как можно удалить переменные окружения, создаваемые мною в разделе [Registry] через описание ключей в реестре, при деинсталляции программы. Как ни пробовал играть флагами - ничего не получается. То же самое,ч то если задавать переменную через SET ...=..., то как удалить эту созданную переменную.
Автор: Genri
Дата сообщения: 27.05.2007 00:51
jedi81
Цитата:
возможно создать пакет инсталяции с кодом вопрос и ответ? То есть при инсталяции на один ПК программа выдает код вопрос, вводим код ответ. Но если запустить на другом ПК код вопрос будет другой и код ответ соотвественно тоже.
-- Возможно. Хотя лучше, если защиту обеспечивает сама программа, а не инсталлятор. Только не совсем понятно следующее: уникальный код для каждого ПК или уникальный код для каждого запуска инсталляции ? В первом случае, необходимо определить перечень устройств, по данным которых, будет генериться код. Во втором случае, можно использовать функцию Random.
Но в любом случае, это защита "от пионэров"

Yalos
Цитата:
в исходном каталоге ... лежит чуть меньше тысячи *.html , все они с атрибутами HIDEN и SYSTEM , и только один файл, главный без этих арибутов.
.... при создании инсталлятора добавляется только главный файл, остальные игнорирутся... создавать дополнительный файл, содержащий их не хочется, т.к. они регулярно меняются. как быть?
-- не понял проблемы. Если при создании инсталлятора добавляется только главный файл, то зачем тебе остальные ? Или есть еще какая-то задача ?

maxdddca123
Цитата:
как можно осуществить сравнение букв по 'старшинству' ?
-- а как ты пробовал ? Я надеюсь, прежде чем задавать вопрос, ты попробовал... ну хотя бы самый тупой вариант:
str1:= '7700A000';
str2:= '7700B000';
If str1 < str2 then
.........................
И что ? Не работает ?

marat shakirov
Цитата:
как можно удалить переменную окружения, создаваемую в разделе
-- Через SET удаление через имя переменной и знак равенства без пробела в конце напр.: SET MUVAR=
А как ты создаешь через [Registry] ? Flags: uninsdeletevalue не помогает ? Счас попробовал - при установке параметр создался, при удалении программы - удалился.

Добавлено:
Yalos
Цитата:
[Run]
Filename: "attrib"; Parameters: " +S +H {app}\listing_*.html"
не работает. и не ругается. типа все в порядке.
-- вероятно у тебя {app} с пробелами. Тогда нужны еще кавычки. Попробуй так:
[Run]
Filename: "attrib"; Parameters: " +S +H ""{app}\listing_*.html"""


Добавлено:
ZavadS
Цитата:
нужно когда я нажимаю на клавишу OK, чтобы инсталлятор прервал свою работу и закрылся, без любых предупреждений.
-- после MsgBox с сообщением о несоответствии размера добавь строку WizardForm.Close - это заставит инсталлятор прекратить работу. А чтобы избавиться от запроса подтверждения выхода, добавь в скрипт следующее:
Код:
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
end;
Автор: DuhaLab
Дата сообщения: 27.05.2007 07:27
Вот есть крипт на создание резервной копии c последующим восстановленеим, но проблема в том, что файл восстанавливается, если удалять заменяемый файл. Но если не выбран чекбокс создания резервной копии - при удалении ничего не восстанавливается, а файл тот удаляется. Как сделать чтоб при отсутствии галки на резервировании при удалении нужный файл не удалялся, а при выбранном удалялся с восстановлением другого из резервной копии?

var
b_cb:boolean;
cb:TCheckBox;
StaticText: TNewStaticText;

procedure cdClick(Sender: TObject);
begin
b_cb:=cb.CHECKED;
end;

procedure CurPageChanged(CurPageID: Integer);
var
s1, s2:string;


begin
If CurPageID=wpSelectDir then
begin
cb:=TCheckBox.Create(WizardForm);
cb.Parent:=WizardForm;
cb.Width:=ScaleX(220);
cb.Left:=ScaleY(40);
cb.Top:=ScaleY(215);
cb.CAPTION:='Сохранить резервные копии файлов';
cb.ONCLICK:=@cdClick;
end else begin
If cb<>nil then begin
cb.Free;
cb:=nil;
If StaticText<>nil then
begin
StaticText.Free;
StaticText:=nil;
end;
end;
end;


If CurPageID=wpInstalling then begin
If b_cb then
s1:=ExpandConstant('{app}')+'\opera6.ini';
s2:=ExpandConstant('{app}')+'\Backup';
If FileExists(s1) then begin
CreateDir(s2);
FileCopy(s1, s2+'\opera6.ini', True);
end;
end;
end;


//Восстановление резервной копии
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var s3, s5, s6:string;
begin case CurUninstallStep of usPostUninstall:
begin
s5:=ExpandConstant('{app}')+'\Backup\opera6.ini';
s6:=ExpandConstant('{app}');
If FileExists(s5)then begin
CreateDir(s6);
FileCopy(s5, s6+'\opera6.ini', True);
end;


//Удаление папки
begin
s3:=ExpandConstant('{app}')+'\Backup';
If DirExists(s3) then begin
DelTree(ExpandConstant('{app}')+'\Backup', True, True, True);
end;end;end;end;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Mail.ru агент - вход не выполнен


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.