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

LagunaFAN
17-10-2012, 23:27
Вы уже всё распланировали (что будет два установщика (один из которых будет искать Steam + путь установки)). И всё же говорите примерно...
Ну значит, примерно, как-то так: »
Примерно я говорю потому, что какого-то конкретного сейчас сейчас нет. Но в скором времени это мне понадобится :angel: :blush:

Спасибо! Как сделать так, чтобы при наличии установленного стима игра устанавливалась в папку стима понятно. Но мне хотелось, чтобы даже при наличии установленного стима был выбор между обычной установкой и установкой стим. Может можно сделать какие чекбоксы на отдельной странице перед DirPage, чтобы в соответствии с чекбоксом прописывался путь либо "path1", либо "path2"?

Прошу прощения, что возможно много вопросов задаю. Просто я действительно не шарю в паскале :blush: :blush:

Mailchik
18-10-2012, 00:28
LagunaFAN, #define GameName "My Application"
[Setup]
AppName={#GameName}
AppVersion=1.5
DefaultDirName={pf}\{#GameName}

[Code]
var
SteamCheckBox : TNewCheckBox;

procedure InitializeWizard;
begin
SteamCheckBox := TNewCheckBox.Create(WizardForm);
with SteamCheckBox do begin
Parent := WizardForm.WelcomePage;
SetBounds(ScaleX(170), ScaleY(250), ScaleX(200), ScaleY(20));
Caption := 'Steam-установка';
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID = wpSelectDir) and (SteamCheckBox.Checked) then begin
if RegKeyExists(HKLM, 'Software\Valve\Steam') then
WizardForm.DirEdit.Text := ExpandConstant('{reg:HKLM\Software\Valve\Steam, InstallPath}\steamapps\common\{#GameName}')
else MsgBox('Steam не установлен', mbInformation, MB_OK);
end else begin
WizardForm.DirEdit.Text := ExpandConstant('{pf}\{#GameName}');
end;
end;

apozlevich
18-10-2012, 13:03
Добрый день. Помогите:
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}}\Shell\Open CCleaner..."; Tasks: open; Languages: en; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}}\Shell\Open CCleaner...\command"; ValueName: ""; ValueType: string; ValueData: "{app}\CCleaner.exe"; Tasks: open; Languages: en
Не делает совсем ничего. Думаю, глупая опечатка, но в упор ее не вижу.

Gnom_aka_Lexander
18-10-2012, 17:52
apozlevich, в каком смысле не делает? если эти ключи не пишутся в реестр, то нужно проверить соблюдение всех условий.
Tasks: open; Languages: en »
будет добавлено, если выполнены одновременно оба условия - выбрана задача open и выбран язык инсталлятора en в начале установки ( если выбор языка отсутствует вообще, то условие скорей всего будет считаться невыполненым, утверждать не могу, не видя скрипта)

apozlevich
18-10-2012, 18:00
будет добавлено, если выполнены одновременно оба условия - выбрана задача open и выбран язык инсталлятора en в начале установки ( если выбор языка отсутствует вообще, то условие скорей всего будет считаться невыполненым, утверждать не могу, не видя скрипта) »
Оба условия соблюдены.

Gnom_aka_Lexander
18-10-2012, 18:12
не видя скрипта »
нужно посмотреть скрипт полностью.

El Sanchez
18-10-2012, 21:28
Не делает совсем ничего. Думаю, глупая опечатка, но в упор ее не вижу. »
apozlevich, и не будет работать из-за:
1. GUID, дабы компилятор не посчитал его константой, экранируется только открывающей фигурной скобкой, нужно убрать лишнюю - {{645FF040-5081-101B-9F08-00AA002F954E}}.
2. Толку от этих записей на x64-системах будет никакого, т.к. запишутся в 32-разрядный куст реестра - в контекстном меню корзины ничего не увидите. Нужна проверка разрядности системы, в зависимости от результата писать в нужные кусты.
P.S. Раз делаете мультиязычный установщик, в данном случае от флага Languages можно отказаться. В общем, я бы сделал так:

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl
Name: en; MessagesFile: compiler:default.isl

[CustomMessages]
ru.ContextMenu=Открыть CCleaner...
en.ContextMenu=Open CCleaner...

[Registry]
;32-bit
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}\shell\{cm:ContextMenu}"; Tasks: open; Flags: uninsdeletekey; Check: not IsWin64
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}\shell\{cm:ContextMenu}\command"; ValueType: string; ValueData: "{app}\CCleaner.exe"; Tasks: open; Flags: uninsdeletekey; Check: not IsWin64
;64-bit
Root: HKLM64; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}\shell\{cm:ContextMenu}"; Tasks: open; Flags: uninsdeletekey; Check: IsWin64
Root: HKLM64; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}\shell\{cm:ContextMenu}\command"; ValueType: string; ValueData: "{app}\CCleaner.exe"; Tasks: open; Flags: uninsdeletekey; Check: IsWin64

apozlevich
18-10-2012, 21:34
El Sanchez, спасибо, но я забыл отметить, что мне уже все объяснил Gnom_aka_Lexander, за что ему большое спасибо.

P.S. Раз делаете мультиязычный установщик, в данном случае от флага Languages можно отказаться. В общем, я бы сделал так: »
А это хорошая идея!

Tco 03
18-10-2012, 23:51
Подскажите пожалуйста, как скопировать папку целиком (со всеми вложенными в неё файлами) через секцию [Code]?

Johny777
19-10-2012, 01:05
Tco 03, лови :)

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

[code]
procedure CopyFolder(SourceFolder, DestFolder: String);
var
oFS: Variant;
begin
try
if not DirExists(SourceFolder) then Exit;
if not DirExists(DestFolder) then if not CreateDir(DestFolder) then Exit;
oFS := CreateOleObject('Scripting.FileSystemObject');
oFS.CopyFolder(RemoveBackslash(SourceFolder), DestFolder);
except
//ShowExceptionMessage;
end;
end;


procedure InitializeWizard();
begin
CopyFolder('C:\setup', 'C:\Intel\setup');
end;

ToBeLife
19-10-2012, 21:52
Доброго времени суток.
Подскажите код
что бы перед началом установки инсталятор удалил определённый файл и только потом начинал установку программы.
и второе, если выбрать определённый компонент, скажем патч в инсталяторе, что бы установился в начале он и только потом все остальные файлы.

R.i.m.s.k.y.
19-10-2012, 22:09
что бы перед началом установки инсталятор удалил определённый файл и только потом начинал установку программы »
[CODE]
procedure RD(Dir:string);
begin
Exec('cmd.exe', ' /c rd /S /Q ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure RF(file:string);
begin
Exec('cmd.exe', ' /c del /F /Q ' + '"'+file+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

Function InitializeSetup: Boolean;
var file2delete : string;
Begin
file2delete := твой файл;
RF(file2delete);
if (not FileExists(file2delete)) then Result := true else Result := False;
end;


второе, если выбрать определённый компонент, скажем патч в инсталяторе, что бы установился в начале он и только потом все остальные файлы. »
Читай в справке Installation Order.
Установщик выполняет скрипт сверху вниз, так что как вариант в секции Files просто нужно поставить файлы "твоего компонента" первыми.

ToBeLife
19-10-2012, 22:14
R.i.m.s.k.y.,
Благодарствую, и как всегда спасибо.

R.i.m.s.k.y.
19-10-2012, 22:14
El Sanchez,
расскажи пожалуйста, поподробнее про ключи реестра в 64-х битных системах
К примеру три ключа
- HKLM\SOFTWARE\Wow6432Node
- HKLM64\SOFTWARE\
- HKLM\SOFTWARE\
к каким разрядностям относятся? не являются первый и третий ключи синонимами и если нет - в каких случаях юзается первый и последний?

ToBeLife
19-10-2012, 22:55
R.i.m.s.k.y.,
простите благодушно, по поводу кода, у меня inno ругается на неизвестный идентификатор res
Exec('cmd.exe', ' /c rd /S /Q ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
подскажите пожалуйста

R.i.m.s.k.y.
19-10-2012, 23:09
ToBeLife,
[CODE]
var res : integer;

procedure RD(Dir:string);
begin
Exec('cmd.exe', ' /c rd /S /Q ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure RF(file:string);
begin
Exec('cmd.exe', ' /c del /F /Q ' + '"'+file+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

Function InitializeSetup: Boolean;
var file2delete : string;
Begin
file2delete := твой файл;
RF(file2delete);
if (not FileExists(file2delete)) then Result := true else Result := False;
end;

ToBeLife
19-10-2012, 23:13
простите, это я невнимателен, ещё раз спасибо

R.i.m.s.k.y.
20-10-2012, 06:03
ToBeLife, та ни, это я строчку var res : integer; забыл

ToBeLife
20-10-2012, 13:03
R.i.m.s.k.y.,
а в каком формате писать, просто имя с расширением или в кавычки брать?

Begin
file2delete := твой файл;
RF(file2delete);
if (not FileExists(file2delete)) then Result := true else Result := False;
end; »

потому как нужный файл не удаляется.

Johny777
20-10-2012, 13:24
R.i.m.s.k.y., ToBeLife,
можно ж проще :)
просто удаление:

function InitializeSetup(): Boolean;
begin
Result := not FileExists(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));
if not Result then Result := DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));
end;


если у файла есть атрибут "только чтение":

function GetFileAttributes(lpFileName: string): integer;external 'GetFileAttributesA@kernel32.dll stdcall';
function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;external 'SetFileAttributesA@kernel32.dll stdcall';

function InitializeSetup(): Boolean;
begin
Result := not FileExists(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));
if not Result then
begin
if (GetFileAttributes(ExpandConstant('{userdesktop}\Half-Life 2.lnk')) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then SetFileAttributes(ExpandConstant('{userdesktop}\Half-Life 2.lnk'), FILE_ATTRIBUTE_NORMAL);
Result := DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));
end;
end;




© OSzone.net 2001-2012