PDA

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

boss911
23-12-2012, 15:53
Как удалить окошко создания ярлыков (SelectProgramGroupPage) »
[Setup]
DisableProgramGroupPage=true

smile7
23-12-2012, 17:09
boss911 Спасибо большое) а ведь знал что все просто.
Может подскажешь еще насчет INI/. Вот пример строки


[INI]
Filename: {userdocs}\My Games\file.ini; Section: Actor; Key: fVisibleNavmeshMoveDist; String: 12288.0000
Filename: {userdocs}\My Games\file.ini; Section: Display; Key: fDecalLifetime; String: 10000.0000
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: fMagnetismStrafeHeadingMult; String: 0.0
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: fMagnetismLookingMult; String: 0.0
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: f1PArrowTiltUpAngle; String: 0.7
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: f3PArrowTiltUpAngle; String: 0.7
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: f1PBoltTiltUpAngle; String: 0.7
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: f3PBoltTiltUpAngle; String: 0.7
При установке ругается что не может изменить file.ini (в том случае когда ему выставлен атрибут "только для чтения")
Можно ли это как нибудь обойти? (win7)

R.i.m.s.k.y.
23-12-2012, 20:27
DEZMONDS,
1. нет, копирует файл в папку DestDir, папки нет - создает
2. дописать путь Source: E:\Unity_4.0.7f\Unity\Unity_v4.x.ulf; DestDir: {%ALLUSERSPROFILE}\Unity\;
3. Если тебе нужно переименовать файл то пользуйся параметром DestName
4. Вместо виндовой {%ALLUSERSPROFILE} можно пользоваться инношной константой {commonappdata}

Gnom_aka_Lexander
23-12-2012, 20:51
{%ALLUSERSPROFILE}Unity\ »
слеш не забыл? константы должны без слеша возвращять путь, насколько я помню :)
DestDir: {%ALLUSERSPROFILE}\Unity\;
или так
DestDir: {commonappdata}\Unity\;

SoulSide
23-12-2012, 22:01
DEZMONDS, Смотрите, идёт например
Source: E:\Unity_4.0.7f\Unity\Unity_v4.x.ulf; DestDir: {%ALLUSERSPROFILE};
то что касается Source - это то откуда берутся файл или папка с файлами для инсталлятора, т.е то что при компиляции попадает в инсталлятор.
Для Source нужно указать путь Source: Путь_к_файлу.
Что касается DestDir - это путь назначения, т.е то, куда при установке будут помещены файлы.
Для DestDir так же нужно указать путь DestDir: Путь_для_файла.

Не большой пример:
Source: Путь_к_файлу; DestDir: Путь_для_файла;.
[hr]
Если вам нужно чтоб при установке ещё и переименовывало файл на заданный вами, т.е например в инсталлятор попал файл App.exe и вам нужно чтоб у него было другое название и/или расширение, то нужно добавить DestName:.
DestName: очень удобно использовать в случаях когда у вас одинаковые файлы с теми же именем и расширением. К примеру у вас имеются App.exe и App.exe, то можно сделать так:
[Files]
Source: App,1.exe; DestDir: {app}; DestName: App.exe; Flags: ignoreversion
Source: App,2.exe; DestDir: {app}; DestName: App.exe; Flags: ignoreversionНо при таком раскладе, стоит добавить ещё секцию [Components] и компонент с флагом exclusive, иначе без дела один будет заменять другой.

DEZMONDS
23-12-2012, 23:42
то что касается Source - это то откуда берутся файл или папка с файлами для инсталлятора, т.е то что при компиляции попадает в инсталлятор.
Для Source нужно указать путь Source: Путь_к_файлу.
Что касается DestDir - это путь назначения, т.е то, куда при установке будут помещены файлы.
Для DestDir так же нужно указать путь DestDir: Путь_для_файла. »

первые 2 поста понял ушел исправлять скрипт спасибо. а на счет цитаты то я вот что скажу.
У меня есть на диске "Д" программа я ее запаковываю, в ней имеется файл лицензии, сохраняю ключи реестра.
мне надо сделать так что бы программа работала на другом компе то есть она устанавливалась в любое место диска по запросу пользователя а файл лицензии копировался в профиль пользователя винды на который устанавливается ... в директорию с новой папкой. что бы ключ заработал с программой, так как одного ключа реестра недостаточно."C:\ProgramData\Unity но принцип я понял и уже компилирую ...спасибо всем за объяснения ...


DestName: »
DestName: не очень подходит так как я не использую точный каталог, так как пути системных каталогах отличаются на разных платформах ОС.. но мне нужно не только что бы при выходе файл попадал в каталог профиля "C:\ProgramData" но еще и создавал там папку а в нее уже кидал файл.
больше всего пригляделся вот такой вариант: DestDir: {%ALLUSERSPROFILE}\Unity\; »
DestDir: {%ALLUSERSPROFILE}\Unity\; посмотрим что скажет компилятор)

SoulSide
24-12-2012, 00:15
У меня есть на диске "Д" программа »Этим:
то что касается Source - это то откуда берутся файл или папка с файлами для инсталлятора, т.е то что при компиляции попадает в инсталлятор.
Для Source нужно указать путь Source: Путь_к_файлу.
Что касается DestDir - это путь назначения, т.е то, куда при установке будут помещены файлы.
Для DestDir так же нужно указать путь DestDir: Путь_для_файла. »
я привёл общий пример.

Пути можно по разному указать, либо так:
Source: D:\Application\app.exe; DestDir: {app};если ваш скрипт находится где нибудь на рабочем столе а папка с программой например на диске D.

либо так:
Source: Application\app.exe; DestDir: {app}; в этом случае если ваш скрипт находится вместе с папкой программы.


DestName: не очень подходит »Это на будущее. DestName используется для переименования файлов.

boss911
24-12-2012, 02:53
smile7

Знаю только так:
[Files]
Source: C:\My Games\file.ini; DestDir: {userdocs}\My Games; Flags: overwritereadonly
а далее [INI] сделает свое дело.

Иначе через секцию [Code] надо, тут я не силен.

DEZMONDS
24-12-2012, 05:12
Вот что получилось спасибо всем за содействия))) вы лучшие! (http://www.youtube.com/watch?v=S-ZjV-81z90)

smile7
24-12-2012, 13:46
boss911 Получилось! Спасибо

Johny777
24-12-2012, 14:13
smile7, Как удалить окошко создания ярлыков (SelectProgramGroupPage) »
удали секцию [Icons], ярлыки можно (я б сказал нужно) создать через функцию CreateShellLink, только их не будет в логе деинсталятора, а потому их нужно прибрать вручную при удалении
сразу после нажатия кнопки Далее с окна выбора компонентов приступить к установке »
для этого нужно вырубить страницу готовности и не забыть присвоить кнопке Далее надпись Установить
И как заставить секцию [INI] обходить атрибут "только для чтения" редактируемого файла (win7, файлы в {userdocs}) »
через код убрать у файла атрибут, внести значение, вернуть атрибут на место
короче вот всё выше описанное в виде кода-примера:

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

[Components]
Name: a; Description: a
Name: b; Description: b

[UninstallDelete]
Type: files; Name: "{userdesktop}\Half-Life 2.lnk"


[code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

function SetFileAttributes(lpFileName: String; dwFileAttributes: DWORD): BOOL; external 'SetFileAttributes{#A}@kernel32.dll stdcall';
function GetFileAttributes(lpFileName: String): DWORD; external 'GetFileAttributes{#A}@kernel32.dll stdcall';


procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpSelectComponents: WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
// создадим ярлык на рабочем столе текущего пользователя
CreateShellLink(ExpandConstant('{userdesktop}\Half-Life 2.lnk'), /// где сохранить ярлык (описание кнстант путей в справке)
ExpandConstant('Запустить...'), /// описание ярлыка (в свойствах, при наведении мыши)
ExpandConstant('{app}\common\half-life 2\hl2.exe'),
'-steam -game hl2 -appid 220', /// параметры запуска
ExpandConstant('{app}\common\half-life 2'), // рабочая папка
ExpandConstant('{app}\common\half-life 2\hl2.ico'), // путь к файлу значка (или к экзешнику)
0, // индекс иконки
SW_SHOWNORMAL); // флаг

try
if (GetFileAttributes('C:\setup\Selfish.ini') and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then // если у файла есть атрибут только чтение то
if SetFileAttributes('C:\setup\Selfish.ini', FILE_ATTRIBUTE_NORMAL) then // снимаем атрибут
if (GetFileAttributes('C:\setup\Selfish.ini') and FILE_ATTRIBUTE_NORMAL) = FILE_ATTRIBUTE_NORMAL then
// вносим значение ини
SetIniString('MySettings', /// имя секции ини
'Select_Half_Life_2', /// имя ключа
'', // значение
'C:\setup\Selfish.ini'); // путь к файлу
finally
SetFileAttributes('C:\setup\Selfish.ini', FILE_ATTRIBUTE_READONLY);
end;
end;
end;

Mailchik
24-12-2012, 15:11
удали секцию [Icons], ярлыки можно (я б сказал нужно) создать через функцию CreateShellLink, только их не будет в логе деинсталятора, а потому их нужно прибрать вручную при удалении »с чего бы нужно?
это конечно хорошо, что Вы стараетесь всё сделать через код, знаете язык и прочее, но в данном случае вы предлагаете человеку создавать велосипед.. Инно - это очень мощный инструмент именно для создания инсталляторов, поэтому и автор этого прекрасного инструмента облегчил жизнь людям, которые не сильны в языке objectpascal, создав секции, константы и тд и тп... И если вопрос решается стандартными средствами Инно, так лучше в код не лезть. Лично моё мнение.Как удалить окошко создания ярлыков (SelectProgramGroupPage) »прописать DisableProgramGroupPage=true в секции [Setup]

LinkOFF
26-12-2012, 22:00
Добрый вечер. Какое значение нужно поставить в секции Flags, чтобы на компоненте уже стоял флажок?

R.i.m.s.k.y.
26-12-2012, 22:10
LinkOFF, [Types]

Name: full; Description: Full installation; Flags: iscustom

[Components]

Name: app; Description: описаловка; Flags: disablenouninstallwarning ; Types: full

Raf-9600
28-12-2012, 12:44
Возможно ли сделать так, чтобы выбранные в инсталляторе компоненты по умолчанию подгружались из .ini файла который находиться в папке с инсталлятором?

Johny777
28-12-2012, 16:32
Raf-9600, конечно, сам так делаю :)
вот пример
создай рядом с экзешником инсталла ини файл следующего содержания

[components]
a=yes
b=
c=
d=

код-пример:

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

[Components]
Name: a; Description: a
Name: b; Description: b
Name: c; Description: c
Name: d; Description: d

[ code]
procedure InitializeWizard();
begin
if FileExists(ExpandConstant('{src}\PreSelector.ini')) then
with WizardForm.ComponentsList do
begin
Checked[Items.IndexOf('a')] := GetIniString('Components', 'a', '', ExpandConstant('{src}\PreSelector.ini')) = 'yes';
/// отмечаем компонент по индкесу
/// индекс получаем методом IndexOf('a') Items, который является TStrings;
/// остальные компонеты по аналогии
end;
end;

если ини большой, то его лучше парсить классной функцией El Sanchez-а

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

[ code]
type
TIniFile = array of record
Section: String;
Entries: TStringList;
end;

function ParseIniFile(const Filename: String): TIniFile;
var
iFile: TArrayOfString;
i: Integer;
begin
if not FileExists(Filename) then Exit;
SetArrayLength(Result, 0);
LoadStringsFromFile(Filename, iFile);
for i := 0 to GetArrayLength(iFile)-1 do
begin
//для всех непустых строк, исключая комментарии
if (iFile[i] <> '') and (Copy(iFile[i], 1, 1) <> ';') then
begin
//если строка является секцией...
if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
begin
//...пишем в результат имя секции...
SetArrayLength(Result, GetArrayLength(Result)+1);
Result[GetArrayLength(Result)-1].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
end
else
begin
//...иначе пишем пару параметр/значение
if TObject(Result[GetArrayLength(Result)-1].Entries) = nil then
Result[GetArrayLength(Result)-1].Entries := TStringList.Create;
Result[GetArrayLength(Result)-1].Entries.Append(iFile[i]);
end;
end;
end;
end;

//своя функция для чтения значений параметров из секций
function GetIniValue(const Section, Key, Default: String; iFile: TIniFile): String;
var
i, j: Integer;
begin
Result := Default;
for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
begin
for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
begin
Result := iFile[i].Entries.Values[Key];
Break;
end;
Break;
end;
end;

procedure InitializeWizard();
var
iFile: TIniFile;
i: Integer;
res: String;
begin
//парсим ini-файл
iFile := ParseIniFile('d:\Program Files (x86)\Inno Setup 5\projects\johny777\test.ini');

//пример 1 - выводим на экран содержимое ini-файла, используя созданную переменную iFile
for i := 0 to GetArrayLength(iFile)-1 do
res := res + '[' + iFile[i].Section + ']' + #13#10 + iFile[i].Entries.Text;
MsgBox(res, mbInformation, MB_OK);

//пример 2 - выводим на экран значение параметра name34 секции section2, используя созданную переменную iFile и свою функцию GetIniValue
MsgBox(GetIniValue('section2', 'name34', '', iFile), mbInformation, MB_OK);
end;

Raf-9600
28-12-2012, 17:39
Johny777, а в чем принципиальное отличие между твоим кодом и махиной от El Sanchez-а?

Johny777
28-12-2012, 18:03
Raf-9600, в скорости
смотри
функция GetIniString('Components', 'a', '', ExpandConstant('{src}\PreSelector.ini')) = 'yes'; при каждом вызове обращается к файлу PreSelector.ini на жёстком диске
если вызовов 2, то ты и глазом моргнуть не успеешь как они пройдут, но если в ини файле 4 секции и 20-30 ключей, то скорость падает - не заметно для глаза, но когда оптимизация везде по мелочам хромает, то это уже серьёзно
поэтому функция El Sanchez-а загружает весь ини файл, в динамичный массив записей, после чего оттуда с учётом особенностей ини файла как такового заполняется структура TIniFile, те 1 вызов с жёсткого диска, а все дальнейшие - чтение из оперативки, что несоизмеримо быстрее
короче вот отсюда пару странниц прочитай http://forum.oszone.net/thread-235078-92.html
с 919 поста

Raf-9600
28-12-2012, 19:20
Johny777, Благодарю за пояснение, у меня как рас более сотни компонентов %)
Остался только мелкий вопрос, как можно снять галочку из компонента в зависимости от параметров в .ini? Т.е. чтобы допустим если в ini
[Game]
Voice=false
То галочка с компонента "Озвучка" снималась.

Johny777
28-12-2012, 19:39
Raf-9600, в Voice=false нет необходимости
Checked[Items.IndexOf('a')] принмает булев значение (True, False), но мы проверяем условие (сравниваем значения)
те GetIniString(...) = 'yes' значит True
а если там нет 'yes' или стоит что-то другое или пусто то будет False, те айтем не будет отмечен, то бишь галки не будет

у меня как рас более сотни компонентов »
тогда грузи в оперативку




© OSzone.net 2001-2012