Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
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 можно отказаться. В общем, я бы сделал так: »
А это хорошая идея!
Подскажите пожалуйста, как скопировать папку целиком (со всеми вложенными в неё файлами) через секцию [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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.