PDA

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


Страниц : 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 101 102 103 104 105

alert30
29-03-2012, 18:03
rasim933, пока еще не понимаем, каким способом сжать установщик > 30 %. Сейчас подумаю...

Johny777
29-03-2012, 19:12
Ivan_009,Что случилось?
Ваня!
Родимый!
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
А то я подключаю 12 модулей »
вот почему модули не использую
в одном скрипте при компиляции и отладке он проблемные строки посвечивает, а в модуле нет.
Модуль хорош, когда у тебя много сообщений и они готовы.
Или секция файлов полностью готова.
Убрал из скрипта и перематывать меньше!
.,......................................................
rasim933,
инсталл в инсталле?

rasim933
29-03-2012, 19:32
В этом то и прикол. Инстал в инстале неустраивает меня. А другого способоба я незнаю. Вот у вас и спрашиваю..

МНе не обязательно перезжать игру, мне необходимо её разбить на много частей. Если я начинаю разбивать игру, то получается инсталл в инсталле.

Johny777
29-03-2012, 20:15
ну так перепакуй
или ты знаешь как разбить готовый инсталл?
Я нет
И скажи
зачем тебе его разбивать?

rasim933
29-03-2012, 20:47
или ты знаешь как разбить готовый инсталл? »
Готовый инсталл, только если в архив пихнуть. Но это нето.

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

зачем тебе его разбивать? »
Затем, что эта игра на 1,75 гб, непомещяется на 4-ёх дисках. В 1 диске остаётся 810 мегабайт свободного места, во 2 - 100 мб, в 3 - 510 мб, в 4 - 310 мб. Вот я и хочу разбить игру, чтоб запихать половинки на диски со свободным местом.

Скрин:http://i28.fastpic.ru/thumb/2012/0329/0a/c888eb1756d669332ad7fc6b0d5bae0a.jpeg (http://fastpic.ru/view/28/2012/0329/c888eb1756d669332ad7fc6b0d5bae0a.png.html).

Предоставить вам скрины с размерами игр?



P.S. - Я извиняюсь за причинённые неприятности, но без вашей помощи я несправлюсь сам.

Johny777
29-03-2012, 23:25
Я знаю, что игру сначала надо установить, потом все файлы из папки с установленной игрой запихать в инно, потом ключи реестра доста (мне неизвестен способ достования и поиска ключей реестра), и запокавать. Возжно что я ошибаюсь. »
для начала
если игра запакована в инно, то используй инно анпакер (есть в комплекте Inno Ultra) и нет, то ключи доставай сам.
но без вашей помощи я несправлюсь сам. »
ну проблем нет. Чем смогу помогу.
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\
и кстати. Есть такая штука. Называется overburn, которая доступна например в ImageBurn
позволяет записать больше чем дозволено.

rasim933
30-03-2012, 12:21
ОК. Попробую.

Johny777
30-03-2012, 14:48
Подскажите пожалуйста
на выкатывающейся панели разместил InfoBeforeMemo
в нём находятся параметры консоли.
Как активировать копирование.
Т.е. выделяешь нужную команду, правой кнопкой - "копировать" и потом вставить в эдит
вот наглядный пример
http://rghost.ru/private/37311619/5f7a6e5ce7087bcce007b55aa05bdf07/image.png (http://rghost.ru/private/37311619/5f7a6e5ce7087bcce007b55aa05bdf07.view)
пока что работает только через связку ctrl+c и shift+insert.
если это слишком сложно реализовать, то не надо, т.к. это не самое важное :good:

El Sanchez
30-03-2012, 16:38
Как активировать копирование »
Johny777, забыл, что ли, как в авторане я тебе делал? :)

[Code]
var
PopMenu: TPopupMenu;
Menu: TMenuItem;

procedure MenuOnClick(Sender: TObject);
begin
WizardForm.InfoBeforeMemo.CopyToClipboard;
end;

procedure InitializeWizard();
begin
PopMenu := TPopupMenu.Create(WizardForm);
Menu := TMenuItem.Create(WizardForm);
Menu.Caption := 'Копировать';
Menu.OnClick := @MenuOnClick;
PopMenu.Items.Add(Menu);
WizardForm.InfoBeforeMemo.PopupMenu := PopMenu;
end;

Johny777
30-03-2012, 17:04
Спасибо! Теперь как в консоли самой игры и очень удобно!
забыл, что ли, как в авторане я тебе делал? »
никак нет! Его я проштудировал и многое реализовал. В том числе перенёс деинсталятор на ту же форму.
а про всплывающее меню даже не подумал, тк там при нажатии на кнопку (это теперь я тоже могу (спасибо ещё раз! :bow: )).

Кстати. Деинсталятор с выбором компонентов ещё доработал и полностью перенёс в код
может кому-то пригодится!
вот пример.

это в основной скрипт


[Setup]
UninstallFilesDir={app}\uninstall
/// привык держать деинсталятор в отдельной папке

[Files]
/// наш заранее скомпилированный деинсталятор пакуется вместе с файлами основного инсталятора
Source: uninstall\Setup\Uninstall.exe; DestDir: {app}\uninstall; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension;

[UninstallDelete]
/// удаление приложени нацелено на удаление всей папки!
Type: filesandordirs; Name: {app}

[code]
procedure CurPageChanged(CurPageID: Integer); /// при смене страниц
begin
if CurPageID=wpInstalling then /// страница установки
/// столкнулся с проблемой. Если установить с действиями на станице завершения без действий строкой ниже и потом
/// установить ещё раз поверх, то второй раз из списка удаления программ вызывается уже не форма с выбором компонентов,
///а простой стандартный стиратель с вопросом "Удалть? Да и Нет"
// поэтому при повторной установке в ту же директорию проверяем есть ли там деинсталяторы и стираем их, если они есть
/// родной создаётся заново, а наш, в виде формы, копируется и (описание ниже)
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'));
end;
if CurPageID=wpFinished then /// завершающая страница
begin
/// переименовываем созданный автоматом родной деинсталятор в например unins007.exe и unins007.dat
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'))
///теперь переименовываем наш деинсталятор в родное название (см выше) unins000.exe
if FileExists(ExpandConstant('{app}\uninstall\Uninstall.exe')) then
RenameFile(ExpandConstant('{app}\uninstall\Uninstall.exe'), ExpandConstant('{app}\uninstall\unins000.exe'))
end;
end;


сам деинсталятор но в отличии от старого в виде формы

#define MyAppName "Uninstall"

[Setup]
#define MyAppName "Uninstall"

[Setup]
AppId=proto15
SourceDir=.
OutputDir=Setup
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


[CustomMessages]
ru.Uninstall=удалить
en.Uninstall=Uninstall

ru.Exit=выход
en.Exit=Exit

[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

[ Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.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';
/// конец

////////////////////////////////////////////////////////////////////////
var
AutoRun: TForm;
ExitButton, UninstallButton: TButton;
ResultCode: Integer;
hl2_Checkbox, ep1_Checkbox, ep2_Checkbox, portal_Checkbox: TCheckBox;
//////////////////////////////////////////////////

function Check_hl2: Boolean; begin Result:=hl2_Checkbox.Checked; end;
function Check_ep1: Boolean; begin Result:=ep1_Checkbox.Checked; end;
function Check_ep2: Boolean; begin Result:=ep2_Checkbox.Checked; end;
function Check_portal: Boolean; begin Result:=portal_Checkbox.Checked; end;

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

procedure Unstall(Sender: TObject); /// выполняется сверху вниз
begin
/// сначало удаляются эксклюзивные файлы и папки для кждого компонента, если
begin
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('{commondesktop}\Half-Life 2.lnk')); /// удаляем ярлык
end // конец
end;

begin
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('{commondesktop}\Half-Life 2 Episode One.lnk'));
end
end;

begin
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('{commondesktop}\Half-Life 2 Episode Two.lnk'));
end
end;

begin
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('{commondesktop}\Portal.lnk'));
end
end;
//// конец первой части. Действие идёт дальше после верхнего удаления. Даже если удаления не было и кто-то просто нажал кнопку "Удалить" ничего не произойдёт, тк
begin /// начинается вторая проверка полуэксклюзивных файлов, те файлов относящихся к 2 из 3 из 4 имеющихся (здесь) коммпонентов. Например half-life 2 episode one russian.gcf
begin /// часть озвучки которого используется во втором эпизоде и вся в первом.
if (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and /// если этого компонента нет
(FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') //// и этого тоже, то
then /// удаляем общие для них (и только для них) файлы
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
begin /// а это проверка для удаления файла half-life 2_russian.gcf, ресурсы которго в той или иной степени нужнв всем hl2 в той или иной мере
/// Напимер
If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') and // проверка раз --- нету
(FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and /// два --- нету
(FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') /// три --- есть. Файл не стирается
then
DeleteFile(ExpandConstant('{src}\..\half-life 2_russian.gcf'));
end
//// конец второй проверки
/// начало 3 -й.
/// А теперь главное. Идёт такая же проверка как и сверху но ведётся поиск всех компонентов и если нет ни одного компонента (уникального файла, подтверждающего наличие компонента), то
/// выпоняется родное удаление в очень тихом режиме и удаляется вся папка. Разберём пример. При инициализации деинсталятор "видит" 2 компонента - hl2 и портал.
/// При удалении только портала удаляется всё уникальное от портала (выше), но hl2 и общие файлы остаются, тут же доходит до дейстий кода ниже. Идёт третья проверка,
/// но не нацеленная не на создание чекбокса, а на проверку есть ли хоть один компонент и он есть - это hl2. Вызываем деинстаятор ещё раз и видим в списке только hl2.
/// Удаляем и снова доходит до третьей проверки. Он не видит не одного hl2.exe в разных директория, и вызывает другой деинсталятор, который трёт всё.
If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') and
(FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and
(FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') and
(FileSearch('hl2.exe', ExpandConstant('{src}\..\common\portal'))='')
then
Exec(ExpandConstant('{src}\unins007.exe'),'/VERYSILENT','', SW_SHOW, ewNoWait, ResultCode); /// запускаем родной деинсталятор в очень тихом режиме.
end;
AutoRun.Close;
end;

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


procedure CreateAutoRun();
begin
//AutoRun
AutoRun := TForm.Create(nil);
with AutoRun do
begin
BorderIcons := [];
SetClassLong(AutoRun.Handle, (-26), GetWindowLong(AutoRun.Handle, (-26)) or $00020000); //тень окна
Position := poScreenCenter;
Caption := 'Uninstall';
ClientWidth := ScaleX(256);
ClientHeight := ScaleY(350);
end;
/////////////////// чекбоксы /// начало
/// создание чекбоксов. По одному на компонент.
begin
begin
hl2_Checkbox := TCheckBox.Create(AutoRun);
with hl2_Checkbox do
begin
Parent := AutoRun;
Caption := 'half-life 2';
Left := ScaleX(40);
Top := ScaleY(20);
Width := ScaleX(200);
Height := ScaleY(15);
Checked := False;
end;
end;

begin
ep1_Checkbox := TCheckBox.Create(AutoRun);
with ep1_Checkbox do
begin
Parent := AutoRun;
Caption := 'half-life 2 episode one';
SetBounds(hl2_Checkbox.Left, hl2_Checkbox.Top + ScaleY(30), ScaleX(200), ScaleY(15));
Checked := False;
end;
end;

begin
ep2_Checkbox := TCheckBox.Create(AutoRun);
with ep2_Checkbox do
begin
Parent := AutoRun;
Caption := 'half-life 2 episode two';
SetBounds(ep1_Checkbox.Left, ep1_Checkbox.Top + ScaleY(30), ScaleX(200), ScaleY(15));
Checked := False;
end;
end;

begin
portal_Checkbox := TCheckBox.Create(AutoRun);
with portal_Checkbox do
begin
Parent := AutoRun;
Caption := 'portal';
SetBounds(ep2_Checkbox.Left, ep2_Checkbox.Top + ScaleY(30), ScaleX(200), ScaleY(15));
Checked := False;
end;
end;
end;
/////////// конец создания чекбоксов. Нихе начинается кусок (procedure CreateAutoRun()) в котором проверяется наличие компонента. Для проверки наличия компонента.
// необходии хотя бы один уникальный файл. Правда здесь в примере идёт поиск одного и того же hl2.exe вразных директориях
// Пример>
// если файл существует здесть (\..\- поднимаемся на уровень выше), то
If FileExists(ExpandConstant('{src}\..\common\half-life 2\hl2.exe')) then /// Half-Life 2
begin
/// чекбоксы этого включен (можно добавить видим/невидим )
hl2_Checkbox.Enabled:= true;
end
else /// в противном случае
begin
hl2_Checkbox.Enabled:= false; /// выключен
end;
///////////
If FileExists(ExpandConstant('{src}\..\common\half-life 2 episode one\hl2.exe')) then /// Half-Life 2 Episode One
begin
ep1_Checkbox.Enabled:= true;
end
else
begin
ep1_Checkbox.Enabled:= false;
end;
///////////
If FileExists(ExpandConstant('{src}\..\common\half-life 2 episode two\hl2.exe')) then /// Half-Life 2 Episode Two
begin
ep2_Checkbox.Enabled:= true;
end
else
begin
ep2_Checkbox.Enabled:= false;
end;
///////////
If FileExists(ExpandConstant('{src}\..\common\portal\hl2.exe')) then /// Portal
begin
portal_Checkbox.Enabled:= true;
end
else
begin
portal_Checkbox.Enabled:= false;
end;
/// конец проверки

AutoRun.Repaint;

/////////////////// кнопки /// начало
///кнопка "Удалить"
UninstallButton := TButton.Create(AutoRun);
with UninstallButton do
begin
Parent := AutoRun;
Left := ScaleX(50);
Top := ScaleY(265);
Width := ScaleX(90);
Height := ScaleY(22);
Cursor := crHand;
Caption := ExpandConstant('{cm:Uninstall}');
OnClick := @Unstall; ///при нажатии выполниется удаление
end;
/// кнопка выход
ExitButton := TButton.Create(AutoRun);
with ExitButton do
begin
Parent := AutoRun;
Left := ScaleX(150);
Top := ScaleY(265);
Width := ScaleX(50);
Height := ScaleY(22);
Caption := ExpandConstant('{cm:Exit}');
Cursor := crHand;
ModalResult := mrCancel;
end;
/// конец

AutoRun.ShowModal;
end;

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

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


проверено
работает как ядерные часы
http://rghost.ru/37317592/image.png (http://rghost.ru/37317592.view)

Devils Night
31-03-2012, 00:25
мне неизвестен способ достования и поиска ключей реестра »Знаю только 2 варианта,
Первый с помощью Regshot, надеюсь тут понятно без слов.
Второй немного по извращённей, с помощью Revo Uninstaller.
Запускаешь Revo Uninstaller, кликаешь на установленную игру, выбираешь Удалить, появится окно, жмёшь Да, выбираешь Расширенный режим, жмёшь Дальше, после появится окно Самого деинсталятора с подтверждением, жмёшь Нет, потом жмёшь Дальше, ждёшь пока он там всё просканит, жмёшь Дальше, вот у тебя должны появиться Найденные записи реестра, а дальше открываешь regedit, смотришь что нашёл Revo Uninstaller, и ищешь в regedit, что нужно сохраняешь. После всей проделанной работы, в Revo Uninstaller, жмёшь отмена и закрывешь, вот и всё. Ну вот как то так.

valyok666
31-03-2012, 05:55
Devils Night, можно также " извращённый " токо через Unistall Tools правый клик по программе показать запись в реестре

R.i.m.s.k.y.
31-03-2012, 08:14
valyok666, Devils Night, rasim933 это именно что извращенный способ тк прога не всегда сносит при деинсталляции все ключи реестра, а вот при инсталляции пишет точно все, так что регшот: снимок1 - поставили - снимок2 - сравнили - через истул импортировали - пути поправили и натюрлих

Devils Night
31-03-2012, 18:54
токо через Unistall Tools правый клик по программе показать запись в реестре »А причём тут SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall? Revo Uninstaller тоже так может, ПКМ -> Открыть ключ реестра, но это не то что нужно.
тк прога не всегда сносит при деинсталляции все ключи реестра »Это вариант, когда без вариантов (на худой конец).
А так то несомненно Regshot, но так или иначе и тут придётся допиливать, удалять не нужное, т.к он много лишнего хлама за собой тащит.

Gnom_aka_Lexander
31-03-2012, 19:48
через истул импортировали »
А чем Серегин конвертер не угодил? Проверял лично, хексовые записи он единственный конвертит адекватно.

Devils Night
31-03-2012, 20:22
Сложный вопрс!

Монтируется образ, в нём присутствует AutoRun.dat, в котором прописан следующий конфиг
[SETUP_CONFIG]
PRODUCT_GUID_KEY=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0E01BD6F-4E8E-4E08-B578-D3EB0972C093}
USB_ID=USB\Vid_00D0&Pid_0000
APP_SETUP_PATH=Data\setup.exe
APP_VERSION_KEY=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0E01BD6F-4E8E-4E08-B578-D3EB0972C093}
APP_VERSION_NAME=AppVersion
APP_VERSION_VALUE=1.0
APP_FILE_NAME=Program.exe
APP_PARAMETER_FLAG=0
APP_PARAMETER= -appid DESKBOARDAPP
APP_PATH_KEY=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0E01BD6F-4E8E-4E08-B578-D3EB0972C093}
APP_PATH_NAME=InstallLocation
FILE_CHECK_NUM=1

[FILE_CHECK_LIST]
FILE0=Program.exe

Краткое описание AutoRun.dat:
[SETUP_CONFIG]
PRODUCT_GUID_KEY - Определяет установлена программа или нет
USB_ID - Определяет вставленно ли устройство (Если устройство не вставлено, то ничего не происходит, если же вставлено, то происходит либо установка setup.exe (если программа не установлена), либо запуск программы Program.exe (при условии если программа установлена)).
APP_SETUP_PATH - если программа не установлена то благодаря этой секции запускает setup.exe

а благодаря
[SETUP_CONFIG]
APP_FILE_NAME и

[FILE_CHECK_LIST]
FILE0
При нахождении ключа {0E01BD6F-4E8E-4E08-B578-D3EB0972C093} запускает программу, и с тем учётом если программа установлена, это определяется по ключу {0E01BD6F-4E8E-4E08-B578-D3EB0972C093}.
Как сделать так, чтобы всё работало?

В основном интересует:
[SETUP_CONFIG]
PRODUCT_GUID_KEY
USB_ID
APP_SETUP_PATH
APP_FILE_NAMEи[FILE_CHECK_LIST]FILE0

Raf-9600
01-04-2012, 16:14
Собсно я хочу добавить поддержку нескольких языков инсталлятора, но вот как это реализовать в секции Code, мне неизвестно =(
Может какой-то добрый человек помочь с этой проблемой?

Вот четыре кода, которые нуждаются в добавлении поддержки многоязычности:

Проверка на кирилицу в пути установки
function NextButtonClick(CurPageID: Integer): Boolean;
var
i,j: integer;
s,c: string;
begin
Result := True;
if CurPageID = wpSelectDir then
begin
c := 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя';
for i:=1 to length(WizardForm.DirEdit.text) do
for j:=1 to length(c) do
begin
if WizardForm.DirEdit.text[i] = c[j] then //{app} содержит русские символы
begin
s := 'В пути установки присутствуют русские буквы, что недопустимо'#13#13'Пожалуйста, повторите ввод.';
MsgBox(s, mbError, mb_Ok);
Result := False ; //запрет перехода на следующую страницу
exit;
end
else Result := True; //разрешаем переход на следующую страницу
end;
end;
end;
Скрипт для вывода данных о винтах.
var
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel: TLabel;
n: Integer;
VolumeName, FileSystemName: String;
VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
ListBox: TListBox;
StartMenuTreeView: TStartMenuFolderTreeView;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := 'Требуется как минимум '+ FloatToStr(round(NeedSize/1024*100)/100) + ' Гб свободного дискового пространства.' else
NeedSpaceLabel.Caption := 'Требуется как минимум '+ IntToStr(NeedSize)+ ' Мб свободного дискового пространства.';end;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

procedure InitializeWizard();
begin
NeedSize := 6100; //Здесь указывается место для приложения
WizardForm.DiskSpaceLabel.Hide;
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
ListBox.Font.Size:= 9
ListBox.Font.Style:= []
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;
WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpSelectDir then
begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
ListBoxRefresh
end;
end;
Описание компонентов
procedure InitializeWizard();
begin
WizardForm.TypesCombo.Visible:=False;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Width := ScaleX(212);
WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription

InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;
InfoPanel.Left := ScaleX(220);
InfoPanel.Width := ScaleX(197);
InfoPanel.Height := WizardForm.ComponentsList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
InfoCaption.Left := ScaleX(234);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;

Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188);
Info.Top := ScaleY(12);
Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
Info.WordWrap := true;

AddDescription(1, 'текст1.');
AddDescription(2, 'текст2.');
AddDescription(3, 'текст3.');
AddDescription(4, 'текст4.');
end;
И такой
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов...';
for z:=2 to N1 do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp');
end;
if CurStep = ssPostInstall then begin
if (IsComponentSelected('GameDiablo2\VoiceD2\German') or IsComponentSelected('GameLoD\VoiceLoD\Italian') or IsComponentSelected('GameLoD\VoiceLoD\Polish') or IsComponentSelected('GameLoD\VoiceLoD\Russian') ) then begin
ChangeCaption('Конвертация монологов...');
RecodeOgg;
end; //if IsComponentSelected
if CurStep = ssPostInstall then RecodeOgg;
end; //CurStep = ssPostInstall
end;

Johny777
01-04-2012, 16:31
Raf-9600,
может так
выплняется то или иное, если ActiveLanguage='Russian'
[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl;
Name: English; MessagesFile: compiler:Languages\English.isl;

и вот первый пример на запрет кириллицы в пути

function NextButtonClick(CurPageID: Integer): Boolean;
var
i,j: integer;
s,c: string;
if ActiveLanguage='Russian' then
begin
Result := True;
if CurPageID = wpSelectDir then
begin
c := 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя';
for i:=1 to length(WizardForm.DirEdit.text) do
for j:=1 to length(c) do
begin
if WizardForm.DirEdit.text[i] = c[j] then //{app} содержит русские символы
begin
s := 'В пути установки присутствуют русские буквы, что недопустимо'#13#13'Пожалуйста, повторите ввод.';
MsgBox(s, mbError, mb_Ok);
Result := False ; //запрет перехода на следующую страницу
exit;
end
else Result := True; //разрешаем переход на следующую страницу
end;
end;
end;

R.i.m.s.k.y.
01-04-2012, 16:32
Raf-9600,
языки делаются воттаг, я не буду парить моск вакуумическими примерами, дерну из рабочего скрипта

# define AppName "SmoothVideo Project"

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl; LicenseFile: License_rus.txt
Name: english; MessagesFile: compiler:Languages\English.isl; LicenseFile: License_eng.txt

[CustomMessages]
english.ResProf=Reset Profiles
russian.ResProf=Сбросить настройки
english.code1={#AppName} depends on the following components:
russian.code1=Для работы {#AppName} требуются следующие программы и компоненты:
english.code2=It is not alowed to install program to the folder with russian characters.%nPlease select another path
russian.code2=В пути установки присутствуют русские буквы, что недопустимо%nПожалуйста, повторите ввод.

[Icons]
Name: {group}\{cm:ResProf}; Filename: {app}\reset-profiles.cmd; WorkingDir: "{app}";

[*CODE]
function IsRus(): Boolean;
begin
if ( Lowercase(ActiveLanguage) = Lowercase('russian') ) then Result := True else Result := False;
end;

function IsEng(): Boolean;
begin
if ( Lowercase(ActiveLanguage) = Lowercase('english') ) then Result := True else Result := False;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
var
i,j: integer;
s,c: string;
begin
Result := True;
if CurPageID = wpSelectDir then
begin
if isRus then begin
c := 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя';
for i:=1 to length(WizardForm.DirEdit.text) do
for j:=1 to length(c) do
begin
if WizardForm.DirEdit.text[i] = c[j] then //{app} содержит русские символы
begin
MsgBox(ExpandConstant('{cm:code2}'), mbError, mb_Ok);
Result := False ; //запрет перехода на следующую страницу
exit;
end
else Result := True; //разрешаем переход на следующую страницу
end; end; end; end;

Johny777
01-04-2012, 16:43
:) использую отображение процентов в установке
вот так

[Files]
Source: Files\*; DestDir: {app}; AfterInstall: ExtLog();

[ code]
var
ProgressLabel: TLabel;

procedure ExtLog();
begin
with WizardForm.ProgressGauge do begin
ProgressLabel.Caption:=IntToStr((Position-Min)/((Max - Min)/100)) + '%'
if (Position-Min)/((Max - Min)/100) > 50 then ProgressLabel.Font.Color:= clWhite
end
end;

procedure InitializeWizard;
begin
ProgressLabel:=TLabel.Create(WizardForm)
ProgressLabel.Top:= 10;
ProgressLabel.Left:= 270;
ProgressLabel.Caption:= '0%';
ProgressLabel.AutoSize:= True;
ProgressLabel.Font.Color:= cl3DdkShadow;
ProgressLabel.Font.Style:= [fsBold];
ProgressLabel.Transparent:= True;
ProgressLabel.Parent:= WizardForm.ProgressGauge;
end;

проблема в том, что лейбл обновляется после копирования файла и если он большой, то рывками например с 50% до 60%
Есть вроде возможность считывать положение прогресбара
может у кого есть пример (там кажется задействована InnoCallBack.dll) для отображения таких процентов?
оно будет точнее




© OSzone.net 2001-2012