|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 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 |
|
Старожил Сообщения: 292
|
Профиль | Отправить PM | Цитировать Цитата habib2302:
|
|
|
------- Последний раз редактировалось ZVSRus, 20-10-2020 в 09:17. Отправлено: 09:05, 20-10-2020 | #701 |
|
Ветеран Сообщения: 862
|
Профиль | Отправить PM | Цитировать ZVSRus, Пробовал этот метод, но не работает. Может вы поможете соединить мой скрипт с вашим примером
|
|
------- Отправлено: 12:13, 20-10-2020 | #702 |
|
Старожил Сообщения: 292
|
Профиль | Отправить PM | Цитировать Цитата habib2302:
|
|
|
------- Отправлено: 12:31, 20-10-2020 | #703 |
|
Ветеран Сообщения: 862
|
Профиль | Отправить PM | Цитировать Цитата ZVSRus:
|
|
|
------- Отправлено: 12:51, 20-10-2020 | #704 |
|
Старожил Сообщения: 292
|
Профиль | Отправить PM | Цитировать Цитата habib2302:
|
|
|
------- Отправлено: 13:12, 20-10-2020 | #705 |
|
Ветеран Сообщения: 862
|
Профиль | Отправить PM | Цитировать ZVSRus, Посмотрите, правильно ли сделал?
Скрытый текст
#define AppName "Axialis IconWorkshop"
#define AppVersion "6.9.1"
#include "include\botva2.iss"
[Setup]
AppName={#AppName}
AppVerName={#AppName} {#AppVersion}
AppId={#AppName}
AppVersion={#AppVersion}
AppCopyright=Xabib © 2020
AppPublisher=Axialis Software
AllowNoIcons=yes
DefaultDirName={code:GetDefaultDirName}\{#AppName}
DefaultGroupName={#AppName}
DisableWelcomePage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
DirExistsWarning=no
PrivilegesRequiredOverridesAllowed=dialog
SetupIconFile=Install.ico
UninstallDisplayIcon={app}\IconWorkshop.exe
UninstallDisplayName={#AppName} {#AppVersion}
OutputBaseFilename={#AppName} {#AppVersion} RePack (& Portable) by Xabib
VersionInfoDescription={#AppName} RePack by Xabib
VersionInfoVersion={#AppVersion}
Compression=lzma2/ultra64
SolidCompression=true
InternalCompressLevel=ultra64
LZMADictionarySize=65536
LZMAMatchFinder=BT
LZMANumFastBytes=273
Uninstallable=not IsInPortableMode
UsePreviousAppDir=no
CreateUninstallRegKey=not IsInPortableMode
RawDataResource=Botva>botva2.dll,WMSI>WMSI.png
[Languages]
Name: enu; MessagesFile: compiler:default.isl
Name: rus; MessagesFile: compiler:Languages\russian.isl
[Messages]
BeveledLabel=RePack by Xabib
SelectLanguageTitle={#AppName}
[CustomMessages]
enu.CreateConfigShowOptions=Show options window (when finishing install)
enu.CreateDefaultConfig=Create default configuration
enu.ForbiddenDirMessage=In portable mode, %1 should not be installed in "Program Files" or similar system directories.
enu.InstallModePageCaption=Pick Installation Mode
enu.InstallModePageDescription=Do you prefer integration into Windows or a portable installation?
enu.InstallModePageNormalOption=Normal - Integrates into Windows
enu.InstallModePagePortableOption=Portable - Supports removeable drives (e.g., USB pen drives)
enu.InstallModePageSubCaption=Choose a normal installation that integrates into Windows (e.g., Startmenu, optional Explorer context menu), or a portable installation that can run on any compatible Windows machine.
enu.LanguageFilesComponent=Languages
enu.OpenInstallFolderAfterInstall=Open installation target folder
enu.ProgramFilesComponent=Program Files
enu.StatusRunHxDToCreateConfigFile=Create configuration file...
enu.TaskConfigurationFile=Configuration file:
enu.WriteProtectConfig=Make readonly
enu.PortableButtonInstall=&Unpack
rus.CreateConfigShowOptions=Показать окно параметров (после завершения установки)
rus.CreateDefaultConfig=Создать конфигурацию по умолчанию
rus.ForbiddenDirMessage=В портативном режиме %1 не следует устанавливать в «Program Files» или аналогичных системных каталогах.
rus.InstallModePageCaption=Выберите тип установки
rus.InstallModePageDescription=Предпочитаете интеграцию в Windows или портативную версию?
rus.InstallModePageNormalOption=Нормальная - интеграция в Windows
rus.InstallModePagePortableOption=Портативная - поддерживает переносимые устройства (USB/HDD)
rus.InstallModePageSubCaption=Выберите нормальный тип для установки программы в Windows (добавление в меню Пуск, опционально в контекстное меню) или портативную для работы программы на любом ПК, совместимым с Windows
rus.LanguageFilesComponent=Языки
rus.OpenInstallFolderAfterInstall=Открыть папку установки
rus.ProgramFilesComponent=Program Files
rus.StatusRunHxDToCreateConfigFile=Создать файл конфигурации...
rus.TaskConfigurationFile=Файл конфигурации:
rus.WriteProtectConfig=Сделать доступным только для чтения
rus.PortableButtonInstall=&Распаковать
[Files]
Source: "{app}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{userdocs}\*"; DestDir: "{userdocs}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{userappdata}\*"; DestDir: "{userappdata}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{app}\*"; DestDir: "{app}\App\IconWorkshop"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "{userdocs}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "{userappdata}\*"; DestDir: "{app}\App\DefaultData"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "IconWorkshopPortable.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: IsInPortableMode;
Source: "IconWorkshop_RUS.reg"; DestDir: "{app}\Data"; DestName: "IconWorkshop.reg"; Flags: ignoreversion; Languages: rus; Check: IsInPortableMode;
Source: "IconWorkshop_ENG.reg"; DestDir: "{app}\Data"; DestName: "IconWorkshop.reg"; Flags: ignoreversion; Languages: enu; Check: IsInPortableMode;
#include "include\Registry.iss"
[Run]
Filename: netsh.exe; Parameters: "advfirewall firewall add rule name=""{#AppName}"" dir=in action=block program=""{app}\IconWorkshop.exe"" enable=yes"; Check: not IsInPortableMode; Flags: runhidden;
Filename: netsh.exe; Parameters: "advfirewall firewall add rule name=""{#AppName}"" dir=out action=block program=""{app}\IconWorkshop.exe"" enable=yes"; Check: not IsInPortableMode; Flags: runhidden;
[Icons]
Name: {group}\{#AppName}; Filename: {app}\IconWorkshop.exe; Check: not IsInPortableMode;
Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe}; Check: not IsInPortableMode;
Name: {autodesktop}\{#AppName}; Filename: {app}\IconWorkshop.exe; Tasks: desktopicon; Check: not IsInPortableMode;
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Check: not IsInPortableMode;
[UninstallRun]
Filename: taskkill; Parameters: "/f /im IconWorkshop.exe"; Flags: RunHidden;
Filename: netsh.exe; Parameters: "advfirewall firewall delete rule name=""{#AppName}"""; Check: not IsInPortableMode; Flags: runhidden;
#include "include\UninstallDelete.iss"
[INI]
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "0"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Deleted Items\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Deleted Items\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Deleted Items\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "1"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Icons\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Icons\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Icons\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "6"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Media Files\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Media Files\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Media Files\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "12"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Media Files\Images\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "8"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Objects\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Objects\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Objects\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "14"; Check: not IsInPortableMode;
[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
RT_RCDATA = 10;
var
InputOptionPage: TInputOptionWizardPage;
lResStream: TResourceStream;
lPicHandle: THandle;
i: integer;
Install: TNewRadioButton;
Portable: TNewRadioButton;
PortablePanel: TPanel;
InstallerPanel: TPanel;
function CheckParam(s: string): boolean;
begin
for i := 0 to ParamCount do
begin
Result := ParamStr(i) = s;
if Result then Break;
end;
end;
function GetInstallDir(S: String): String;
begin
if CheckParam('/P') then
Result:= ExpandConstant('{userdesktop}\{#AppName}')
else
Result:= ExpandConstant(S);
end;
function InstallCheck: Boolean;
begin
Result := Install.Checked or CheckParam('/I');
end;
function IsInPortableMode: Boolean;
begin
Result := InputOptionPage.Values[1] and CheckParam('/P');
end;
function GetDefaultDirName(const AParam: string): string;
begin
if ExpandConstant('{param:portable|0}') = '1' then
Result := ExpandConstant('{userdesktop}') else
Result := ExpandConstant('{autopf}');
end;
//Запрет распаковки в системные папки-----Start-----
function IsForbiddenDir(const ADir: string): Boolean;
begin
Result := IsAdminInstallMode and
((not IsWin64 and (Pos(ExpandConstant('{win}'), ADir) = 1)) or
(not IsWin64 and (Pos(ExpandConstant('{commonpf32}'), ADir) = 1)) or
(IsWin64 and (Pos(ExpandConstant('{commonpf64}'), ADir) = 1)));
end;
//Запрет распаковки в системные папки-----Finish-----
//Замена пути распаковки в зависимости от типа-----Start-----
procedure InstallModeListBoxClick(Sender: TObject);
begin
if IsInPortableMode and (CompareText(WizardDirValue, ExpandConstant('{autopf}\{#AppName}')) = 0) then
WizardForm.DirEdit.Text := ExpandConstant('{userdesktop}\{#AppName}')
else if not IsInPortableMode and (CompareText(WizardDirValue, ExpandConstant('{userdesktop}\{#AppName}')) = 0) then
WizardForm.DirEdit.Text := ExpandConstant('{autopf}\{#AppName}');
end;
//Замена пути распаковки в зависимости от типа-----Finish-----
//Создание новой страницы-----Start-----
procedure CreateInstallModePage;
begin
InputOptionPage := CreateInputOptionPage(wpWelcome, ExpandConstant('{cm:InstallModePageCaption}'),
ExpandConstant('{cm:InstallModePageDescription}'), ExpandConstant('{cm:InstallModePageSubCaption}'), True, False);
InputOptionPage.Add(ExpandConstant('{cm:InstallModePageNormalOption}'));
InputOptionPage.Add(ExpandConstant('{cm:InstallModePagePortableOption}'));;
InputOptionPage.Values[1] := ExpandConstant('{param:portable|0}') = '1';
InputOptionPage.Values[0] := not InputOptionPage.Values[1];
InputOptionPage.CheckListBox.OnClickCheck := @InstallModeListBoxClick;
end;
//Создание новой страницы-----Finish-----
//Замена текста в кнопке "Далее" в зависимости от типа-----Start-----
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpSelectTasks:
begin
if not IsInPortableMode then
WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall) else
WizardForm.NextButton.Caption := ExpandConstant('{cm:PortableButtonInstall}');
end;
end;
end;
//Замена текста в кнопке "Далее" в зависимости от типа-----Finish-----
//Уведомление о запрете распаковки в системные папки-----Start-----
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageId of
wpSelectDir:
if IsInPortableMode then
begin
Result := not IsForbiddenDir(WizardDirValue);
if not Result then
MsgBox(ExpandConstant('{cm:ForbiddenDirMessage,{#AppName}}'), mbError, MB_OK);
end;
end;
end;
//Уведомление о запрете распаковки в системные папки-----Finish-----
//Отключение страници создания папку в Пуске при выборе типа Портативная-----Start-----
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result := False;
case PageID of
wpSelectProgramGroup:
Result := IsInPortableMode;
end;
end;
//Отключение страници создания папку в Пуске при выборе типа Портативная-----Finish-----
function GetFromRes(const ResName, SaveFileName: String): Boolean;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
finally
lResStream.Free;
Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
end;
end;
//Подгрузка новой страницы-----Start-----
procedure InitializeWizard;
begin
CreateInstallModePage;
with WizardForm do
begin
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_WMSI', 'WMSI.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\WMSI.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, False);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;
//Подгрузка новой страницы-----Finish-----
procedure DeinitializeSetup();
begin
gdipShutDown();
end;
function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;
external 'SetFileAttributes{#A}@kernel32.dll stdcall';
procedure CurStepChanged(CurStep: TSetupStep);
var
RC: integer;
begin
if CurStep = ssInstall then
begin
Exec(ExpandConstant('taskkill'), ' /f /im IconWorkshop.exe', '', SW_HIDE, ewWaitUntilTerminated, RC);
end;
if CurStep = ssDone then
begin
if not IsInPortableMode then
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Deleted Items\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Icons\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Media Files\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Objects\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
end;
if CurStep = ssDone then
begin
if not IsInPortableMode then
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') and not WizardSilent then
MsgBox('Готово!', mbInformation, MB_OK)
else
if not WizardSilent then
MsgBox('Установка {#AppName} была прервана!', mbError, MB_OK);
end;
if CurStep = ssDone then
begin
if IsInPortableMode then
if not WizardSilent then
if FileExists(ExpandConstant('{app}\IconWorkshopPortable.exe' )) then
MsgBox('Готово!', mbInformation, MB_OK)
else
if not FileExists(ExpandConstant('{app}\IconWorkshopPortable.exe' )) then
MsgBox('Установка {#AppName} была прервана!', mbError, MB_OK);
end;
end;
procedure InitializeUninstallProgressForm;
begin
with UninstallProgressForm do
begin
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_WMSI', 'WMSI.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\WMSI.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, False);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;
procedure DeinitializeUninstall();
begin
gdipShutDown();
end;
|
|
------- Отправлено: 10:28, 25-10-2020 | #706 |
|
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать Приветствую.
У меня такая проблема, имеется программа которая скомпеллирована из двух исполняемых файлов и запускается из экзешника без установки. При первом ее запуске, в системе на постоянной основе начинает работать исполняемый файл, и после закрытия программы этот файл остается в работе. При последующих запусках этой программы, она уже не запускается и выдает ошибку, так как ей мешает запустившийся исполняемый файл, который начал исполняться во время первого запуска программы. ВОПРОС, как сделать что бы программа которая скомпеллирована из двух исполняемых файлов и запускается из экзешника без установки, игнорировала файл который ей мешает при повторном запуске или перезаписывала его вновь? |
|
Последний раз редактировалось Egiptyanin245, 28-10-2020 в 11:33. Отправлено: 00:43, 27-10-2020 | #707 |
|
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
|
Отправлено: 22:37, 27-10-2020 | #708 |
|
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать не совсем понял что вы имели ввиду? советуете мне исправить формулировку вопроса? если так, то уже исправил.
|
|
Отправлено: 11:30, 28-10-2020 | #709 |
|
Новый участник Сообщения: 1
|
Профиль | Сайт | Отправить PM | Цитировать Скиньте плиз все srep и rep одним архивом, и isdone 5 и 6 версию финал
|
|
Отправлено: 00:44, 22-11-2020 | #710 |
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| Скрипты 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 | |
|