|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9] |
|
|
Скрипты Inno Setup. Помощь и советы [часть 9]
|
|
Ветеран Сообщения: 1274 |
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z |
|
|
Отправлено: 16:09, 04-04-2018 |
|
Забанен Сообщения: 34
|
спс.
Цитата Vanadiy777:
В секции setup: как я понял. |
|
|
Последний раз редактировалось serg5, 21-10-2022 в 18:49. Отправлено: 19:24, 14-10-2022 | #841 |
|
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать Цитата serg5:
Если этот параметр у Вас указан: то программа будет установлена в C:\Program Files\MyProgram и ключ деинсталляции будет прописан в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram_is1 Если параметр не указан: то программа будет установлена в C:\Program Files (x86)\MyProgram и тогда ключ деинсталляции будет прописан, соответственно, в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram_is1 |
|
|
------- Отправлено: 00:00, 15-10-2022 | #842 |
|
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Хочу генерировать путь установки динамически, считывая путь игры из реестра. Если запись в реестре отсутствует, то выдавать предупреждение. Написал так:
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;
Но потом он куда-то теряется, и на последнем экране запись о пути пустая. Более того, путь сбрасывается при переходе на следующую страницу, причем переменная {app} имеет корректный путь. Если я пропишу путь напрямую и попробую его изменить в инсталяторе. То на выходе путь не меняется. Что я делаю не так? |
|
Последний раз редактировалось EdMSL, 21-10-2022 в 17:31. Отправлено: 17:16, 21-10-2022 | #843 |
|
Ветеран Сообщения: 978
|
Профиль | Сайт | Отправить PM | Цитировать EdMSL, Если путь присваивается правильно, то вероятно поможет вызвать функцию
UpdateReadyMemo
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; Если инсталлятор обнаружит функцию UpdateReadyMemo в Pascal-скрипте, она вызоается автоматически, когда активизируется страница мастера Все готово к установке. Для отображения на странице Все готово к установке в виде строк, разделенных параметром NewLine. Параметр Space содержит строку с пробелами. Инсталлятор использует эту строку для задания установок. Другие параметры содержат (возможно пустые) строки, которые инсталлятор может использовать в качестве секций установок. Например, параметр MemoDirInfo содержит строку для определения секции Выбор папки. Тоесть, после присвоение новой папки установки, нужно вызвать UpdateReadyMemoo(' ', 'разделитель строк', 'информация пользователя', 'папка установки', 'тип установки', 'список компонентов', 'группа в меню пуск', 'выбранные задачи');
|
|
------- Отправлено: 22:31, 21-10-2022 | #844 |
|
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Цитата Gnom_aka_Lexander:
|
|
|
Отправлено: 07:13, 22-10-2022 | #845 |
|
Старожил Сообщения: 440
|
Профиль | Сайт | Отправить PM | Цитировать EdMSL, предоставь значения #NOT_FOUND и #MyAppName. А так же процедуру NoSD - искать не охота. А лучше весь скрипт выложи.
|
|
------- Отправлено: 08:51, 23-10-2022 | #846 |
|
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Код скрипта:
Скрытый текст
#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 и т.д. удалил, чтобы не захлмлять. К проблеме отношения все равно не имеют. |
|
Последний раз редактировалось EdMSL, 23-10-2022 в 09:03. Отправлено: 08:53, 23-10-2022 | #847 |
|
Старожил Сообщения: 440
|
Профиль | Сайт | Отправить PM | Цитировать 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;
|
|
------- Последний раз редактировалось nik1967, 23-10-2022 в 09:29. Отправлено: 09:24, 23-10-2022 | #848 |
|
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать nik1967, Спасибо. Тяжело без линтера жить.
|
|
Отправлено: 09:34, 23-10-2022 | #849 |
|
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать Коллеги, всех приветствую от души!
Подскажите, пожалуйста, как правильно прописать синтаксис... Надо добавить задачу в Планировщик заданий, вот так работает: Exec(ExpandConstant('{sys}\schtasks.exe'), '/create /f /tn "Добавление задачи" /xml '+ExpandConstant('"{app}\AddTasks.xml"'), '', SW_HIDE, ewWaitUntilTerminated, i);
За ранее благодарен за помощь. |
|
------- Отправлено: 00:58, 27-10-2022 | #850 |
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| Скрипты Inno Setup. Помощь и советы [часть 7] | El Sanchez | Автоматическая установка приложений | 2499 | 02-02-2015 08:59 | |
| Скрипты Inno Setup. Помощь и советы [часть 6] | El Sanchez | Автоматическая установка приложений | 2494 | 10-03-2014 11:51 | |
| Скрипты Inno Setup. Помощь и советы [часть 5] | El Sanchez | Автоматическая установка приложений | 1999 | 28-03-2013 19:09 | |
| Скрипты Inno Setup. Помощь и советы [часть 4] | El Sanchez | Автоматическая установка приложений | 2099 | 22-05-2012 23:16 | |
| Скрипты Inno Setup. Помощь и советы [часть 3] | Serega | Автоматическая установка приложений | 3755 | 26-10-2011 17:58 | |
|