Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
Пример в справке. »
Ну совсем не помогло... я думаю надо что-то писать в секцию [Registry]
На примере предыдущего кода: »
А вот это спасибо, а вот это БОЛЬШОЕ спасибо!
Существует программа (не моя) и установщик находит к ней путь по AppId . »Не известно какой установщик используется.
используйте отличный от AppId программы идентификатор для патча. Если AppId у программы это GUID ({...}-вида) » El Sanchez, Не учитываешь один момент с реестром.
У Inno может быть вида {XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}_is1 или MyProg_is1, а у других {XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}, MyProg или вообще XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. Не известно какой установщик используется у Mat_y, тем более как он указывает что не его: (не моя) »
El Sanchez
12-10-2013, 16:51
Не известно какой установщик используется у Mat_y, тем более как он указывает что не его »
Nordek, понятно, что это Inno, ибо сие...
Если воспользоваться Unninst.exe, то все дополненные файлы удаляются как надо, но и по AppId установщик эту программу перестает находить »
...возможно только в одном случае, когда патч имеет с программой одинаковый AppId (причем этот AppId именно Inno-шный, с приставкой _isцифра), при установке перезаписывает ветку регистрации программы, а при удалении благополучно ее сносит. Поэтому повторный запуск патча программу уже не найдет.
Ну совсем не помогло... я думаю надо что-то писать в секцию [Registry] »
Mat_y, не можете придумать отличный от AppId программы AppId патча? Тогда ветку регистрации программы из реестра, секцию Setup из скрипта патча и реализацию нахождения AppId программы в студию.
Всем приветы! Надеюсь на вашу помощь, а дело в следующем: инсталлятор не правильно показывает процентаж распаковки файлов, причем скрипт абсолютно чистый (не модифицированный). Архив всего один который был сжат Freearc'ом (Наилучшее асимметричное (с быстрой распаковкой): -m9x -ld192m -s256m]/b])... Вообщем проценты доходят до 100% но распаковка все еще продолжается секунд 5-ть, в остальных же случаях, игры которые я так же паковал и использовал тот же скрипт распаковывались нормально... Пробовал как ручную расстановку процентных соотношений так и автоматическую с использованием [b]records.inf, результат тот же.. в чем может быть причина?
но и по AppId установщик эту программу перестает находить »Ну если Inno, в добавок минусом выступает то что стороннего производства, то и подстроиться под него.
Если удаление, то примерно в таком духе
#define AppName "My Program"
#define UnExe "{uninstallexe}"
[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}
AppId=TheBestAppIdEverMade
[Code]
var
DeleteB: TNewButton;
InstPath, UninsPath: string;
ResultCode: Integer;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;
procedure UninstallButton(Sender: TObject);
begin
Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;
procedure InitializeWizard;
begin
InstPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,InstallLocation|}'));
UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,UninstallString|}'));
begin
DeleteB := TNewButton.Create(WizardForm);
DeleteB.Name := 'Del_Button';
DeleteB.Parent := WizardForm;
DeleteB.Left := ScaleX(163);
DeleteB.Top := ScaleY(327);
DeleteB.Width := ScaleX(75);
DeleteB.Height := ScaleY(23);
DeleteB.Caption := 'Удалить';
DeleteB.OnClick := @UninstallButton;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1')
then
else
begin
DeleteB.Visible := false;
end;
end;
AppId программы выглядит так:
[Setup]
AppId={{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}
Этот ключ я нашел в реестре для установленной программы в секции HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1
Благодаря этому AppId мой установщик находит правильный путь к установленной программе. Но если я удаляю установленные сверху программы файлы (через Uninstall ), то удаляется и запись о программе в реестре (точнее она остается, но даже не открывается, выдавая ошибку).
Nordek, что делает эта строчка?
procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1')
then
else
begin
DeleteB.Visible := false;
end;
end;
А конкретно эта:
DeleteB.Visible := false;
Мне просто надо, чтобы деинсталлятор удалял файлы установленные, но реестр просто не трогал.
[setup]
DefaultDirName="{code:MyConst}"
[code]
function MyConst(Default: String): String;
var
ResultStr: String;
begin
RegQueryStringValue(HKLM, 'Software\...', 'Install Dir', ResultStr);
Result:=ResultStr
end;
Вопрос: Как сделать, чтобы в случае отсутствия ссылки реестра инсталлятор автоматический указывал стандартный путь установки {pf}? Если кто знает помогите пожалуйста.
А конкретно эта: »Делает кнопку удалить не активной если в системе не установлено приложение.
но реестр просто не трогал. »
Тот код выше который я тебе предоставил, он проверяет ветку реестра. А точнее InstallLocation и UninstallString, вот от них и пляши.
Могу предложить такой вариант
[Setup]
CreateUninstallRegKey=false
UninstallFilesDir={app}\Uninstall
[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}_is1; ValueType: string; ValueName: InstallLocation2; ValueData: {app}\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}_is1; ValueType: string; ValueName: UninstallString2; ValueData: """{app}\unins000.exe"""; Flags: uninsdeletevalue uninsdeletekeyifempty
т.е это для второго инсталлятора.
Тебе нужно чтоб при удалении не стиралась основная информации о инсталляции.
Значит используем во втором инсталляторе секцию [Registry] для того чтоб второй инсталлятор дописывал для кода информацию о удалении (о себе, что он там установлен).
Секцию "CreateUninstallRegKey=false" используем для того чтоб второй инсталлятор не вписывал о себе информацию и не заменял основную установку собой, для этого у второго есть секция [Registry] от куда дополняется информацией для кода InstallLocation2 и UninstallString2-ом.
"UninstallFilesDir={app}\Uninstall" служит для деинсталлятора, создаёт деинсталлятор в папке Uninstall
Таким образом, второй инсталлятор не трогает реестр т.е только дополняет. А при деинсталляции созданные им секции удаляет не затрагивая основную информацию первого.
А код, выполняет поиск. Существует ли второй компонент в системе или нет. (если что, в коде сам заменишь InstallLocation и UninstallString на InstallLocation 2 и UninstallString 2).
[Setup]
AppId={{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}
AppName=Основная программа
AppVersion=1.5
;AppVerName=Основная программа 1.5
DefaultDirName={pf}\Программа
DefaultGroupName=Программа
OutputBaseFilename=setup1
OutputDir=.
[Icons]
Name: {group}\{cm:UninstallProgram,My Program 1}; Filename: {uninstallexe}
[Setup]
AppId={{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}
AppName=Компоненты к программе
AppVersion=1.5
;AppVerName=Компоненты к программе 1.5
DefaultDirName={pf}\Программа
DefaultGroupName=Программа
OutputBaseFilename=setup1
OutputDir=.
CreateUninstallRegKey=false
UninstallFilesDir={app}\Uninstall
[Icons]
Name: {group}\{cm:UninstallProgram,My Program 2}; Filename: {uninstallexe}
[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}_is1; ValueType: string; ValueName: InstallLocation2; ValueData: {app}\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}_is1; ValueType: string; ValueName: UninstallString2; ValueData: """{app}\unins000.exe"""; Flags: uninsdeletevalue uninsdeletekeyifempty
Надеюсь понял мою идею.
Raz3r, [setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={code:MyConst}
[_code]
function MyConst(Default: String): String;
var
ResultStr: String;
begin
if RegQueryStringValue(HKLM, 'Software\...', 'Install Dir', ResultStr) then
Result:= ResultStr
else
Result:= ExpandConstant('{pf}');
end;
Как сделать, чтобы в случае отсутствия ссылки реестра инсталлятор автоматический указывал стандартный путь установки » Вот немного другой
#define AppID "{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}"
[Setup]
AppId={{#AppID}
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("#AppID")}_is1,InstallLocation|{pf}\My Program}
DefaultGroupName=My Program
OutputDir=.
nik1967, спасибо! Ты очень-очень помог!
Всем приветы! Надеюсь на вашу помощь, а дело в следующем: инсталлятор не правильно показывает процентаж распаковки файлов, причем скрипт абсолютно чистый (не модифицированный). Архив всего один который был сжат Freearc'ом ([b]Наилучшее асимметричное (с быстрой распаковкой): -m9x -ld192m -s256m]/b])... Вообщем проценты доходят до 100% но распаковка все еще продолжается секунд 5-ть, в остальных же случаях, игры которые я так же паковал и использовал тот же скрипт распаковывались нормально... Пробовал как ручную расстановку процентных соотношений так и автоматическую с использованием records.inf, результат тот же.. в чем может быть причина?
Nordek спасибо за пример 2, я пожалуй оставлю первый уже.
Не хочу показаться слишком наглым, но у меня возникло ещё несколько вопросов по инсталлеру.
1. Какой командой переименовать разбитые тома, чтобы они имели своё название, отличающиеся от установщика?
2. Как сделать чтобы инсталлер можно было запускать в режиме автоустановки, т.е когда прописываешь команду запуска в батнике setup.exe -silenced инсталлер сразу начинает установку с отображением процесса?
Ещё раз извините что так много вопросов, просто я делаю качественный репак, а скриптованием занимаюсь только второй день. Заранее большое спасибо за ответы.
Raz3r,
1. На сколько я знаю - никакой. То, что в репаках (к примеру) - это архивы (например .arc), переименованные, так, как нужно и распаковываемые с помощью спец софта - например ISDone.
2. Советую поискать информацию по "тихой" установке. Это уже неоднократно обсуждалось.
1. На сколько я знаю - никакой. То, что в репаках (к примеру) - это архивы (например .arc), переименованные, так, как нужно и распаковываемые с помощью спец софта - например ISDone.
2. Советую поискать информацию по "тихой" установке. Это уже неоднократно обсуждалось.
Спасибо за помощь ещй раз. Жаль переименовать нельзя никак(( А тему про тихую установку я уже нашел.
audiofeel
14-10-2013, 08:04
инсталлятор не правильно показывает процентаж распаковки файлов »
Нужен скрипт!!!!
Надеюсь понял мою идею. »
Идею понял... попробую.
Остался один вопрос... при таком вот исполнении, при повторном запуске инсталлятора он будет помнить список установленных компонентов?
UPD.
Поверил, все работает, дополняет реестр... только одна большая проблема...
при
CreateUninstallRegKey=no
Установщик не хочет запоминать список ранее установленных компонентов. Есть ли идеи как это обойти?
Ну и остался вопрос, можно как-то сделать, чтобы изначально поле под картинку для компонента не было пустым? »
На примере предыдущего кода:
Код:
...
procedure ComponentsListOnMouseLeave(Sender: TObject);
begin
InfoBMP.Bitmap := I_BMP[0]; // 0-ая картинка по умолчанию
end;
procedure InitializeWizard();
var
i : Integer;
begin
...
OnItemMouseMove := @ComponentsListItemMouseMove;
OnMouseLeave := @ComponentsListOnMouseLeave;
...
InfoBMP.Bitmap := I_BMP[0]; // 0-ая картинка по умолчанию
end; »
Блин... когда мышку убираю, то картинка становится на "нулевую", но когда перехожу со страницы с выбором директории на странице с компонентами, то изначально поле под картинку пустое.
UPD.
Ха, проблему решил старым добрым способом... но натолкнули на идею меня Вы. Спасибо.
if CurPageID=wpSelectComponents then
begin
InfoBMP.Show;
InfoBMP.Bitmap := I_BMP[0];
WizardForm.WizardSmallBitmapImage.Hide;
WizardForm.PageNameLabel.Hide;
end;
при повторном запуске инсталлятора он будет помнить список установленных компонентов? »
Основной инсталлятор (Основная программа) будет помнить какие установлены компоненты, задачи, тип установки, т.к прописываются в реестр:
Для компонентов
Inno Setup: Selected Components - Для отмеченных компонентов.
Inno Setup: Deselected Components - Для не отмеченных компонентов
Для задач
Inno Setup: Selected Tasks - Для отмеченных задач
Inno Setup: Deselected Tasks - Для не отмеченных задач
И Тип установки как Inno Setup: Setup Type.
Вторичный инсталлятор (Дополнительные компоненты например) имеет минус, он не будет помнить компоненты, задачи и тип установки т.к полностью не прописывает себя в реестр. При установке, прописывается только заданные значения InstallLocation2 и UninstallString2 для поиска на присутствие установленной вторичной программы через инсталлятор.
Но будет помнить какие компоненты ему нужно удалить не захватывая лишние (папки например, ярлыки, файлы) т.к прописываются они в unins000.dat.
Farser21
14-10-2013, 13:47
Всем привет такой вопрос. У меня в установщике выбор компонентов (т.е. можно ставить галочки возле того что хочешь установить), но есть небольшая проблема. Все галочки сразу выставлены и немного не удобно постоянно убирать галочки и ставить что нужно. Как сделать чтобы изначально галочки не стояли.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC