Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
Антон_Мураткин@vk
#define AppName "Crysis"
#define AppVersion "1.0"
#define MainExe "{app}\Bin32\crysis.exe"
#define MainExe64 "{app}\Bin64\crysis.exe"
#define MainExeDir Copy(MainExe, 1, RPos("\", MainExe)-1)
#define MainExe64Dir Copy(MainExe64, 1, RPos("\", MainExe64)-1)
[Setup]
AppName={#AppName}
AppVersion={#AppVersion}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}";
[Icons]
Name: "{group}\{#AppName}"; FileName: "{#MainExe64}"; WorkingDir: "{#MainExe64Dir}"; Check: IsWin64
Name: "{group}\{#AppName}"; FileName: "{#MainExe}"; WorkingDir: "{#MainExeDir}"; Check: not IsWin64
Name: "{userdesktop}\{#AppName}"; FileName: "{#MainExe64}"; WorkingDir: "{#MainExe64Dir}"; Tasks: desktopicon; Check: IsWin64
Name: "{userdesktop}\{#AppName}"; FileName: "{#MainExe}"; WorkingDir: "{#MainExeDir}"; Tasks: desktopicon; Check: not IsWin64
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"
Антон_Мураткин@vk
22-09-2013, 12:48
vint56, #define AppName "Crysis"
#define AppVersion "1.0"
#define MainExe "{app}\Bin32\crysis.exe"
#define MainExe64 "{app}\Bin64\crysis.exe"
#define MainExeDir Copy(MainExe, 1, RPos("\", MainExe)-1)
#define MainExe64Dir Copy(MainExe64, 1, RPos("\", MainExe64)-1) Вот это поставить перед [Setup] и изменить на моё название игры так же и путь до ехе файла
Name: "{group}\{#AppName}"; FileName: "{#MainExe64}"; WorkingDir: "{#MainExe64Dir}"; Check: IsWin64
Name: "{group}\{#AppName}"; FileName: "{#MainExe}"; WorkingDir: "{#MainExeDir}"; Check: not IsWin64
Name: "{userdesktop}\{#AppName}"; FileName: "{#MainExe64}"; WorkingDir: "{#MainExe64Dir}"; Tasks: desktopicon; Check: IsWin64
Name: "{userdesktop}\{#AppName}"; FileName: "{#MainExe}"; WorkingDir: "{#MainExeDir}"; Tasks: desktopicon; Check: not IsWin64
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}
А здесь надо что нибудь менять на своё? Вроде не надо!!!
Антон_Мураткин@vk, Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"
Антон_Мураткин@vk
22-09-2013, 14:56
Nordek, Да вы не поняли, эта строчка у меня есть. Но только когда уже установишь програму и хочешь её удалить она выдаёт всякие ошибки
Farser21
22-09-2013, 18:09
vint56, Спасибо добрый человек)
Приветствую!
Есть вопрос: можно ли в инно на момент установки приложения узнать, в какой из папок ({userprograms} или {commonprograms} ) будет создаваться папка с ярлыком? Ну т е, я так понимаю, что выбор инсталлятором папки зависит от прав пользователя. Можно этот момент (права пользователя на определенную папку) как-то отследить?
Ну т е, я так понимаю, что выбор инсталлятором папки зависит от прав пользователя »
Выбор папки зависит от того, где вы указали инсталятору создавать ярлык в секции Icons:
{userprograms} - текущий пользователь.
{commonprograms} - все пользователи.
saurn, а если имя папки не указано, то что будет использоваться по умолчанию? И это "по умолчанию" всегда одинаковое или зависит от каких-то настроек?
а если имя папки не указано, то что будет использоваться по умолчанию? И это "по умолчанию" всегда одинаковое или зависит от каких-то настроек? »
Имя папки не может быть не указано. Константы играют ключевую роль в скрипте. Именно на основе констант создаются пути к тем или иным папкам: {app}, {group} и т.д. Если пользователь имеет права администратора, то константа common будет аналогична константе user.
Извините, я немного не догоняю, видимо (
Имя папки не может быть не указано »
В моем скрипте
[Icons]
Name: "{group}\{#MyAppExeName}"; Filename: "{app}\{#MyAppExeName}"
Здесь {group} - это же вроде имя папки, которая будет создана в "Пуск"-> "Программы". А в каких именно программах (общих или конкретного пользователя) здесь не указано, т е не очень понятно, для папки {group} какая папка при таком задании ярлыка будет родительской {userprograms} или {commonprograms}.
И вопрос, собственно, в том, можно ли программно определить эту самую папку, ну или есть ли у пользователя права администратора.
Если пользователь имеет права администратора, то константа common будет аналогична константе user.
Может, все-таки наоборот - если прав нет, то common будет аналогична user?
Антон_Мураткин@vk
25-09-2013, 12:42
Люди добрые, подскажите скрипта для распаковки FreeArc'ом? Самый простой без наворотов, чтобы просто распаковал во время установки. Заранее благодарю
Здесь {group} - это же вроде имя папки »Это не имя папки, это путь/назначение.
В Inno это есть так называемая переменная как в Windows.
Например в Windows переменная %TEMP% в Inno это будет {tmp}.
А в каких именно программах (общих или конкретного пользователя) здесь не указано »
Обычно в общих "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\".
Люди добрые, подскажите скрипта для распаковки FreeArc'ом? »Смотри здесь (http://forum.ru-board.com/topic.cgi?forum=5&topic=34920&start=620).
Здесь {group} - это же вроде имя папки »
{group} - это в будущем, скажем так, имя папки. Первоначально - это константа, переменная пути. На основе нее инсталятор создает папку с именем, указанным в секции Setup.
какая папка при таком задании ярлыка будет родительской {userprograms} или {commonprograms} »
{commonprograms}
Может, все-таки наоборот - если прав нет, то common будет аналогична user? »
Нет.
P.S.
Все константы подробно описаны в справке.
El Sanchez
25-09-2013, 20:58
{group} - это в будущем, скажем так, имя папки. »
Здесь {group} - это же вроде имя папки, которая будет создана в "Пуск"-> "Программы". »
saurn, Shkutu, {group} - это полный путь будущей программной группы, общей или персональной - это уже зависит от привилегий установщика, установленных директивой PrivilegesRequired (по умолчанию admin). Установщик с привилегиями admin/poweruser будет автоматом создавать ярлыки в общей программной группе (All Users/ProgramData), lowest - в персональной (профиле пользователя). Также для установщика с админскими привилегиями можно указать создавать ярлыки не в общей группе, а в персональной, для этого предусмотрена директива AlwaysUsePersonalGroup.
{commonprograms}
Цитата Shkutu:
Может, все-таки наоборот - если прав нет, то common будет аналогична user? »
Нет. »
saurn, вообще-то, да.
Например в Windows переменная %TEMP% в Inno это будет {tmp}. »
Nordek, вообще-то, нет.
lowest - в персональной (профиле пользователя). »Смысла не понимаю использования lowest.
Есть некоторые программы которые установленные установщиком Inno. Запуская простым кликом, запускаются без запроса UAC. Но здесь есть одно "Но", порой выбивают ошибку, и всё потому, что не могут прочитать конфигурационный файл находящийся в программной папке. С одной стороны да, то что даже если запроса от UAC не было, и если выбивает ошибку, то их нужно запускать из под администратора. Но с другой стороны, многие думают что нужно давать инсталлятору какие-то привилегии, на самом деле как оказалось административные права не нужны чтобы запустить программу без ошибки.
P.S Данную проблему почти решил и знаю почему это происходит, но пока ещё не реализовал для инсталлятора.
El Sanchez
26-09-2013, 13:12
Смысла не понимаю использования lowest. »
Nordek, поясняю привилегии установщика:
admin - однопользовательская установка; установщик имеет права пользователя из группы Администраторов в системе; установленная программа находится в системной папке Program Files, которой пользуются все; удаление программы только пользователем из группы Администраторов.
poweruser - однопользовательская установка; установщик имеет права не ниже прав пользователя из группы Опытные пользователи в системе; установленная программа находится в системной папке Program Files, которой пользуются все; удаление программы только пользователем минимум из группы Опытные пользователи.
lowest - многопользовательская установка; установщик имеет права пользователя из группы Пользователи в системе (пользователь из группы Администраторы, запустивший установщик, приравнивается к пользователю из группы Пользователи); установленная программа находится в профиле пользователя, запустившего установку (обычно в %APPDATA%); удаление индивидуально для каждого пользователя (кроме админа, тому все можно грохать).
none - однопользовательская/многопользовательская установка; установщик имеет права пользователя, запустившего установку, поэтому логика скрипта должна это учитывать; установленная программа находится в Program Files/профиле в зависимости от пользователя, запустившего установку; удаление аналогично.
Поясню почему: »
Nordek, тут либо ошибка сборщика, допустившего расположение конфигурационного файла в месте, недоступном простому обывателю, либо ошибка разработчика программы, не сумевшего заставить свое приложение читать свой же конфигурационный файл.
Johny777
26-09-2013, 13:13
El Sanchez,
Например в Windows переменная %TEMP% в Inno это будет {tmp}. »
Nordek, вообще-то, нет. »
как же?
мне пришлось вплотную с этим столкнуться, те мне нужны пути для инсталла
и темп в первую очередь
пути к папкам я получаю таким макаром (код Delphi):
function GetSpecialFolderPath(const csidl: Integer): String;
var
Buff: array[ 0..MAX_PATH] of Char;
begin
if SHGetSpecialFolderPath(0, Buff, csidl, False) then Result := Buff;
end;
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762204%28v=vs.85%29.aspx
из констант
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762494%28v=vs.85%29.aspx
мне нужны только
CSIDL_DESKTOP
CSIDL_COMMON_DESKTOPDIRECTORY
CSIDL_COMMON_DOCUMENTS
CSIDL_PROGRAM_FILES
CSIDL_PROGRAMS
CSIDL_DESKTOPDIRECTORY
CSIDL_MYDOCUMENTS
CSIDL_PROGRAM_FILESX86
===================
а путь к папке Temp только одним способом. Другого не знаю (код Delphi):
function GetTemp(): String;
var
Buff: array [0..MAX_PATH] of Char;
begin
if GetTempPath(Length(Buff), Buff) > 0 then Result := Buff;
end;
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364992%28v=vs.85%29.aspx
и этот путь тот же самый, в котором инно создаёт временную папку и именно этот темп откроется если вбить %TEMP% в "Выполнить"
исходники инно по этому поводу я не смотрел, но уверен что пути которыми она заменят константы в строке она берёт именно при помощи вышеупомянутых функций
В общем хотелось бы понять, чтоб потом у меня весь инсалл не рухнул при запуске не из под Админа,
Gnom_aka_Lexander
26-09-2013, 13:37
как же? »
Просто. Константа {tmp} это путь к временной папке инсталлятора. А системная переменная %TEMP% это временная папка системы. собственно {tmp} - это подпапка внутри %TEMP%. И я совершенно не понимаю, при чем тут Delphi. К инно она относится только тем боком, что данный инструмент скомпилен на Delphi и имеет тот-же язык для секции [Code].
P.S. даже не тот-же, а несколько отличающийся. объектная структура классов построена чуток по другому, чем в дельфи.
El Sanchez
26-09-2013, 14:43
а путь к папке Temp только одним способом. Другого не знаю (код Delphi): »
Johny777, выбирай:
GetTempDir
GetEnv('TEMP')
ExtractFileDir(ExpandConstant('{tmp}'))
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC