Прошу помощи по отладке скрипта.

Avengerz13, приветствую, вы собственно автор того скрипта.
Спасибо за него.))
Да нет, я решил твёрдо отдельный установщик модов (для стим-рипа) сделать , чтобы могли скачать и те, у кого уже есть игра.
Часто просят в темах, как отдельно качнуть моды.
Недавно её обновляли на сцене. была куча репаков, так что будет актуально.
Мне бы проверку прописать стоит ли игра (папка Mafia II) и если да, то путь установке указать диск:\Mafia II\pc\dlcs
 
Ученик_77, проверку можно сделать но она будет совместима только с вашим инстолятором. В случай установки от других авторов инстолятор не будет знать путь, но все еще можно будет в ручную указать. Что бы это реализовать нужно сгенерировать AppId и указать ключ в секций [Setup] UsePreviousAppDir=yes.

приветствую, вы собственно автор того скрипта.
Я только дизайн нарисовал и в данном случай это просто копия, а писал другой человек.
 
Мне бы проверку прописать стоит ли игра (папка Mafia II) и если да, то путь установке указать диск:\Mafia II\pc\dlcs
А если в таком ключе:
Код:
[Setup]
AppName = MyApp
AppVersion = 1.1.1
DefaultDirName = {code:GetInstallDir}

[code]
function GetInstallDir(const Dir: String): String;
begin
if RegQueryStringValue(HKLM, 'Mafia II', 'Install Dir', Dir) then // Dir = директория установки
  Result := RemoveBackslash(Dir) else
  Result := ExpandConstant('{pf}\Mafia II');
end;
 
Avengerz13, Сергей, спасибо вам.
Я попробую завтра (сегодня уже устал) и так и сяк.
Отпишу.
Спасибо.)
 
В случай установки от других авторов инстолятор не будет знать путь, но все еще можно будет в ручную указать.
Да можно,только я столкнулся с проблемой.
Указываю путь, но предлагается к установке диск:\Mafia II\Mafia II...
Битый час колдую.
Если указываю CreateAppDir=no, то выбор пути установки вообще пропускается интсаллятором.
А надо, чтобы напрямую в уже существующую папку Mafia II установилось.
И предложенный Сергеем вариант по нахождению существующей папки Mafia II у меня не сработал.
Возможно что-то не так я указал.
Посмотрите, плиз, как решить эту проблему.
Спасибо.
 

Вложения

Всем доброго здравия.
Тема давняя но и меня стороной не обошла.
Столкнулся с ситуацией в скрипте для вычисления из реестра пути установки приложения:
Код:
[Setup]
DefaultDirName={code:GetAppDir}

[Code]
function GetAppDir(const Path: String): String;
begin
    if RegKeyExists(HKCU, 'SOFTWARE\Pathea Games\Planet Explorers') then
    begin   
    RegQueryStringValue(HKCU, 'SOFTWARE\Pathea Games\Planet Explorers', 'Install dir', Path);
    Result := Path
    end
    else
    Result := ExpandConstant('{pf}\установите путь до игровой папки')
end;
Выяснилось, что значение 'Install dir' уникально и для каждой игры прописывается в реестре и в скрипте, по-разному.
Planet Explorers = Install dir:
Код:
[Setup]
DefaultDirName={code:GetAppDir}

[Code]
function GetAppDir(const Path: String): String;
begin
    if RegKeyExists(HKCU, 'SOFTWARE\Pathea Games\Planet Explorers') then
    begin   
    RegQueryStringValue(HKCU, 'SOFTWARE\Pathea Games\Planet Explorers', 'Install dir', Path);
    Result := Path
    end
    else
    Result := ExpandConstant('{pf}\установите путь до игровой папки')
end;
DawnOfMan = Path:
Код:
[Setup]
DefaultDirName={code:GetAppDir}

[Code]
function GetAppDir(const Path: String): String;
begin
    if RegKeyExists(HKLM, 'SOFTWARE\GOG.com\Games\1899257943') then
    begin   
    RegQueryStringValue(HKLM, 'SOFTWARE\GOG.com\Games\1899257943', 'path', Path);
    Result := Path
    end
    else
    Result := ExpandConstant('{pf}\установите путь до игровой папки')
end;
Stalker-Cs = InstallPath:
Код:
[Setup]
DefaultDirName={code:GetAppDir}

[Code]
function GetAppDir(const Path: String): String;
begin
    if RegKeyExists(HKLM, 'Software\GSC Game World\STALKER-STCS') then
    begin   
    RegQueryStringValue(HKLM, 'Software\GSC Game World\STALKER-STCS', 'InstallPath', Path);
    Result := Path
    end
    else
    Result := ExpandConstant('{pf}\установите путь до игровой папки')
end;
Этот момент нужно учитывать при применении этой функции:)
Всем удачи:bye:
 
@Den.Scaletta,
Код:
[Setup]
DefaultDirName={code:GetAppDir}

[Code]
function GetAppDir(const Path: String): String;
var
FS: String;
begin
FS:= 'Software\GSC Game World\STALKER-STCS';
if RegKeyExists(HKLM, FS) then
  begin 
   if RegValueExists(HKLM, FS, 'Install dir') then RegQueryStringValue(HKLM, FS, 'Install dir', Path);
   if RegValueExists(HKLM, FS, 'path') then RegQueryStringValue(HKLM, FS, 'path', Path);
   if RegValueExists(HKLM, FS, 'InstallPath') then RegQueryStringValue(HKLM, FS, 'InstallPath', Path);
   if Trim(Path) <> '' then Result:= RemoveQuotes(Path) else
    Result:= ExpandConstant('{pf}\установите путь до игровой папки');
  end else
  Result:= ExpandConstant('{pf}\установите путь до игровой папки');
end;

P.S. Немного доработано.
 
Последнее редактирование:
@Den.Scaletta,
Код:
[Setup]
DefaultDirName={code:GetAppDir}

[Code]
function GetAppDir(const Path: String): String;
var
FS: String;
begin
FS:= 'Software\GSC Game World\STALKER-STCS';
if RegKeyExists(HKLM, FS) then
  begin
   if RegValueExists(HKLM, FS, 'Install dir') then RegQueryStringValue(HKLM, FS, 'Install dir', Path);
   if RegValueExists(HKLM, FS, 'path') then RegQueryStringValue(HKLM, FS, 'path', Path);
   if RegValueExists(HKLM, FS, 'InstallPath') then RegQueryStringValue(HKLM, FS, 'InstallPath', Path);
   if Trim(Path) <> '' then Result:= RemoveQuotes(Path) else
    Result:= ExpandConstant('{pf}\установите путь до игровой папки');
  end else
  Result:= ExpandConstant('{pf}\установите путь до игровой папки');
end;

P.S. Немного доработано.
Andreo Fadio, здравствуйте.
Благодарю вас за это уточнение.
Пока разбирался с функцией, всё думал как же сделать перебор всех вариантов.
Но потом понял, если игра стим-лицензия и у меня такой вариант ключа, то и у другого человека будет такой же вариант ключа со стим-лицензией.
Для гог-версиии всё равно придётся делать свой установщик со своим ключом.
Хотя....;)
В любом случае - это интересное уточнение и я очень благодарен вам за это!🙏

У меня есть вопрос к вам.
Вот здесь встретил описание такой проблемы и её решения:
Код:
function GetHKLM: Integer;
begin
  if IsWin64 then
    Result := HKLM64
  else
    Result := HKLM32;
end;

function GetHKCU: Integer;
begin
  if IsWin64 then
    Result := HKCU64
  else
    Result := HKCU32;
end;

function GetAppDir(const Path: String): String;
begin
    if RegKeyExists(GetHKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 367500') then
    begin  
    RegQueryStringValue(GetHKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 367500', 'InstallLocation', Path);
    Result := Path
    end
    else
    Result := ExpandConstant('src}\')
end;
Это без перебора, который вы предоставили.
Что думаете об этом?
Это корректно или нет?:scratchhead:
Функция работает.
Но как на самом деле с вашей точки зрения?
Благодарю вас за участие!🤝
 
Но как на самом деле с вашей точки зрения?
я бы сделал так:
Код:
[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirName={code:GetAppDir}
OutputDir=.

[Code]
function GetDirApp(GetHKLM: Integer; const FS: String): String;
var
 Path: String;
begin
if RegKeyExists(GetHKLM, FS) then
  begin
   if RegValueExists(GetHKLM, FS, 'Install dir') then
    RegQueryStringValue(GetHKLM, FS, 'Install dir', Path);
   if RegValueExists(GetHKLM, FS, 'path') then
    RegQueryStringValue(GetHKLM, FS, 'path', Path);
   if RegValueExists(GetHKLM, FS, 'InstallPath') then
    RegQueryStringValue(GetHKLM, FS, 'InstallPath', Path);
   if RegValueExists(GetHKLM, FS, 'InstallLocation') then
    RegQueryStringValue(GetHKLM, FS, 'InstallLocation', Path);
   if Trim(Path) <> '' then Result:= RemoveQuotes(Path) else
    Result:= ExpandConstant('{sd}\Установите путь до игровой папки...');
  end else
  Result:= ExpandConstant('{sd}\Установите путь до игровой папки...');
end;

function GetAppDir(const Path: String): String;
var
 SF: String;
begin
 SF:= 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 367500';
 if IsWin64 then
  Result:= GetDirApp(HKLM64, SF)
 else Result:= GetDirApp(HKLM32, SF);
end;

И сделал бы на основе этого переключатель Steam\GoG\Box License
За место того, чтобы городить несколько установщиков
 
я бы сделал так:
Код:
[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirName={code:GetAppDir}
OutputDir=.

[Code]
function GetDirApp(GetHKLM: Integer; const FS: String): String;
var
Path: String;
begin
if RegKeyExists(GetHKLM, FS) then
  begin
   if RegValueExists(GetHKLM, FS, 'Install dir') then
    RegQueryStringValue(GetHKLM, FS, 'Install dir', Path);
   if RegValueExists(GetHKLM, FS, 'path') then
    RegQueryStringValue(GetHKLM, FS, 'path', Path);
   if RegValueExists(GetHKLM, FS, 'InstallPath') then
    RegQueryStringValue(GetHKLM, FS, 'InstallPath', Path);
   if RegValueExists(GetHKLM, FS, 'InstallLocation') then
    RegQueryStringValue(GetHKLM, FS, 'InstallLocation', Path);
   if Trim(Path) <> '' then Result:= RemoveQuotes(Path) else
    Result:= ExpandConstant('{sd}\Установите путь до игровой папки...');
  end else
  Result:= ExpandConstant('{sd}\Установите путь до игровой папки...');
end;

function GetAppDir(const Path: String): String;
var
SF: String;
begin
SF:= 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 367500';
if IsWin64 then
  Result:= GetDirApp(HKLM64, SF)
else Result:= GetDirApp(HKLM32, SF);
end;

И сделал бы на основе этого переключатель Steam\GoG\Box License
За место того, чтобы городить несколько установщиков
Andreo Fadio, здравствуйте!🤝
Кру-т-т-т-т-т-т-т-о!:good:
Попробую осознать этот код.:scratchhead:
Благодарю вас за участие и за дельные советы!🙏
 
если игра стим-лицензия и у меня такой вариант ключа, то и у другого человека будет такой же вариант ключа со стим-лицензией.
Для гог-версиии всё равно придётся делать свой установщик со своим ключом.
У GoG тоже самое что со Steam и собираются они на Inno Setup (также пишут параметры в реестр, но если перехватывать ветку, то она по пути HKLM32)

Пример переключатель Steam\GoG, за место того, чтобы городить несколько установщиков (с учетом предыдущего кода):
 

Вложения

Последнее редактирование:
У GoG тоже самое что со Steam и собираются они на Inno Setup (также пишут параметры в реестр, но если перехватывать ветку, то она по пути HKLM32)

Пример переключатель Steam\GoG, за место того, чтобы городить несколько установщиков (с учетом предыдущего кода):
Andreo Fadio, благодарю вас!🤝
Буду тестировать.:yes:
 
У GoG тоже самое что со Steam и собираются они на Inno Setup (также пишут параметры в реестр, но если перехватывать ветку, то она по пути HKLM32)

Пример переключатель Steam\GoG, за место того, чтобы городить несколько установщиков (с учетом предыдущего кода):
Andreo Fadio, здравствуйте.🤝

Но есть ошибка duplicate section, если встраиваю скрипт в isdone.
Дублируется вот эта секция:
Код:
Procedure CurPageChanged(CurPageID: Integer);
Begin
  if (CurPageID = wpFinished) and ISDoneError then
  begin
    LabelTime3.Hide;
    WizardForm.Caption:= ExpandConstant('{cm:Error}');
    WizardForm.FinishedLabel.Font.Color:= clRed;
    WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
  end;
end;
Код:
procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
  wpSelectDir: 
   begin
    SelectChangePathed();
   end;
  end;
end;
Как их можно объединить?:scratchhead:
 
@Den.Scaletta, это просто:
Код:
Procedure CurPageChanged(CurPageID: Integer);
Begin
  if (CurPageID = wpSelectDir) then
  begin
    SelectChangePathed();
  end;
  if (CurPageID = wpFinished) and ISDoneError then
  begin
    LabelTime3.Hide;
    WizardForm.Caption:= ExpandConstant('{cm:Error}');
    WizardForm.FinishedLabel.Font.Color:= clRed;
    WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
  end;
end;
 
@Den.Scaletta, это просто:
Код:
Procedure CurPageChanged(CurPageID: Integer);
Begin
  if (CurPageID = wpSelectDir) then
  begin
    SelectChangePathed();
  end;
  if (CurPageID = wpFinished) and ISDoneError then
  begin
    LabelTime3.Hide;
    WizardForm.Caption:= ExpandConstant('{cm:Error}');
    WizardForm.FinishedLabel.Font.Color:= clRed;
    WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
  end;
end;
Andreo Fadio, это потрясающе, всё заработало!🙃
Пришлось немного поднастроить местоположение приоритета кода в isdone, теперь всё работает.:yes:
Благодарю вас!🙏
 
Andreo Fadio, здравствуйте.

Для GOG пути в реестре решил тоже использовать нахождение через раздел Uninstall и кое с чем столкнулся.
Если в функция из вашего скрипта будет выглядеть вот так:
function GetAppDir(const Path: String): String;
begin
if
IsWin64 and (ComboVerGame.ItemIndex = 0) then
Result:= GetDirApp(HKLM64, Path)
else Result:= GetDirApp(HKLM32, Path);

end;
И применить ключи для реестра вида:
procedure SelectChangePathed();
var
S,F: String;
begin
case ComboVerGame.ItemIndex of
0: S:= '
SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 367500';
1: S:= '
SOFTWARE\GOG.com\Games\1242384383';
end;
F:= GetAppDir(S);
WizardForm.DirEdit.Text:= F;

end;
Тогда всё прекрасно отработает.
Но если ключ для GOG будет находится тоже в секции Uninstall, типа:
procedure SelectChangePathed();
var
S,F: String;
begin
case ComboVerGame.ItemIndex of
0: S:= 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 367500';
1: S:= 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\1242384383_is1';
end;
F:= GetAppDir(S);
WizardForm.DirEdit.Text:= F;
end;
Тогда при установке, в свитке для выбора Steam/GOG, раздел Steam будет прекрасно срабатывать:
Но при выборе GOG:
Определение ключа не произойдёт и будет возвращена данная строка из функции GetDirApp:
Result:= ExpandConstant('{src}\');
Попробовал разобраться сам, чтобы вас не беспокоить и выяснилось, что для корректной работы, когда оба параметра берутся из раздела uninstall, нужно добавить следующее:
function GetAppDir(const Path: String): String;
begin
if
IsWin64 and (ComboVerGame.ItemIndex = 0) then
Result:= GetDirApp(HKLM64, Path)
else Result:= GetDirApp(HKLM32, Path);

end;
function GetAppDir(const Path: String): String;
begin
if
IsWin64 and (ComboVerGame.ItemIndex = 0) or IsWin64 and (ComboVerGame.ItemIndex = 1) then
Result:= GetDirApp(HKLM64, Path)
else Result:= GetDirApp(HKLM32, Path);

end;
Теперь при установке в свитке работают оба пути реестра.:yes:
Это конечно пустяк, но я решил поделится этим наблюдением.:)
 
Последнее редактирование:
Определение ключа не произойдёт и будет возвращена данная строка из функции GetDirApp:
Result:= ExpandConstant('{src}\');
Теперь при установке в свитке работают оба пути реестра.:yes:
Это конечно пустяк, но я решил поделится этим наблюдением.
лучше уж вот так:
Код:
function GetAppDir(const Path: String): String;
var
 SR: String;
begin
 if IsWin64 then begin
  SR:= GetDirApp(HKLM64, Path);
  if (SR = ExpandConstant('{src}\')) then
   Result:= GetDirApp(HKLM32, Path) else
  Result:= SR;
 end else Result:= GetDirApp(HKLM32, Path);
end;
На системах x64, если ключа в разделе HKLM64 нет, то попробует вернуться HKLM32
 
лучше уж вот так:
Код:
function GetAppDir(const Path: String): String;
var
SR: String;
begin
if IsWin64 then begin
  SR:= GetDirApp(HKLM64, Path);
  if (SR = ExpandConstant('{src}\')) then
   Result:= GetDirApp(HKLM32, Path) else
  Result:= SR;
end else Result:= GetDirApp(HKLM32, Path);
end;
На системах x64, если ключа в разделе HKLM64 нет, то попробует вернуться HKLM32
Andreo Fadio, благодарю вас!🙏
Принял на вооружение.:)
Довольно странное наблюдение произошло.
Тот вариант, который был отредактирован мной, прекрасно отработал на моей системе с win10x64.
Однако на ноутбуке с win8.1x64, путь для GOG из реестра считан небыл и вернулось значение {src}.
Но ведь в обоих случаях была x64 система.:scratchhead:
Проверил ваш вариант, на той же системе, всё прекрасно отработало.:yes:
 
Andreo Fadio, есть ещё один момент, который хотелось бы решить.
Если вас не затруднит подскажите пожалуйста.
При запуске инсталлятора на моей системе win10Prox64 защитник виндовс прекрасно одобряет поведение инсталлятора и всех библиотек, которые помещаются в папку TEMP.
Но на системе где установлен Avast, происходит следующее:
И позволяет установку.
Есть ли возможность как-то избавить инсталлятор от такого отношения со стороны антивирусника, ведь он не реагирует так на установщик от GOG, даже в оффлайн запуске?
Чем же мой не угодил?
 
Есть ли возможность как-то избавить инсталлятор от такого отношения со стороны антивирусника, ведь он не реагирует так на установщик от GOG, даже в оффлайн запуске?
У gog имеется цифровая подпись установщика, что издатель проверенный и дает меньше подозрительности системы, а так же антивирусов:
Возможно, если каким-то чудом подпись получите :)
 
Назад
Сверху