Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [43] 44 45 46 47 48 49 50 51 52 53 54 55 56 57

serg5
14-10-2022, 19:24
спс.

Если файлов, то как то так:
Код:
[Files]
Source: "{app}\File,1.exe"; DestDir: "{app}"; DestName: "File.exe"; Check: "IsWin64"; Flags: ignoreversion
Source: "{app}\File,2.exe"; DestDir: "{app}"; DestName: "File.exe"; Check: "not IsWin64"; Flags: i »

+

В секции setup:
[Setup]
ArchitecturesInstallIn64BitMode=x64
как я понял.

Vanadiy777
15-10-2022, 00:00
В секции setup:
как я понял.»
Да, все верно.

Если этот параметр у Вас указан:
[Setup]
DefaultDirName={pf}\MyProgram
ArchitecturesInstallIn64BitMode=x64
то программа будет установлена в C:\Program Files\MyProgram
и ключ деинсталляции будет прописан в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram_is1

Если параметр не указан:
[Setup]
DefaultDirName={pf}\MyProgram
то программа будет установлена в C:\Program Files (x86)\MyProgram
и тогда ключ деинсталляции будет прописан, соответственно, в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram_is1

EdMSL
21-10-2022, 17:16
Хочу генерировать путь установки динамически, считывая путь игры из реестра. Если запись в реестре отсутствует, то выдавать предупреждение. Написал так:

procedure CurPageChanged(CurPageID: Integer);
var sd: string;
begin
if CurPageId = wpSelectDir then
sd := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}');

if sd = '{#NOT_FOUND}' then
sd := ExpandConstant('{reg:HKLM\SOFTWARE\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}')

if sd = '{#NOT_FOUND}' then begin
sd := NoSD('') + '{#MyAppName}';
MsgBox('Текст предупреждения', mbInformation, MB_OK);
end

WizardForm.DirEdit.Text := sd;
end;

Текст при этом в поле пути подставляется, все хорошо.
https://i.imgur.com/VevbtzRm.jpg (https://i.imgur.com/VevbtzR.jpeg)
Но потом он куда-то теряется, и на последнем экране запись о пути пустая.
https://i.imgur.com/fv8kes8m.jpg (https://i.imgur.com/fv8kes8.jpeg)
Более того, путь сбрасывается при переходе на следующую страницу, причем переменная {app} имеет корректный путь.
https://i.imgur.com/FMBVt9hm.jpg (https://i.imgur.com/FMBVt9h.jpeg)

Если я пропишу путь напрямую
WizardForm.DirEdit.Text := 'D:\Games\Oblivion';
и попробую его изменить в инсталяторе.
https://i.imgur.com/eWW6Lv5m.jpg (https://i.imgur.com/eWW6Lv5.jpeg)
То на выходе путь не меняется.
https://i.imgur.com/vkcYc9nm.jpg (https://i.imgur.com/vkcYc9n.jpeg)

Что я делаю не так?

Gnom_aka_Lexander
21-10-2022, 22:31
EdMSL, Если путь присваивается правильно, то вероятно поможет вызвать функцию function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
Из справки:
Если инсталлятор обнаружит функцию UpdateReadyMemo в Pascal-скрипте, она вызоается автоматически, когда активизируется страница мастера Все готово к установке.
Для отображения на странице Все готово к установке в виде строк, разделенных параметром NewLine.
Параметр Space содержит строку с пробелами. Инсталлятор использует эту строку для задания установок.
Другие параметры содержат (возможно пустые) строки, которые инсталлятор может использовать в качестве секций установок.
Например, параметр MemoDirInfo содержит строку для определения секции Выбор папки.
Тоесть, после присвоение новой папки установки, нужно вызвать
UpdateReadyMemoo(' ', 'разделитель строк', 'информация пользователя', 'папка установки', 'тип установки', 'список компонентов', 'группа в меню пуск', 'выбранные задачи');
То, что не нужно указывать, заменить пустыми кавычками : ''.

EdMSL
22-10-2022, 07:13
Если путь присваивается правильно, то вероятно поможет вызвать функцию »
Не помогло. Значение MemoDirInfo пустое.

nik1967
23-10-2022, 08:51
EdMSL, предоставь значения #NOT_FOUND и #MyAppName. А так же процедуру NoSD - искать не охота. А лучше весь скрипт выложи.

EdMSL
23-10-2022, 08:53
Код скрипта:


#define MyAppName "My Game"
#define MyAppVersion "1.0"
#define NOT_FOUND "notFound";

[Setup]
AppId={{ADF6076C-BDF7-4515-8D60-17F9DBAD5B41}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={code:NoSD}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputBaseFilename=MyGameSetup
Compression=none
SolidCompression=yes
DiskSpanning=yes
SlicesPerDisk=1
DiskSliceSize=2100000000
DiskClusterSize=4096
DisableProgramGroupPage=yes
SetupLogging=yes
DirExistsWarning=no

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked


[Files]
Source: "D:\MyGame\*"; DestDir: "{app}"; Flags: ignoreversion

[Dirs]
Name: "{app}\saves"

[Code;]
function GetLogicalDrives: DWORD; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: PAnsiChar): Cardinal; external 'GetDriveTypeA@kernel32.dll stdcall';

const
DRIVE_FIXED = 3;
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;

var ChooseVersionPage: TInputOptionWizardPage;

function NoSD(s: string): string;
var
x, bit, i: Integer;
tp: Cardinal;
sd: string;
begin
sd:= ExpandConstant('{sd}');
Result:= sd;
x:= GetLogicalDrives;
if x <> 0 then
for i:= 1 to 64 do
begin
bit:= x and 1;
if bit = 1 then
begin
tp:= GetDriveType(PAnsiChar(Chr(64 + i) + ':'));
if tp = DRIVE_FIXED then
if Chr(64 + i) <> Copy(sd, 1, 1) then
begin
Result:= Chr(64 + i) + ':';
Break;
end;
end;
x:= x shr 1;
end;
end;

function doubleSlash(Param: string): string;
var
sd: string;
i: byte;
begin
sd := Param;
i := 1;

while i < length(sd) + 1 do begin
if sd[i] = '\' then begin
insert('\', sd, i);
i := i + 2;
end
else begin
i := i + 1;
end;
end;

Result := sd;
end;

function IsStringCyrillic(Str: String): Boolean;
var
objRegExp: Variant;
begin
try
objRegExp := CreateOleObject('VBScript.RegExp');
except
ShowExceptionMessage;
end;

if objRegExp.Test(Str) then
begin
objRegExp.Pattern := '[\u0400-\u04FF,\u0500-\u052F,\u2DE0-\u2DFF,\uA640-\uA69F]';
Result := objRegExp.Execute(Str).Count = 1;
end;
end;

function IsProcessRunning(FileName: String): Boolean;
var
objSWbemLocator, objSWbemServices: Variant;
begin
try
objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
except
ShowExceptionMessage;
Exit;
end;
objSWbemServices := objSWbemLocator.ConnectServer();
objSWbemServices.Security_.ImpersonationLevel := 3;
Result := (objSWbemServices.ExecQuery('SELECT * FROM Win32_Process WHERE Name="' + FileName + '"').Count > 0);
end;

procedure closeSteam(isUninstall: boolean);
var
i: integer;
str: string;
begin
if isUninstall then
str := 'удаления'
else
str := 'установки';

MsgBox('Steam.exe запущен. Перед началом ' + str + ' процесс должен быть завершен.' #13#13 'Закройте его самостоятельно, либо процесс будет завершен принудительно.', mbInformation, MB_OK)
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Steam.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
end;

function GetSystemMetrics (nIndex: Integer): Integer; external 'GetSystemMetrics@User32.dll stdcall setuponly';

Const
SM_CXSCREEN = 0;
SM_CYSCREEN = 1;

function getScreenSize(Param: string): string;
begin
if Param = 'w' then
begin
try
Result := IntToStr(GetSystemMetrics(SM_CXSCREEN));
except
Result := '640';
end
end
else
begin
try
Result := IntToStr(GetSystemMetrics(SM_CYSCREEN));
except
Result := '480';
end
end
end;

function IsIncludeToInstall(GameType: integer): Boolean;
begin
Result := (GameType = ChooseVersionPage.SelectedValueIndex)
end;

function GetGamePathFromRegistry(): String;
begin
Result := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}');

if Result = '{#NOT_FOUND}' then
Result := ExpandConstant('{reg:HKLM\SOFTWARE\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}')
end;

procedure InitializeWizard;
begin
ChooseVersionPage := CreateInputOptionPage(wpWelcome,
'Выбор версии игры', 'Какая версия игры берется за основу?', '',
True, False);
ChooseVersionPage.Add('1С');
ChooseVersionPage.Add('Steam');
ChooseVersionPage.Add('GOG');

ChooseVersionPage.SelectedValueIndex := 0;
end;

procedure RegisterPreviousData(PreviousDataKey: Integer);
var
GameType: String;
begin
case ChooseVersionPage.SelectedValueIndex of
0: GameType := '1C';
1: GameType := 'Steam';
2: GameType := 'GOG';
end;
SetPreviousData(PreviousDataKey, 'GameType', GameType);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var installPath: string;
begin
Result := True;

if CurPageID = ChooseVersionPage.ID then begin
if (ChooseVersionPage.SelectedValueIndex = 1)
and (ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}')
and (ExpandConstant('{reg:HKLM\SOFTWARE\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}') then
Result := MsgBox('Steam.exe не найден' #13#13 'Все равно продолжить?', mbError, MB_YESNO) = idYes
end

if CurPageID = wpSelectDir then
if (IsStringCyrillic(WizardForm.DirEdit.Text)) then
begin
MsgBox('В пути установки присуствуют русские символы'+#13#10+'Пожалуйста, повторите ввод.', mbError, mb_Ok);
Result := False;
end
else begin
installPath := GetGamePathFromRegistry();
log(installPath) ;
if (installPath <> '{#NOT_FOUND}') and (installPath <> WizardDirValue) then
MsgBox('Указанный путь установки отличается от пути, приписанного для игры в реестре.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbConfirmation, mb_Ok);
end

if CurPageID = wpSelectComponents then
MsgBox('WizardDirValue: ' + WizardDirValue +#13#10+'App: ' + ExpandConstant('{app}'), mbError, mb_Ok);
end;

procedure CurPageChanged(CurPageID: Integer);
var sd: string;
//isPathFound: boolean;
begin
if CurPageId = wpSelectDir then
sd := GetGamePathFromRegistry();

if sd = '{#NOT_FOUND}' then begin
sd := NoSD('') + '\{#MyAppName}';
MsgBox('Запись об установленной игре отсутствует в реестре Windows.' #13#13 'Возможно, игра была установлена, но ее запуск не был произведен, либо игра установлена некорректно.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbInformation, MB_OK);
end

WizardForm.DirEdit.Text := sd;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssInstall) and (ChooseVersionPage.SelectedValueIndex = 1) and IsProcessRunning('Steam.exe') then
closeSteam(false)
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Value: String;
begin
log(GetPreviousData('GameType', ''));
if (CurUninstallStep = usUninstall)
and (GetPreviousData('GameType', '') = 'Steam')
and IsProcessRunning('Steam.exe') then
closeSteam(true)
end;


Директивы Files, Components и т.д. удалил, чтобы не захлмлять. К проблеме отношения все равно не имеют.

nik1967
23-10-2022, 09:24
EdMSL,

#define MyAppName "My Game"
#define MyAppVersion "1.0"
#define NOT_FOUND "notFound";

[Setup]
AppId={{ADF6076C-BDF7-4515-8D60-17F9DBAD5B41}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={code:NoSD}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputBaseFilename=MyGameSetup
Compression=none
SolidCompression=yes
DiskSpanning=yes
SlicesPerDisk=1
DiskSliceSize=2100000000
DiskClusterSize=4096
DisableProgramGroupPage=yes
SetupLogging=yes
DirExistsWarning=no

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked


[Files]
Source: "D:\MyGame\*"; DestDir: "{app}"; Flags: ignoreversion

[Dirs]
Name: "{app}\saves"

[_Code]
function GetLogicalDrives: DWORD; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: PAnsiChar): Cardinal; external 'GetDriveTypeA@kernel32.dll stdcall';

const
DRIVE_FIXED = 3;
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;

var ChooseVersionPage: TInputOptionWizardPage;

function NoSD(s: string): string;
var
x, bit, i: Integer;
tp: Cardinal;
sd: string;
begin
sd:= ExpandConstant('{sd}');
Result:= sd;
x:= GetLogicalDrives;
if x <> 0 then
for i:= 1 to 64 do
begin
bit:= x and 1;
if bit = 1 then
begin
tp:= GetDriveType(PAnsiChar(Chr(64 + i) + ':'));
if tp = DRIVE_FIXED then
if Chr(64 + i) <> Copy(sd, 1, 1) then
begin
Result:= Chr(64 + i) + ':';
Break;
end;
end;
x:= x shr 1;
end;
end;

function doubleSlash(Param: string): string;
var
sd: string;
i: byte;
begin
sd := Param;
i := 1;

while i < length(sd) + 1 do begin
if sd[i] = '\' then begin
insert('\', sd, i);
i := i + 2;
end
else begin
i := i + 1;
end;
end;

Result := sd;
end;

function IsStringCyrillic(Str: String): Boolean;
var
objRegExp: Variant;
begin
try
objRegExp := CreateOleObject('VBScript.RegExp');
except
ShowExceptionMessage;
end;

if objRegExp.Test(Str) then
begin
objRegExp.Pattern := '[\u0400-\u04FF,\u0500-\u052F,\u2DE0-\u2DFF,\uA640-\uA69F]';
Result := objRegExp.Execute(Str).Count = 1;
end;
end;

function IsProcessRunning(FileName: String): Boolean;
var
objSWbemLocator, objSWbemServices: Variant;
begin
try
objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
except
ShowExceptionMessage;
Exit;
end;
objSWbemServices := objSWbemLocator.ConnectServer();
objSWbemServices.Security_.ImpersonationLevel := 3;
Result := (objSWbemServices.ExecQuery('SELECT * FROM Win32_Process WHERE Name="' + FileName + '"').Count > 0);
end;

procedure closeSteam(isUninstall: boolean);
var
i: integer;
str: string;
begin
if isUninstall then
str := 'удаления'
else
str := 'установки';

MsgBox('Steam.exe запущен. Перед началом ' + str + ' процесс должен быть завершен.' #13#13 'Закройте его самостоятельно, либо процесс будет завершен принудительно.', mbInformation, MB_OK)
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Steam.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
end;

function GetSystemMetrics (nIndex: Integer): Integer; external 'GetSystemMetrics@User32.dll stdcall setuponly';

Const
SM_CXSCREEN = 0;
SM_CYSCREEN = 1;

function getScreenSize(Param: string): string;
begin
if Param = 'w' then
begin
try
Result := IntToStr(GetSystemMetrics(SM_CXSCREEN));
except
Result := '640';
end
end
else
begin
try
Result := IntToStr(GetSystemMetrics(SM_CYSCREEN));
except
Result := '480';
end
end
end;

function IsIncludeToInstall(GameType: integer): Boolean;
begin
Result := (GameType = ChooseVersionPage.SelectedValueIndex)
end;

function GetGamePathFromRegistry(): String;
begin
Result := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}');

if Result = '{#NOT_FOUND}' then
Result := ExpandConstant('{reg:HKLM\SOFTWARE\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}')
end;

procedure InitializeWizard;
begin
ChooseVersionPage := CreateInputOptionPage(wpWelcome,
'Выбор версии игры', 'Какая версия игры берется за основу?', '',
True, False);
ChooseVersionPage.Add('1С');
ChooseVersionPage.Add('Steam');
ChooseVersionPage.Add('GOG');

ChooseVersionPage.SelectedValueIndex := 0;
end;

procedure RegisterPreviousData(PreviousDataKey: Integer);
var
GameType: String;
begin
case ChooseVersionPage.SelectedValueIndex of
0: GameType := '1C';
1: GameType := 'Steam';
2: GameType := 'GOG';
end;
SetPreviousData(PreviousDataKey, 'GameType', GameType);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var installPath: string;
begin
Result := True;

if CurPageID = ChooseVersionPage.ID then begin
if (ChooseVersionPage.SelectedValueIndex = 1)
and (ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}')
and (ExpandConstant('{reg:HKLM\SOFTWARE\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}') then
Result := MsgBox('Steam.exe не найден' #13#13 'Все равно продолжить?', mbError, MB_YESNO) = idYes
end;

if CurPageID = wpSelectDir then
if (IsStringCyrillic(WizardForm.DirEdit.Text)) then
begin
MsgBox('В пути установки присуствуют русские символы'+#13#10+'Пожалуйста, повторите ввод.', mbError, mb_Ok);
Result := False;
end
else begin
installPath := GetGamePathFromRegistry();
log(installPath) ;
if (installPath <> '{#NOT_FOUND}') and (installPath <> WizardDirValue) then
MsgBox('Указанный путь установки отличается от пути, приписанного для игры в реестре.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbConfirmation, mb_Ok);
end;

if CurPageID = wpSelectComponents then
MsgBox('WizardDirValue: ' + WizardDirValue +#13#10+'App: ' + ExpandConstant('{app}'), mbError, mb_Ok);
end;

procedure CurPageChanged(CurPageID: Integer);
var sd: string;
//isPathFound: boolean;
begin
if CurPageId = wpSelectDir then begin
sd := GetGamePathFromRegistry();

if sd = '{#NOT_FOUND}' then begin
sd := NoSD('') + '\{#MyAppName}';
MsgBox('Запись об установленной игре отсутствует в реестре Windows.' #13#13 'Возможно, игра была установлена, но ее запуск не был произведен, либо игра установлена некорректно.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbInformation, MB_OK);
end;

WizardForm.DirEdit.Text := sd;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssInstall) and (ChooseVersionPage.SelectedValueIndex = 1) and IsProcessRunning('Steam.exe') then
closeSteam(false)
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Value: String;
begin
log(GetPreviousData('GameType', ''));
if (CurUninstallStep = usUninstall)
and (GetPreviousData('GameType', '') = 'Steam')
and IsProcessRunning('Steam.exe') then
closeSteam(true)
end;

EdMSL
23-10-2022, 09:34
nik1967, Спасибо. Тяжело без линтера жить.

Vanadiy777
27-10-2022, 00:58
Коллеги, всех приветствую от души!
Подскажите, пожалуйста, как правильно прописать синтаксис...
Надо добавить задачу в Планировщик заданий, вот так работает:
Exec(ExpandConstant('{sys}\schtasks.exe'), '/create /f /tn "Добавление задачи" /xml '+ExpandConstant('"{app}\AddTasks.xml"'), '', SW_HIDE, ewWaitUntilTerminated, i);

Но надо чтобы текстовое значение "Добавление задачи" бралось из CustomMessages...

За ранее благодарен за помощь.

El Sanchez
27-10-2022, 12:54
Но надо чтобы текстовое значение "Добавление задачи" бралось из CustomMessages... »
Vanadiy777,
Exec(ExpandConstant('{sys}\schtasks.exe'), Format('/create /f /tn "%s" /xml "%s"', [CustomMessage('foo'), ExpandConstant('{app}\AddTasks.xml')]), '', SW_HIDE, ewWaitUntilTerminated, i);

Vanadiy777
27-10-2022, 14:56
nik1967, El Sanchez,
Огромное сердечное вам спасибо!

Оба варианта работают.

Vanadiy777
29-10-2022, 21:02
Не могу сам разобраться, а примеров не нашел...
Нужно считать из реестра путь установленной программы.
Проблема заключается в том, что название программы - постоянное, а вот версия может быть разная.

Подскажите пожалуйста на примере Opera или Mozilla Firefox, в ней вообще посложнее будет...

[_Code]
function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKCU, Software\Microsoft\Windows\CurrentVersion\Uninstall\Opera 91.0.4516.77', 'InstallLocation', Path);
Result := Path;
end;


[_Code]
function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKLM, Software\Microsoft\Windows\CurrentVersion\Uninstall\Mozilla Firefox 99.0.1 (x64 ru)', 'InstallLocation', Path);
Result := Path;
end;


[_Code]
function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKLM, Software\Microsoft\Windows\CurrentVersion\Uninstall\Mozilla Firefox 106.0.2 (x86 ru)', 'InstallLocation', Path);
Result := Path;
end;


То, что написано красным, меняется в зависимости от установленной версии.

Как правильно прописать функцию, чтобы считывалось только название программы, а остальные данные (которые красным) игнорировались?
Или, возможно, есть другой способ как-то получить директорию установки программы?
Помогите, пожалуйста (ткните носом), если это вообще реализуемо средствами Inno...

Заранее благодарен за помощь.

EdMSL
30-10-2022, 14:07
Как сделать так, чтобы при определенном условии отменить установку?
Допустим, не проходим по системным требованиям. Есть экран проверки. И вот на нем при нажатии "Далее" выдавать сообщение и сразу на последний экран. Или экран с ошибкой может какой есть? В общем, надо правильно прервать установку. Я пробовал Abort, но возникает ошибка и установщик зависает.

EdMSL
30-10-2022, 15:15
Решил проблему так:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;

if CurPageId = wpWelcome then begin
if IsWin64() then begin
MsgBox('Ваш ПК не соответствует минимальным требованиям. Установка невозможна.', mbInformation, MB_OK);
IsCanInstall := false;
end
end
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if not IsCanInstall then begin
case (PageID) of
ChooseVersionPage.ID: Result := True
wpSelectDir: Result := True
wpSelectComponents: Result := True
wpSelectTasks: Result := True
wpReady: Result := True
end
end
else
Result := False;
end;

function PrepareToInstall(var NeedsRestart: Boolean): String;
begin
if not IsCanInstall then
Result := 'Ваша ПК не соответствует минимальным требованиям.'
else
Result := '';
end;

Т.е. не проходим по условию, то пропускаем все страницы, а на шаге готовности к установке выдаем Result с текстом ошибки.
Не уверен, что способ правильный, но в моем случае рабочий.

Vanadiy777
30-10-2022, 15:40
Не уверен, что способ правильный, но в моем случае рабочий. »
EdMSL,
главное - результат! :wink:

Vanadiy777
30-10-2022, 19:28
nik1967,
Спасибо Вам огромное!
Если установлена Mozilla Firefox x64, то все отрабатывает отлично.
Если Mozilla Firefox x86 - то путь не видит.

Буду экспериментировать... По результатам отпишусь...

EdMSL
30-10-2022, 19:58
Нужно получить данные о системе. В шапке есть скрипт, но выглядит он громоздко. Может есть какой-то более современный способ?
Я пробовал этим способом https://stackoverflow.com/questions/40762683/is-there-a-way-to-read-the-systems-information-in-inno-setup
Но видеопамять определяется неверно, хотя если делать это все через wmic напрямую, то данные выдает верные.
Пишу так:

Query := 'SELECT AdapterRAM FROM Win32_VideoController';
VideoSystem := WbemQuery(WbemServices, Query);
if not VarIsNull(VideoSystem) then
begin
log(VideoSystem.AdapterRam);
vram := VideoSystem.AdapterRAM;
end;

на выходе получаю -1048576

Vanadiy777
30-10-2022, 20:51
измени куст реестра с HKLM64 на HKLM, и возможно »


nik1967, да, эти варианты тоже уже пробовал - тогда х64 не работает, а х86 работает.

Vanadiy777
31-10-2022, 01:07
nik1967,
в общем, попробовал все возможные варианты...
Поиск идет конкретно по тем параметрам, которые указаны в #define.
Если указано HKLM64 и SOFTWARE\Microsoft\, то ищет путь для х64,
если HKLM и SOFTWARE\WOW6432Node\Microsoft\, то, соответственно, для х86.

Попытался добавить дополнительные значения в #define, естественно, с другими именами, и продублировать
процедуру поиска, чтобы искал сразу по двум ключам, но, покуда я не в зуб ногой, естественно, ни фига путного не получилось...

Т.е. надо как то организовать поиск одновременно по ключам "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
и "SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall", а затем уже как то это вывести в Result:= Path;

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

С уважением, и заранее благодарю за помощь.




© OSzone.net 2001-2012