Войти

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

Johny777
03-08-2012, 15:34
Leka_651,

ok

постараюсь исправить :)
я так понял "резервно копировать" нужно 2 папки
те сначала резервируем
идёт установка
пользователь передумал
возвращаем папки на место

Leka_651
03-08-2012, 15:59
Johny777,
да, почти все правилно.
Нужно бекапить папку Модули со всеми подпапками, папку Jinnee и dll-файлы из корня. У меня механизм копирования есть.

А вот все вернуть обратно не получается.

Leka_651
03-08-2012, 16:50
Johny777,
я поняла почему у меня остаются подпапки в папке Модули, а каталог Jinnee целиком удаляется
Стандартный механизм откатывает только то, что поставил сетап. Jinnee он ставит целиком и удаляет целиком, а из папки Модули удаляет только те подпапки, что успел поставить до нажатия кнопки "отмена".

Raf-9600
03-08-2012, 16:52
Наверно немного нубский вопрос, но как сделать чтобы отображалась страница выбора папки в пеню "Пуск"? В старых версиях Inno эта страница отображалась просто если есть DefaultGroupName, а сейчас что нужно сделать для её активации?

Johny777
03-08-2012, 16:59
Leka_651,
вопрос:
как инсталл должен вести себя при удалении?
также откатывать всё назад как при отмене установки?



Raf-9600,
нужна секция ярлыков

Leka_651
03-08-2012, 17:18
Johny777,
при удалении нужно чтобы удалялось все, кроме каталога db. он и бекапиться не должен.

Johny777
03-08-2012, 17:22
Leka_651,
в общем для того чтобы помочь тебе с кнопкой отмены мне нужен твой код целиком или самодостаточный вариант бэкапа с файлами для теста

но его нет поэтому сделал свой вариант бэкапа
в нём устранены все дисфункции твоей системы резервного коприрования (по функционалу)

======================================
вот (приписал несколько комментариев) :


#define JINNEE_DIR "JINNEE_DIR"
#define CLIENT_DIR "CLIENT_DIR"


[Setup]
AppName=Icon_Demo
AppVerName=Icon_Demo
DefaultDirName={pf}\Icon_Demo
Compression=none

[Files]
Source: My_CLIENT_DIR\*; DestDir: {app}\{#CLIENT_DIR}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: My_JINNEE_DIR\*; DestDir: {app}\{#JINNEE_DIR}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[code]
type
TSHFileOpStruct=record
Wnd: HWND;
wFunc: UINT;
pFrom: PChar;
pTo: PChar;
fFlags: Word;
fAnyOperationsAborted: BOOL;
hNameMappings: HWND;
lpszProgressTitle: PChar;
end;

function SHFileOperation(const lpFileOp: TSHFileOpStruct):integer; external 'SHFileOperation@shell32.dll stdcall';

function CopyFile_(FromFile,ToDir:string;IsRemove:boolean):boolean;
var
F:TShFileOpStruct;
a1,a2:string;
begin
F.Wnd:=0;
if IsRemove then F.wFunc:=$0001 else F.wFunc:=$0002;
a1:=FromFile+#0#0;
F.pFrom:=PChar(a1);
a2:=AddBackslash(ToDir)+#0#0;
F.pTo:=PChar(a2);
F.fFlags:=$0254;
Result:=(ShFileOperation(F)=0);
end;

procedure BackupDir(const FromDir,ToDir,FileMask :string; IsRemove,IncludeSubDirs: boolean);
var
FindRec:TFindRec;
sFileName,fd,td:string;
begin
fd:=AddBackslash(FromDir);
td:=AddBackslash(ToDir);
ForceDirectories(td);
if FindFirst(fd+FileMask,FindRec) then begin
try
repeat
sFileName:=fd+FindRec.Name;
if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY)=0) then CopyFile_(sFileName,td,IsRemove)
else
if IncludeSubDirs then
if (FindRec.Name<>'') and (FindRec.Name<>'.') and (FindRec.Name<>'..') then
BackupDir(sFileName,td+FindRec.Name,FileMask,IsRemove,IncludeSubDirs);
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall: // этап установки /// перед установкой
begin
if (DirExists(ExpandConstant('{app}\{#CLIENT_DIR}')) or DirExists(ExpandConstant('{app}\{#JINNEE_DIR}'))) and /// если эти папки существуют в директории установки
not (DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) and DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) and DirExists(ExpandConstant('{app}\DLL_BACKUP'))) then /// а эти с бэкапом нет, то
begin
with WizardForm do
begin
StatusLabel.Caption := 'Резервное копирование папки {#CLIENT_DIR}'; /// в лейбл статуса пишем "резервное копирование..."
CancelButton.Enabled := False; /// для кравоты и не только блокируем кнопку "Отмена"
ProgressGauge.Visible := CancelButton.Enabled; /// и делаем прогрессбар невидимым

/// дополнительно: если папка существует /// то копируемв в такую же с припиской _BACKUP
if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}')) then BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}'),ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),'*.*',F alse,True);

/// дополнительно: если папка существует /// то копируемв в такую же с припиской _BACKUP
if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}')) then BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}'),ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),'*.*',F alse,True);

/// копируем библиотеки по маске*(расширению) в папку DLL_BACKUP
BackupDir(ExpandConstant('{app}'),ExpandConstant('{app}\DLL_BACKUP'),'*.dll',False,True);

CancelButton.Enabled := True; /// делаем кнопку "Отмена" активной
ProgressGauge.Visible := CancelButton.Enabled; /// ну и зависмсость прогресбара от состояния кнопки, те видимым
end;
end;
end;
end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean );
begin
case CurPageID of /// если ай-ди страницы...

wpInstalling: ///...страница установки
begin
case ExitSetupMsgBox of

True:
begin
if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) or DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then /// если существуют файлы бэкапа
begin
Confirm := False; /// убираем подтверэдение

with WizardForm do
begin
StatusLabel.Caption := SetupMessage(msgStatusRollback); // в статул лейбл пишем "Откат..."
CancelButton.Enabled := False; /// для красоты блокируем кнопку "Отмена"
ProgressGauge.Visible := CancelButton.Enabled; /// прячем прогресбар
FilenameLabel.Hide; /// прячем застывший лейбл отображающий какой файл только что распаковывался

if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) then /// здесь тоже самое, только в обратную сторону с удалением
begin
DelTree(ExpandConstant('{app}\{#CLIENT_DIR}'), True, True, True); /// удаляем установленную нами папку CLIENT_DIR
BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),ExpandConstant('{app}\{#CLIENT_DIR}'),'*.*',F alse,True); /// из бэкапа - пользовательские файлы копируем в папку которую только что удалили - CLIENT_DIR
DelTree(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'), True, True, True); /// удаляем папку бэкапа. Дальше по аналогии
end;

if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then
begin
DelTree(ExpandConstant('{app}\{#JINNEE_DIR}'), True, True, True);
BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),ExpandConstant('{app}\{#JINNEE_DIR}'),'*.*',F alse,True);
DelTree(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'), True, True, True);
end;

if DirExists(ExpandConstant('{app}\DLL_BACKUP')) then
begin
BackupDir(ExpandConstant('{app}\DLL_BACKUP'),ExpandConstant('{app}'),'*.dll',False,True);
DelTree(ExpandConstant('{app}\DLL_BACKUP'), True, True, True);
end;
end;

Cancel := True; /// выходим из инсталла
end;
end;

False: Cancel := False;

end;
end;
end;
end;



при удалении нужно чтобы удалялось все, кроме каталога db. он и бекапиться не должен. »
[UninstallDelete]
Type: filesandordirs; Name: not "{app}\db"

если нужно откатывать бэкап при удалении, то вот функция


#define MyAppName "DisksInfo"
...

function InitializeUninstall(): Boolean;
var
Errorcode: Integer;
begin
Result := False;

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

if MsgBox(FmtMessage(SetupMessage(msgConfirmUninstall), ['{#MyAppName}']), mbInformation, MB_YESNO) = idYes then
begin
if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) then /// здесь тоже самое, только в обратную сторону с удалением
begin
DelTree(ExpandConstant('{app}\{#CLIENT_DIR}'), True, True, True); /// удаляем установленную нами папку CLIENT_DIR
BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),ExpandConstant('{app}\{#CLIENT_DIR}'),'*.*',F alse,True); /// из бэкапа - пользовательские файлы копируем в папку которую только что удалили - CLIENT_DIR
DelTree(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'), True, True, True); /// удаляем папку бэкапа. Дальше по аналогии
end;

if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then
begin
DelTree(ExpandConstant('{app}\{#JINNEE_DIR}'), True, True, True);
BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),ExpandConstant('{app}\{#JINNEE_DIR}'),'*.*',F alse,True);
DelTree(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'), True, True, True);
end;

if DirExists(ExpandConstant('{app}\DLL_BACKUP')) then
begin
BackupDir(ExpandConstant('{app}\DLL_BACKUP'),ExpandConstant('{app}'),'*.dll',False,True);
DelTree(ExpandConstant('{app}\DLL_BACKUP'), True, True, True);
end;

Result := True;
MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#MyAppName}']), mbInformation, MB_OK);
end
else Result := False;
end;




пользуйся! :)

Разве установка должна отменяться без подтверждения ("Вы уверены...")?

Leka_651
03-08-2012, 17:53
Johny777,
спасибо огромное :) пошла пробовать.

в общем для того чтобы помочь тебе с кнопкой отмены мне нужен твой код целиком или самодостаточный вариант бэкапа с файлами для теста »

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

Разве установка должна отменяться без подтверждения ("Вы уверены...")? »
Обязательно нужно спрашивать. Я хочу в итогов варианте оставить только сообщение "Вы уверены что хотите отменить установку?". Все остальные сообщения уберу) зачем загружать пользователя. :)

nik1967
03-08-2012, 18:26
если хочешь дам тебе папку всех кодов какие есть
только в ней порядок сначала навести нужно »Буду только рад.

Batistas
03-08-2012, 19:03
Ну дак что, мне кто-нибудь поможет? :)

Johny777
05-08-2012, 02:13
скажите пожалуйста как посчитать количество файлов
в папке могут лежать максимум 4 файла. Файлов может быть больше, но инсталл увидит только четыре
мне нужно выполнить действие если "замеченных" файлов больше одного
пока прикинул реализовать так:

iFile1, iFilfe2, iFile3, iFile4: Integer;

if FileExists(S_UPD + '\файл1')) then iFile1 := 1 else iFile1 := 0
if FileExists(S_UPD + '\файл2')) then iFile2 := 1 else iFile2 := 0
if FileExists(S_UPD + '\файл3')) then iFile3 := 1 else iFile3 := 0
if FileExists(S_UPD + '\файл4')) then iFile4 := 1 else iFile4 := 0

if iFile1 + iFilfe2 + iFile3 + iFile4 > 1 then действия

может есть более грамотный способ
я очень мало знаю о .Count
может он?

Gnom_aka_Lexander
05-08-2012, 10:11
Johny777, вот так можно:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*code]
function GetFileCount(dir: string): Integer;
var
FindFiles: TFindRec;
begin
Result:= 0;
if FindFirst(dir+'\*.*', FindFiles) then
begin
repeat
if FindFiles.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then Continue;
Result:= Result+1;
until not FindNext(FindFiles);
FindClose(FindFiles);
end;
end;

procedure InitializeWizard();
begin
WizardForm.WelcomeLabel1.Caption := IntToStr(GetFileCount(ExpandConstant('{pf}\Inno Setup 5')));
end;

Johny777
05-08-2012, 11:54
Gnom_aka_Lexander,
спасибо
сохранил себе пример
пригодится
но мне нужно не все подряд считать а только 4 файла с именами
те файлы
'hl2_update.exe'
'hl2_ep1_update.exe'
'hl2_ep2_update.exe'
'portal_update.exe'
дело в том, что у меня на поиск всех этих 4-х обновлений отведена только
одна кнопка вызывающая форму обзора, через которую можно указать их расположение (оно так и должно быть)
пример: "в папке по умолчанию", те рядом с инсталлом лежат 4 файла, те максимальное количество
я хочу установить 3 из них, а один из другой директории
указываю директорию, но там 2 файла и получается, что они (эти 2 архива.exe) перезаписывают существующие пути заменяя {src}\Outer\update
на например C:\update
скрин-пример
http://img13.imageshack.us/img13/7518/29481598.png (http://imageshack.us/photo/my-images/13/29481598.png/)
папки с многоточием это путь "не рядом с инсталлом"
без многоточия - рядом
в пути лежат 3 апдейта
рядом 4
в итоге из пути будут взяты 3, а из "рядом с инсталом" только 1



поэтому если файлов в указываемой директории больше одного - 2, 3, 4 то должна вылезти маленькая форма (совсем маленькая) с чекбоксами, через которую
можно подтвердить какие апдейты оттуда брать

Gnom_aka_Lexander
05-08-2012, 13:01
Johny777, дык, элементарно добавить условие и все.

; перечисляем файлы через запятую, каждый в своих одинарных кавычках, все вместе - в двойных кавычках.
#define FNames "'hl2_update.exe', 'hl2_ep1_update.exe', 'hl2_ep2_update.exe', 'portal_update.exe'"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*code]
function GetFileCount(dir : string): Integer;
var
FindFiles: TFindRec;
begin
Result:= 0;
if FindFirst(dir+'\*.*', FindFiles) then
begin
repeat
if FindFiles.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then Continue;
case ExtractFileName(FindFiles.Name) of
{#FNames} : Result:= Result+1;
end;
until not FindNext(FindFiles);
FindClose(FindFiles);
end;
end;

procedure InitializeWizard();
begin
WizardForm.WelcomeLabel1.Caption := IntToStr(GetFileCount(ExpandConstant('{pf}\Inno Setup 5')));
end;

в параметре dir функции GetFileCount указываешь нужную тебе папку, или папку, которую вернула функция выбора папки - не знаю, какую из них ты используешь, но смысл понятен, я думаю. так-же можно перечислять не множеством а по очереди и в зависимости от наличия-отсутствия определенного файла дисаблить-енаблить определенные чекбоксы обновления.

Johny777
05-08-2012, 14:03
Gnom_aka_Lexander,
спасибо за функцию :)
понял
или папку, которую вернула функция выбора папки - не знаю, какую из них ты используешь »
функция будет прощупывать ту папку на которую укажет пользователь
она будет обрабатываться в событии OnChage элемента конструктора TFolderTreeView
там же и блокируются/разблокируются чекбоксы таким образом:
var
S_UPD: String;
...
S_UPD := TFolderTreeView(Sender).Directory;
hl2_update_Checkbox.Enabled := FileExists(S_UPD + '\hl2_update.exe');
____________________________
ещё хотел спросить

у меня есть просчёт размера устанавливаемых компонентов
там сложение размера файлов и их размер зависит от наличия гкф файла в пути установки
я хотел сделать это математическое сложения для повышения скорости обработки вставкой кода ассемблера
(ассемблер не знаю, но почитал статью
http://sources.ru/delphi/op/learning_asm_in_delphi_1.shtml
по дельфи, где есть такой пример)
так и не смог
в инно вылетает ошибка на ключевом слове asm

например
function Count(): Integer;
begin

asm
сложение(рассчёт)
end;

end;

получается инно просто его не поддерживает?

Gnom_aka_Lexander
05-08-2012, 15:21
получается инно просто его не поддерживает? »
именно. я нигде в справке не нашел поддержку ассеблерных вствок.
хотя.. компилятор вроде как понимает логическую скобку asm. можно попробовать сделать так:
function Count(): Integer;
asm
сложение(рассчёт)
end; тоесть функция полностью на асме, без паскалевских логических скобок.

El Sanchez
06-08-2012, 09:34
Ну дак что, мне кто-нибудь поможет? »
Batistas, держите, рюшечки сами добавите:


#define MyAppName "Synergetic & MaxiRu DC-P2P Pack"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "-=Batista=-"
#define MyAppURL "http://synergetic-hub.org/"
#define MyAppExeName "ApexDC-s16_4.exe"
#define StartupIcon "Запускать при старте Windows"

[Setup]
AppId={{E20E5BAA-70B0-4EE4-8D27-B1E312B1C083}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=C:\Users\Batista\Desktop\Сборка DC++
OutputBaseFilename=Synergetic & MaxiRu DC-P2P Pack 1.0.0
SetupIconFile=C:\Users\Batista\Desktop\Сборка DC++\ApexDC-s16_4.exe\ApexDC-s16_4.exe\Icon.ico
Compression=lzma2
SolidCompression=yes

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

[CustomMessages]
russian.NickNamePageCaption=Информация о пользователе
russian.NickNamePageDescription=Какой ник у Вас в DC++?
russian.NickNamePageSubcaption=Укажите ник и нажмите "Далее"%n%nРекомендуемые символы в нике:%n0123456789%nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%n()+=[]^_{{})"%nАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя
russian.NickNamePageEditName=Имя пользователя в DC++:
russian.DownloadDirPageCaption=Выбор каталога для загрузки
russian.DownloadDirPageDescription=Где будут храниться загружаемые файлы?
russian.DownloadDirPageSubcaption=Укажите каталог для скачки (при старте он будет автоматически "расшарен")
russian.ShareDirPageCaption=Выбор каталога для общего доступа
russian.ShareDirPageDescription=Где будут храниться файлы для общего доступа?
russian.ShareDirPageSubcaption=Укажите каталог для файлов общего доступа

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1
Name: startupicon; Description: {#StartupIcon}; GroupDescription: {cm:AdditionalIcons}

[Files]
Source: "ApexDC-s16_4.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Batista\Desktop\Сборка DC++\ApexDC-s16_4.exe\ApexDC-s16_4.exe\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs


[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
Name: {userstartup}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: startupicon

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent
Filename: {#MyAppURL}; Verb: open; Description: Посетить сайт проекта Synergetic & MaxiRu; Flags: postinstall shellexec skipifsilent

[Code]
var
NickNamePage: TInputQueryWizardPage;
DownloadDirPage, ShareDirPage: TInputDirWizardPage;
AboutInfoButton: TButton;
URLlink: TLabel;

procedure CreateDCPlusPlus(Filename: String);
var
objXMLDoc: Variant;
begin
try
objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
except
ShowExceptionMessage;
Exit;
end;
objXMLDoc.async := False;
objXMLDoc.AppendChild(objXMLDoc.createProcessingInstruction('xml', 'version="1.0" encoding="utf-8" standalone="yes"'));
objXMLDoc.AppendChild(objXMLDoc.createNode(1, 'DCPlusPlus', ''));

//settings node
objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createNode(1, 'Settings', ''));

//nick node
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'Nick', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/Nick').text := NickNamePage.Values[0];

//downdir node
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'DownloadDirectory', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/DownloadDirectory').text := DownloadDirPage.Values[0];

//russian xml
if FileExists(ExpandConstant('{app}\Settings\Russian.xml')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'LanguageFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/LanguageFile').text := 'Russian.xml';
end;

//sounds
if FileExists(ExpandConstant('{app}\Sounds\PrivateMessage.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'BeepFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/BeepFile').text := 'PrivateMessage.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\DownloadBegins.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'BeginFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/BeginFile').text := 'DownloadBegins.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\DownloadFinished.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'FinishedFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/FinishedFile').text := 'DownloadFinished.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\AltSourceAdded.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SourceFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SourceFile').text := 'AltSourceAdded.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\UploadFinished.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'UploadFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/UploadFile').text := 'UploadFinished.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\FakerFound.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'FakerFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/FakerFile').text := 'FakerFound.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\MyNickInMainChat.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'ChatNameFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/ChatNameFile').text := 'MyNickInMainChat.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\FileCorrupted.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundTTH', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundTTH').text := 'FileCorrupted.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\UnhandledException.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundException', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundException').text := 'UnhandledException.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\HubConnected.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundHubConnected', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundHubConnected').text := 'HubConnected.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\HubDisconnected.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundHubDisconnected', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundHubDisconnected').text := 'HubDisconnected.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\FavUser.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundFavUserOnline', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundFavUserOnline').text := 'FavUser.wav';
end;

if FileExists(ExpandConstant('{app}\Sounds\FavUserDisconnected.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundFavUserOffline', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundFavUserOffline').text := 'FavUserDisconnected.wav';
end;

//share node
objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createNode(1, 'Share', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Share').AppendChild(objXMLDoc.createNode(1, 'Directory', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').setAttribute('Virtual', ExtractFileName(RemoveBackSlash(ShareDirPage.Values[0])));
objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').text := ShareDirPage.Values[0];

//prevapps node
objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createNode(1, 'PreviewApps', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps').AppendChild(objXMLDoc.createNode(1, 'Application', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Name', 'AVI Preview');
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Application', ExpandConstant('{app}\AVIPreview.exe'));
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Arguments', '%[file]');
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Extension', 'avi;divx;mpg;mpeg;vob');

objXMLDoc.save(Filename);
end;

function ReadDCPlusPlus(Filename, Node, Default: String): String;
var
objXMLDoc: Variant;
begin
Result := Default;
if not FileExists(Filename) then Exit;
try
objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
except
ShowExceptionMessage;
Exit;
end;
objXMLDoc.load(Filename);
objXMLDoc.async := False;
if objXMLDoc.parseError.errorCode <> 0 then Exit;
Result := objXMLDoc.selectSingleNode(Node).text;
end;

procedure CreateNickNamePage;
begin
NickNamePage := CreateInputQueryPage(wpSelectTasks, ExpandConstant('{cm:NickNamePageCaption}'), ExpandConstant('{cm:NickNamePageDescription}'), ExpandConstant('{cm:NickNamePageSubcaption}'));
NickNamePage.Add(ExpandConstant('{cm:NickNamePageEditName}'), False);
NickNamePage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Settings/Nick', '');
end;

procedure CreateDownloadDirPage;
begin
DownloadDirPage := CreateInputDirPage(NickNamePage.ID, ExpandConstant('{cm:DownloadDirPageCaption}'), ExpandConstant('{cm:DownloadDirPageDescription}'), ExpandConstant('{cm:DownloadDirPageSubcaption}'), False, 'Новая папка');
DownloadDirPage.Add('');
DownloadDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Settings/DownloadDirectory', WizardDirValue + '\Settings\Downloads');
end;

procedure CreateShareDirPage;
begin
ShareDirPage := CreateInputDirPage(DownloadDirPage.ID, ExpandConstant('{cm:ShareDirPageCaption}'), ExpandConstant('{cm:ShareDirPageDescription}'), ExpandConstant('{cm:ShareDirPageSubcaption}'), False, 'Новая папка');
ShareDirPage.Add('');
ShareDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Share/Directory', '');
end;

procedure ControlOnClick(Sender: TObject);
var
ResultCode: Integer;
begin
if Sender is TButton then MsgBox('bla-bla-bla', mbInformation, MB_OK);
if Sender is TLabel then ShellExec('open', '{#MyAppURL}', '', '', SW_SHOW, ewNoWait, ResultCode);
end;

procedure CreateAboutInfoButton;
begin
AboutInfoButton := TButton.Create(WizardForm);
with AboutInfoButton do begin
Parent := WizardForm;
SetBounds(WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width, WizardForm.CancelButton.Top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
Caption := 'About...';
OnClick := @ControlOnClick;
end;
end;

procedure CreateURLlink;
begin
URLlink := TLabel.Create(WizardForm);
with URLlink do begin
Parent := WizardForm;
Left := 2*AboutInfoButton.Left + AboutInfoButton.Width;
Top := AboutInfoButton.Top + AboutInfoButton.Height - Height;
Caption := '{#MyAppURL}';
Font.Color := clBlue;
Font.Style := [fsUnderline];
Cursor := crHand;
OnClick := @ControlOnClick;
end;
end;

procedure InitializeWizard();
begin
CreateNickNamePage;
CreateDownloadDirPage;
CreateShareDirPage;
CreateAboutInfoButton;
CreateURLlink;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssPostInstall: CreateDCPlusPlus(ExpandConstant('{app}\Settings\DCPlusPlus.xml'));
end;
end;

Batistas
06-08-2012, 23:43
Batistas, держите, рюшечки сами добавите
Все бы идеально, если бы не - http://s51.radikal.ru/i132/1208/f8/f20598db3f63.png (ISC 5.5.1 Unicode) и - http://s60.radikal.ru/i169/1208/8a/1e05c2f2ca3a.png (ISS 5.5.1) :( Система Win 7 x64 SP1

nik1967
06-08-2012, 23:56
Batistas, может стоит установить расширенную версию от Китайских братьев? ISC 5.5.1. ee1 (u) Система Win 7 x64 SP1
http://bestrepack.net/forum/pictures/16aedcc505663cb638a122fab0e8fb35.jpg

Batistas
07-08-2012, 00:47
Batistas, может стоит установить расширенную версию от Китайских братьев? ISC 5.5.1. ee1 (u) Система Win 7 x64 SP1
http://s014.radikal.ru/i329/1208/08/29dbd796a9c2.png :( Может быть я что не так установил...




© OSzone.net 2001-2012