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

Ученик_77

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

Avengerz13

Участник
Ученик_77, проверку можно сделать но она будет совместима только с вашим инстолятором. В случай установки от других авторов инстолятор не будет знать путь, но все еще можно будет в ручную указать. Что бы это реализовать нужно сгенерировать AppId и указать ключ в секций [Setup] UsePreviousAppDir=yes.

приветствую, вы собственно автор того скрипта.
Я только дизайн нарисовал и в данном случай это просто копия, а писал другой человек.
 

SBalykov

Старожил
Мне бы проверку прописать стоит ли игра (папка 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;
 

Ученик_77

Участник
Avengerz13, Сергей, спасибо вам.
Я попробую завтра (сегодня уже устал) и так и сяк.
Отпишу.
Спасибо.)
 

Ученик_77

Участник
В случай установки от других авторов инстолятор не будет знать путь, но все еще можно будет в ручную указать.
Да можно,только я столкнулся с проблемой.
Указываю путь, но предлагается к установке диск:\Mafia II\Mafia II...
Битый час колдую.
Если указываю CreateAppDir=no, то выбор пути установки вообще пропускается интсаллятором.
А надо, чтобы напрямую в уже существующую папку Mafia II установилось.
И предложенный Сергеем вариант по нахождению существующей папки Mafia II у меня не сработал.
Возможно что-то не так я указал.
Посмотрите, плиз, как решить эту проблему.
Спасибо.
 

Вложения

Den.Scaletta

Новичок
Всем доброго здравия.
Тема давняя но и меня стороной не обошла.
Столкнулся с ситуацией в скрипте для вычисления из реестра пути установки приложения:
Код:
[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:
 

Andreo Fadio

Старожил
@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

Новичок
@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:
Функция работает.
Но как на самом деле с вашей точки зрения?
Благодарю вас за участие!🤝
 

Andreo Fadio

Старожил
Но как на самом деле с вашей точки зрения?
я бы сделал так:
Код:
[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
За место того, чтобы городить несколько установщиков
 

Den.Scaletta

Новичок
я бы сделал так:
Код:
[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:
Благодарю вас за участие и за дельные советы!🙏
 

Andreo Fadio

Старожил
если игра стим-лицензия и у меня такой вариант ключа, то и у другого человека будет такой же вариант ключа со стим-лицензией.
Для гог-версиии всё равно придётся делать свой установщик со своим ключом.
У GoG тоже самое что со Steam и собираются они на Inno Setup (также пишут параметры в реестр, но если перехватывать ветку, то она по пути HKLM32)

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

Вложения

Последнее редактирование:

Den.Scaletta

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

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

Den.Scaletta

Новичок
У 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:
 

Andreo Fadio

Старожил
@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

Новичок
@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:
Благодарю вас!🙏
 

Den.Scaletta

Новичок
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:
Это конечно пустяк, но я решил поделится этим наблюдением.:)
 
Последнее редактирование:

Andreo Fadio

Старожил
Определение ключа не произойдёт и будет возвращена данная строка из функции 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
 

Den.Scaletta

Новичок
лучше уж вот так:
Код:
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:
 

Den.Scaletta

Новичок
Andreo Fadio, есть ещё один момент, который хотелось бы решить.
Если вас не затруднит подскажите пожалуйста.
При запуске инсталлятора на моей системе win10Prox64 защитник виндовс прекрасно одобряет поведение инсталлятора и всех библиотек, которые помещаются в папку TEMP.
Но на системе где установлен Avast, происходит следующее:
И позволяет установку.
Есть ли возможность как-то избавить инсталлятор от такого отношения со стороны антивирусника, ведь он не реагирует так на установщик от GOG, даже в оффлайн запуске?
Чем же мой не угодил?
 

Andreo Fadio

Старожил
Есть ли возможность как-то избавить инсталлятор от такого отношения со стороны антивирусника, ведь он не реагирует так на установщик от GOG, даже в оффлайн запуске?
У gog имеется цифровая подпись установщика, что издатель проверенный и дает меньше подозрительности системы, а так же антивирусов:
Возможно, если каким-то чудом подпись получите :)
 
Сверху