Войти

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

FanN
03-03-2012, 06:57
И еще вопрос: как вшить в инсталлятор свой шрифт? Как я понял, форточка не распознает шрифт просто так, его нужно вначале установить, а для этого нужно добавить строку в реестре и скопировать сам шрифт на системный диск.. Хотело бы увидеть как это будет выглядеть.. Спасибо.

З.Ы. в виде батника и рэг-файла не подходит, хотелось, чтобы все было прописано а инталляторе

Johny777
03-03-2012, 19:08
И еще вопрос: как вшить в инсталлятор свой шрифт? Как я понял, форточка не распознает шрифт просто так, его нужно вначале установить, а для этого нужно добавить строку в реестре и скопировать сам шрифт на системный диск.. Хотело бы увидеть как это будет выглядеть.. Спасибо. »

2 примера


[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
OutputBaseFilename=setup

[Files]
Source: Alterna.ttf; Flags: dontcopy

[_Code]
function AddFontResource(FileName: PAnsiChar): Integer; external 'AddFontResourceA@gdi32.dll stdcall';
function RemoveFontResource(FileName: PAnsiChar): BOOL; external 'RemoveFontResourceA@gdi32.dll stdcall';

function InitializeSetup(): boolean;
begin
ExtractTemporaryFile('Alterna.ttf');
Result:=AddFontResource(ExpandConstant('{tmp}')+'\Alterna.ttf')>0; //добавляем шрифт в таблицу шрифтов
if Result then SendMessage(HWND_BROADCAST,$1D,0,0); //оповещаем окна верхнего уровня о том, что изменилась таблица шрифтов
end;

procedure InitializeWizard();
begin
WizardForm.WelcomeLabel1.Font.Name:= 'a_AlternaBrk';
WizardForm.WelcomeLabel1.Font.Style:= [fsBold];
end;

procedure DeinitializeSetup();
begin
//удаляем свой шрифт и оповещаем окна верхнего уровня о том, что изменилась таблица шрифтов
if RemoveFontResource(ExpandConstant('{tmp}')+'\Alterna.ttf') then SendMessage(HWND_BROADCAST,$1D,0,0);
end;


,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,


#define Font "Zombie.ttf"
#define FontName "DS Zombie Cyr"

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

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

[Files]
Source: {#Font}; Flags: dontcopy;

[_code]
var
IsCustomFontInstalled: boolean;
FontName: string;

function AddFontResource(FileName: PAnsiChar): Integer; external 'AddFontResourceA@gdi32.dll stdcall';
function RemoveFontResource(FileName: PAnsiChar): BOOL; external 'RemoveFontResourceA@gdi32.dll stdcall';

Procedure InitializeWizard();
begin
ExtractTemporaryFile('{#Font}');
IsCustomFontInstalled:=AddFontResource(ExpandConstant('{tmp}')+'\{#Font}')>0;
if IsCustomFontInstalled then SendMessage(HWND_BROADCAST,$1D,0,0);
if FontExists('{#FontName}') then FontName:='{#FontName}' else FontName:='Arial';
WizardForm.Font.Name:= FontName;
end;

procedure DeInitializeSetup();
begin
WizardForm.Free
if IsCustomFontInstalled then
if RemoveFontResource(ExpandConstant('{tmp}')+'\{#Font}') then SendMessage(HWND_BROADCAST,$1D,0,0);
end;

Ivan_009
04-03-2012, 15:57
Как мне сделать страницу с выбором программной группы помогите пожалуйста вот скрипт

Rikill
04-03-2012, 16:14
Johny777, это кривые варианты. У некоторых не будет работать.

Johny777
04-03-2012, 18:55
Rikill,
у тебя есть лучше?
(сам один пример использую)
некоторых не будет работать »
от чего зависит?

FanN
04-03-2012, 20:24
Johny777, спасибо, второй вариант помог.

FanN
04-03-2012, 22:46
А как сделать так, чтобы фон текста был прозрачен? Что прописывать? Заранее благодарю.

Johny777
05-03-2012, 00:34
не уверен, но припиши на каждом тексте
Transparent:=True;

DragonTander@fb
05-03-2012, 04:33
уже ничего, удалите это сообщение пожалуйста

Rikill
05-03-2012, 19:34
Johny777, у меня есть лучше. Закрытый вариант.
Зависит не известно от чего.
DragonTander@fb, а самому удалить сообщение не судьба?

Johny777
05-03-2012, 22:33
Закрытый вариант. »
?
у меня есть лучше »
можешь поделиться?
Зависит не известно от чего. »
там где я нашёл эти решения писали, что зависит от уровня убитости виндоуса

YURSHAT
06-03-2012, 01:49
ohny777, это кривые варианты. У некоторых не будет работать. »
Если немного подправить, то заработает у всех :)

И еще вопрос: как вшить в инсталлятор свой шрифт? »

#define Font "Alterna.ttf"
#define FontName "Alterna"

[Setup]
AppName=SetTemporaryFont
AppVerName=SetTemporaryFont
DefaultDirName={pf}\SetTemporaryFont
OutputBaseFilename=setup

[Files]
Source: {#Font}; Flags: dontcopy

[Code ]

var
IsCustomFontInstalled: boolean;
FontName: string;

function AddFontResource(FileName: PAnsiChar): Integer; external 'AddFontResourceA@gdi32.dll stdcall';
function RemoveFontResource(FileName: PAnsiChar): BOOL; external 'RemoveFontResourceA@gdi32.dll stdcall';

function InitializeSetup: boolean;
begin
FontName:='Tahoma';
ExtractTemporaryFile('{#Font}');
IsCustomFontInstalled:=AddFontResource(ExpandConst ant('{tmp}')+'\{#Font}')>0;
if IsCustomFontInstalled then PostMessage(HWND_BROADCAST,$1D,0,0);
if FontExists('{#FontName}') then FontName:='{#FontName}' else FontName:='Arial';
if IsCustomFontInstalled then FontName:='{#FontName}';
Result:=True;
end;

procedure InitializeWizard;
begin
WizardForm.Font.Name:=FontName;
end;

procedure DeinitializeSetup;
begin
WizardForm.Free
if IsCustomFontInstalled then
if RemoveFontResource(ExpandConstant('{tmp}')+'\{#Font}') then PostMessage(HWND_BROADCAST,$1D,0,0);
end;

Aquila
06-03-2012, 13:50
Я бы хотел спросить можно ли сжать файлы лучше чем ultra ? Может быть 7z'ом запаковать и можно чтобы он извлекал из файла .7z но показывал как обычную распаковку программой ?

R.i.m.s.k.y.
06-03-2012, 14:16
Aquila, Inno и сам использует 7z, так что смысла нет

Aquila
06-03-2012, 14:25
R.i.m.s.k.y., А файлы .arc - это что ? Замечал что есть инсталяторы inno setup с использованием этих архивов.

R.i.m.s.k.y.
06-03-2012, 14:27
Aquila, не поверишь - freearc!
но лично я не вижу смысла в нем, места занимают не намного меньше, а калорийности требуют сильно больше, при установке требуется для распаковки рама, место на жеском и время.
Это не твой выбор, бро!

кстати про 7зип: я делал дистр Ведьмака1 на инно с максимальным сжатием, и для сравнения сжал эту же папку 7зипом с теми же настройками, так вот инно утоптал на 100 метров сильнее, хотя при общем весе почти 9 гиг эти 100 метров что слону булочка

Aquila
06-03-2012, 14:38
R.i.m.s.k.y., Спасибо за подробное пояснение :up

R.i.m.s.k.y.
06-03-2012, 14:44
Aquila, да пожалста!
"полезное сообщение" давануть не забудь!

Johny777
06-03-2012, 15:57
Aquila,
настройка стндартных средств на максимальное сжатие
сожми с разными размерами словаря и узнаешь что тебе лучше
Compression=lzma2/ultra64
LZMAUseSeparateProcess=yes
LZMAMatchFinder=BT
LZMANumFastBytes=273
LZMADictionarySize=262144
///LZMADictionarySize=131072
InternalCompressLevel=ultra64
///SolidCompression=true
MergeDuplicateFiles=true
___________________________________________________________

сделал деинсталятор с выбором компонентов:
1. в основной установщик вписать это

[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
/// переименовываем созданный автоматом родной деинсталятор в например 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;

в основном скрипте мы закончили


2. сам деинсталятор

#define MyAppName "Uninstall"

[Setup]
AppId=proto15
SourceDir=.
OutputDir=Setup
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false
//SetupIconFile=hl2.ico

ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no
DisableProgramGroupPage=yes
DisableWelcomePage=yes
DisableDirPage=yes
DisableReadyPage=yes
DisableFinishedPage=yes




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




[Components]
Name: hl2; Description: Half-life 2; Check: del_hl2
Name: ep1; Description: Half-life 2 Episode One; Check: del_ep1
Name: ep2; Description: Half-life 2 Eposode Two; Check: del_ep2
Name: portal; Description: Portal; Check: del_portal

///всё как с обычно - файлы помеченные одним компонентов или несколькими, если фай общий, но заде для секции [InstallDelete], которая выполняется перед установкой
[InstallDelete]
Type: filesandordirs; Name: {src}\..\common\half-life 2; Components: hl2
Type: filesandordirs; Name: {src}\..\common\half-life 2 episode one; Components: ep1
Type: filesandordirs; Name: {src}\..\common\half-life 2 episode two; Components: ep2
Type: filesandordirs; Name: {src}\..\common\portal; Components: portal

Type: files; Name: {src}\..\half-life 2 buka russian.gcf; Components: hl2
Type: files; Name: {src}\..\half-life 2 2007 base content.gcf; Components: hl2
Type: files; Name: {src}\..\half-life 2 content.gcf; Components: hl2
Type: files; Name: {src}\..\half-life 2 game dialog.gcf; Components: hl2
Type: files; Name: {src}\..\episode one 2007 content.gcf; Components: ep1
Type: files; Name: {src}\..\half-life 2 episode one.gcf; Components: ep1
Type: files; Name: {src}\..\episode two content.gcf; Components: ep2
Type: files; Name: {src}\..\episode two maps.gcf; Components: ep2
Type: files; Name: {src}\..\episode two materials.gcf; Components: ep2

Type: files; Name: {src}\..\source 2007 binaries 2.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\half-life 2_russian.gcf; Components: hl2 and ep1 and ep2
Type: files; Name: {src}\..\portal content.gcf; Components: portal
Type: files; Name: {src}\..\portal english.gcf; Components: portal
Type: files; Name: {src}\..\portal russian.gcf; Components: portal
Type: files; Name: {src}\..\source 2007 shared materials.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source 2007 shared models.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source 2007 shared sounds.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source materials.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source models.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source sounds.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\episode 1 shared.gcf; Components: ep1 and ep2
Type: files; Name: {src}\..\episodic 2007 shared.gcf; Components: ep1 and ep2
Type: files; Name: {src}\..\half-life 2 episode one russian.gcf; Components: ep1 and ep2
Type: files; Name: {src}\..\half-life 2 episode two english.gcf; Components: ep2
Type: files; Name: {src}\..\half-life 2 episode two russian.gcf; Components: ep2

Name: {commondesktop}\Half-Life 2.lnk; Type: files; Components: hl2
Name: {commondesktop}\Half-Life 2 Episode One.lnk; Type: files; Components: ep1
Name: {commondesktop}\Half-Life 2 Episode Two.lnk; Type: files; Components: ep2
Name: {commondesktop}\Portal.lnk; Type: files; Components: portal

[_Code]
/// здесь начинается проверка устанолен компонент или нет. Лучше всего проверять уникальный файл, но в моём случае проверяются одинаковые файлы, но в разных директориях /// начало ///провнрки
function del_hl2:boolean;
var
sz:Integer;
s:string;
begin
Result:=True;
begin
If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') then
Result:=False
end;
end;


function del_ep1:boolean;
var
sz:Integer;
s:string;
begin
Result:=True;
begin
If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') then
Result:=False
end;
end;


function del_ep2:boolean;
var
sz:Integer;
s:string;
begin
Result:=True;
begin
If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') then
Result:=False
end;
end;


function del_portal:boolean;
var
sz:Integer;
s:string;
begin
Result:=True;
begin
If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\portal'))='') then
Result:=False
end;
end;

/// конец проверки.//// если какого то файла нет, то и нет чекбокса в окне списка компонентов

Var
ResultCode: integer;
/// а теперь главное. Если удалить один компонет, то общие файлы не удаляться, тк используются другим компонентом. Я столкнулся с проблемой, что удалил всё, но основа остаётся, поэтому идёт такая же проверка как и сверху и если нет ни одного компонента (уникального файла, подтверждающего наличие компонента), то выпоняется родное удаление в очень тихом режиме и удаляется вся
///папка. Разберём пример. При инициализации деинсталятор "видит" 2 компонента - hl2 и портал. При удалении только портала удаляется всё уникальное от портала, но hl2 и общие файлы ///остаются, тут же доходит до дейстий кода ниже. Идёт вторая проверка, но не нацеленная не на создание чекбокса, а на проверку есть ли хоть один компонент и он есть - это hl2. Вызываем //деинстаятор ещё раз и видим в списке только hl2. Удаляем и снова доходит до второй проверки на шаге ssDone. Он не видит не одного hl2.exe в разных директория, и вызывает другой //деинсталятор, который трёт всё
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
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;

чтобы данный деинсталятор работал нужно знать общие, и уникальные файлы приложения. А также нужен хотя бы оди уникальный файл на проверку наличия компонента.




проверено
работает как часы

R.i.m.s.k.y.
06-03-2012, 16:05
Johny777, тож вариант, но для разбора компонентов можно использовать ключ реестра \\\Registry\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{AppName}_is1\Inn o Setup[colon] Selected Components
ну и SolidCompression=true лучше не комментировать, а в секции Files для мелких файлов указывать флаг SolidBreak
Ну и можно добавить CompressionThreads=4




© OSzone.net 2001-2012