Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 5]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]
Скрипты Inno Setup. Помощь и советы [часть 4]

Отправлено: 03:49, 21-05-2012

 

Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


Цитата Mailchik:
Распаковка архивов созданных разными алгоритмами (precomp, srep, zip, xdelta + подключение конфиг файла, для распаковки внешними компрессорами), запуск сторонних exe, с плавным отображением прогрессбара »
Очень "полезные" фишки для правильной установки софта и работоспособности установщика.

И вообще отвечать на пост ниже постом выше - моветон

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Отправлено: 15:56, 10-11-2012 | #1231



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Mailchik

Пользователь


Сообщения: 78
Благодарности: 63

Профиль | Отправить PM | Цитировать


Johny777, Вы всё красиво расписали. Споры бессмысленны, так как я указал:
Цитата Mailchik:
Лично моё мнение
Цитата R.i.m.s.k.y.:
Очень "полезные" фишки для правильной установки софта и работоспособности установщика.
ваши мысли не могут являться единственно верными, я считаю по другому и высказал свою мысль.
Цитата:
И вообще отвечать на пост ниже постом выше - моветон
не хочется засорять форум.

Отправлено: 17:54, 10-11-2012 | #1232


Аватара для Gnom_aka_Lexander

Ветеран


Сообщения: 978
Благодарности: 564

Профиль | Сайт | Отправить PM | Цитировать


к слову об установке приложений с помощью IsDone;
читать дальше »
Код: Выделить весь код
#define NeedMem 512

#define records

[Setup]
AppName=SisMin
AppVerName=SisMin
OutputBaseFilename=SisMin
VersionInfoCopyright=ProFrager
SolidCompression=true
CreateAppDir=false
Compression=none
ShowLanguageDialog=no
LanguageDetectionMethod=locale
ShowComponentSizes=false
FlatComponentsList=false
UsePreviousTasks=false
ShowTasksTreeLines=true
ShowUndisplayableLanguages=true
Uninstallable=false
DisableProgramGroupPage=yes
UsePreviousGroup=false
AppendDefaultGroupName=false
AlwaysRestart=true

[CustomMessages]
otherGroup=Прочее:
pointDesc=Создать системную контрольную точку (рекомендуется)
pointMsg=Создание контрольной точки...

[Tasks]
Name: restorepoint; Description: {cm:pointDesc}; GroupDescription: {cm:otherGroup}; MinVersion: 0,5.1
[Types]
Name: full; Description: "Полная установка"; Flags: IsCustom;
Name: compact; Description: "Компактная установка";
Name: custom; Description: "Выборочная установка";

[Components]
Name: dllsfox; Description: Набор библиотек Visual Fox Pro 3, 5, 6, 7, 8 и 9 версий;Types: full;
Name: dllsfull; Description: Набор Runtime библиотек, необходимых для работы различных программ.;Types: full;
Name: DirectX; Description: Набор библиотек DirectX;Types: full;
Name: Java; Description: Расширенный набор Oracle Java.;Types: full;
Name: stdu; Description: Программа для просмотра, файлов DjVu, TIFF, PDF.; Types: full;
Name: msxml4; Description: MSXML 4 SP3 - обновленная версия XML-парсера; Types: full;
Name: Flash; Description: Adobe Flash Player ActiveX и Adobe Flash Player Plugin; Types: full;
Name: RuntimePack; Description: Расширенный набор библиотек Microsoft Visual C++; Types: full;
Name: dotNet; Description: Microsoft .NET Framework 3.5.1- 4.0 Full; Types: full;
Name: PhysX; Description: NVIDIA® PhysX®; Types: full;
Name: R262; Description: Аудиодрайвер Realtek.;Types: full;
Name: Lan; Description: Сетевой драйвер Realtek;Types: full;

[Files]
Source: Include\*; Flags: dontcopy
Source: exe\*; DestDir: {tmp}

#ifdef records
Source: records.inf; Flags: dontcopy
#endif


[CustomMessages]
russian.ExtractedFile=Устанавливается:
russian.Extracted=Установка системных компонентов...
russian.Error=Ошибка!
russian.ElapsedTime=Прошло:
russian.RemainingTime=Осталось времени:
russian.EstimatedTime=Всего:
russian.AllElapsedTime=Время установки:

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

[UninstallDelete]
Type: filesandordirs; Name: {app}

[*Code]
const
  APPLICATION_INSTALL = 0;
  APPLICATION_UNINSTALL = 1;
  DEVICE_DRIVER_INSTALL = 10;
  MODIFY_SETTINGS = 12;
  CANCELLED_OPERATION = 13;
  BEGIN_SYSTEM_CHANGE = 100;
  END_SYSTEM_CHANGE = 101;
  BEGIN_NESTED_SYSTEM_CHANGE = 102;
  END_NESTED_SYSTEM_CHANGE = 103;

var
  LblPct, LblTime : array[0..1]of TLabel;
  ISDonePB : array[0..1]of TNewProgressBar;
  ISDoneCancel:integer;
  ISDoneError:boolean;

type
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

function SetRestorePoint(const PointName: string): Boolean;
var
  vObj, SR: Variant;
begin
  vObj := CreateOleObject('ScriptControl');
  vObj.Language := 'VBScript';
  SR := vObj.eval('GetObject("winmgmts:\\.\root\default:SystemRestore")');
  Result := SR.CreateRestorePoint(PointName, APPLICATION_INSTALL, BEGIN_SYSTEM_CHANGE) = 0;
end;

function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';
function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';

function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:string):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';
function GetModuleHandle(ModuleName:PAnsiChar):Cardinal; external 'GetModuleHandleA@kernel32.dll stdcall';
function FreeLibrary(Handle:cardinal):bool; external 'FreeLibrary@kernel32.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
  if OveralPct<=1000 then ISDonePB[0].Position := OveralPct;
  if CurrentPct<=1000 then ISDonePB[1].Position := CurrentPct;
  
  LblPct[0].Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
  LblPct[1].Caption := IntToStr(CurrentPct div 10)+'.'+chr(48 + CurrentPct mod 10)+'%';
  
  LblTime[0].Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
  LblTime[1].Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;

  WizardForm.FilenameLabel.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, WizardForm.FilenameLabel.Font, WizardForm.FilenameLabel.Width-ScaleX(100));
  Result := ISDoneCancel;
end;

procedure CreateControls;
var
  i : integer;
begin
  for i := 0 to 1 do
  begin
    ISDonePB[i] := TNewProgressBar.Create(WizardForm);
    with ISDonePB[i] do begin
      Parent   := WizardForm.InstallingPage;
      SetBounds(ScaleX(0), ScaleY(80+i*40), ScaleX(417), ScaleY(21));
      Max      := 1000;
    end;
    LblTime[i] := TLabel.Create(WizardForm);
    with LblTime[i] do begin
      Parent    := ISDonePB[i];
      Transparent := True;
      AutoSize  := False;
      SetBounds(ScaleX(5), ScaleY(3), ScaleX(412), ScaleY(14));
    end;
    LblPct[i] := TLabel.Create(WizardForm);
    with LblPct[i] do begin
      Parent    := ISDonePB[i];
      Transparent := True;
      Alignment := taRightJustify;
      AutoSize  := False;
      SetBounds(ScaleX(0), ScaleY(3), ScaleX(412), ScaleY(14));
    end;
  end;

  with WizardForm do
  begin
    StatusLabel.SetBounds(ScaleX(0), ScaleY(63), ScaleX(417), ScaleY(21));
    FilenameLabel.SetBounds(ScaleX(0), ScaleY(103), ScaleX(417), ScaleY(21));
    FilenameLabel.Show;
  end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  if (CurPageID = wpFinished) and ISDoneError then
  begin
    with WizardForm do
    begin
      Caption:= ExpandConstant('{cm:Error}');
      FinishedLabel.Font.Color:= clRed;
      FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
    end;
  end;
end;

function CheckError:boolean;
begin
  result:= not ISDoneError;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  msg: string;
  Comps1, Comps2, Comps3, TmpValue  :cardinal;
begin
  if CurStep = ssInstall then
  begin
    WizardForm.StatusLabel.SetBounds(ScaleX(0), ScaleY(27), ScaleX(417), ScaleY(21));
    WizardForm.FilenameLabel.Hide;
    if IsTaskSelected('restorepoint') then
    begin
      try
        msg := WizardForm.StatusLabel.Caption;
        WizardForm.StatusLabel.Caption := ExpandConstant('{cm:pointMsg}');
        WizardForm.Repaint;
        // создаём контрольную точку
        SetRestorePoint('Установка {#SetupSetting("AppName")}');
        WizardForm.StatusLabel.Caption := msg;
      finally
        SetLength(msg, 0);
      end;
    end;
  end;
  if CurStep = ssPostInstall then
  begin  
    #ifdef records
    ExtractTemporaryFile('records.inf');
    #endif
    Comps1:=0; Comps2:=0; Comps3:=0;
    TmpValue:=1;
    if IsComponentSelected('msxml4') then Comps1:=Comps1+TmpValue;     //компонент 1
    TmpValue:=TmpValue*2;
    if IsComponentSelected('dllsfox') then Comps1:=Comps1+TmpValue;     //компонент 2
    TmpValue:=TmpValue*2;
    if IsComponentSelected('dllsfull') then Comps1:=Comps1+TmpValue;    //компонент 3
    TmpValue:=TmpValue*2;
    if IsComponentSelected('Flash') then Comps1:=Comps1+TmpValue;    //компонент 4
    TmpValue:=TmpValue*2;
    if IsComponentSelected('Java') then Comps1:=Comps1+TmpValue;     //компонент 5
    TmpValue:=TmpValue*2;
    if IsComponentSelected('DirectX') then Comps1:=Comps1+TmpValue;     //компонент 6
    TmpValue:=TmpValue*2;
    if IsComponentSelected('RuntimePack') then Comps1:=Comps1+TmpValue;    //компонент 7
    TmpValue:=TmpValue*2;
    if IsComponentSelected('stdu') then Comps1:=Comps1+TmpValue;    //компонент 8
    TmpValue:=TmpValue*2;
    if IsComponentSelected('dotNet') then Comps1:=Comps1+TmpValue;    //компонент 9
    TmpValue:=TmpValue*2;
    if IsComponentSelected('PhysX') then Comps1:=Comps1+TmpValue;    //компонент 10
    TmpValue:=TmpValue*2;
    if IsComponentSelected('R262') then Comps1:=Comps1+TmpValue;     //компонент 11
    TmpValue:=TmpValue*2;
    if IsComponentSelected('Lan') then Comps1:=Comps1+TmpValue;     //компонент 12
    CreateControls;
    WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
    ISDoneCancel:=0;

    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then
    begin
      repeat
        if not ISExec          ( 1, 0, 0, ExpandConstant('{tmp}\dllsfox.exe'), ' -y -gm2 -fm0', ExpandConstant('{tmp}'), 'Набор DLL Visual Fox Pro',false) then break;
        if not ISExec          ( 2, 0, 0, ExpandConstant('{tmp}\dllsfull.exe'), ' -y -gm2 -fm0', ExpandConstant('{tmp}'), 'Набор Runtime  DLL',false) then break;
        if not ISExec          ( 3, 0, 0, ExpandConstant('{tmp}\DirectX.exe'), ' /S', ExpandConstant('{tmp}'), 'Набор библиотек DirectX',false) then break;
        if not ISExec          ( 4, 0, 0, ExpandConstant('{tmp}\Java.exe'), ' /S', ExpandConstant('{tmp}'), 'Расширенный набор Oracle Java',false) then break;
        if not ISExec          ( 5, 0, 0, ExpandConstant('{tmp}\stdu.exe'), ' /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-', ExpandConstant('{tmp}'), 'Программа для просмотра, файлов DjVu, TIFF, PDF',false) then break;
        if not ISExec          ( 6, 0, 0, ExpandConstant('{tmp}\msxml4.exe'),' /passive', ExpandConstant('{tmp}'), 'MSXML 4 SP3',false) then break;
        if not ISExec          ( 7, 0, 0, ExpandConstant('{tmp}\Flash.exe'),'', ExpandConstant('{tmp}'), 'Adobe Flash Player ActiveX и Adobe Flash Player Plugin',false) then break;
        if not ISExec          ( 8, 0, 0, ExpandConstant('{tmp}\VCRedist.exe'), ' /S', ExpandConstant('{tmp}'), 'Расширенный набор библиотек Microsoft Visual C++',false) then break;
        if not ISExec          ( 9, 0, 0, ExpandConstant('{tmp}\dotNet.exe'), ' -aiqlku', ExpandConstant('{tmp}'), 'Microsoft .NET Framework 3.5.1- 4.0 Full',false) then break;
        if not ISExec          ( 10, 0, 0, ExpandConstant('{tmp}\PhysX.exe'), ' /Q', ExpandConstant('{tmp}'), 'NVIDIA® PhysX®',false) then break;
        if not ISExec          ( 11, 0, 0, ExpandConstant('{tmp}\R262.exe'), '', ExpandConstant('{tmp}'), 'Аудиодрайвер Realtek',false) then break;
        if not ISExec          ( 12, 0, 0, ExpandConstant('{tmp}\Lan.exe'), '', ExpandConstant('{tmp}'), 'Сетевой драйвер Realtek',false) then break;

        ISDoneError:=false;
      until true;
      ISDoneStop;
    end;
  end;
end;
R.i.m.s.k.y., Johny777, а сколько кода (приплюсуем сюда тормоза, которые внесет виртуальная машина Inno) займет у Вас установка десятка приложений, с отображением установки каждого на отдельном прогрессбаре, и всех выбранных на общем?

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:24, 10-11-2012 | #1233


Аватара для Limonica

Старожил


Сообщения: 152
Благодарности: 8

Профиль | Отправить PM | Цитировать


Можно ли запустить готовый инсталлятор, в тихом режиме без параметра /VERYSILENT ?

Отправлено: 18:29, 10-11-2012 | #1234


Аватара для Gnom_aka_Lexander

Ветеран


Сообщения: 978
Благодарности: 564

Профиль | Сайт | Отправить PM | Цитировать


Limonica, нельзя. но можно скрыть окно инсталла насовсем, без вариантов, в шапке видел пример.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.


Отправлено: 18:33, 10-11-2012 | #1235


Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


Gnom_aka_Lexander, какая виртуальная машина Inno? первый раз про такую слышу
У меня есть подобие твоего примера, называется InstallAll, ставит в систему все от граблей до кораблей без участия человека (системные компоненты vcredistы, дирексы, фреймворки, тоталы/ворды и т.д), всего 20 компонентов для джентльменского набора.
Я вообще на заморачиваюсь на прогрессбар, все запускается оригинальными установщиками через AfterInstall или Run, в зависимости от порядка установки.
Ибо заморачиваться на прогрессбар в ущерб стабильности установщика считаю нецелесообразным.

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Отправлено: 18:35, 10-11-2012 | #1236


Аватара для Gnom_aka_Lexander

Ветеран


Сообщения: 978
Благодарности: 564

Профиль | Сайт | Отправить PM | Цитировать


Цитата R.i.m.s.k.y.:
в ущерб стабильности установщика »
нестабильным его делают косорукие кулрепацкеры, совмещая несовместимое. в чистом дефолте библиотека полностью стабильна. С брызгами изо рта доказывать ничего не буду, смысла нет, и убедиться не проверив невозможно в принципе.
А насчет инно - уж тебе-ли не знать, в чем разница между средами(или как это правильно обозвать?) компилируемым и интерпретируемыми?

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.


Отправлено: 18:47, 10-11-2012 | #1237


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Цитата Mailchik:
Споры бессмысленны »
я и не спорю. Лишь ответил на твой вопрос
Цитата Mailchik:
Встречный вопрос, а кто настучал его не использовать? »
==========================================================================
Цитата Gnom_aka_Lexander:
а сколько кода (приплюсуем сюда тормоза, которые внесет виртуальная машина Inno) займет у Вас установка десятка приложений »
12 строк = 12 вызовов функции Exec под каждый компонент (говорю на основе твоего кода-примера)
Цитата R.i.m.s.k.y.:
Ибо заморачиваться на прогрессбар »
Цитата Gnom_aka_Lexander:
с отображением установки каждого на отдельном прогрессбаре »
пардон уважаемые. О чём речь? Какой прогрессбар без циклов или таймеров может отобразить установку например Директ Икса?

Отправлено: 18:50, 10-11-2012 | #1238


Аватара для Gnom_aka_Lexander

Ветеран


Сообщения: 978
Благодарности: 564

Профиль | Сайт | Отправить PM | Цитировать


Цитата Johny777:
Какой прогрессбар без циклов или таймеров может отобразить установку например Директ Икса? »
функция, вызываемая из библиотеки, довольно точно воспроизводит прогресс на прогрессбаре инсталла. И там не таймеры с циклами, там потоки.
оффтоп завершил.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.


Отправлено: 18:58, 10-11-2012 | #1239


Пользователь


Сообщения: 76
Благодарности: 2

Профиль | Отправить PM | Цитировать


А можно что-бы при извлечении временных файлов в папку Temp показывался прогрессбар, т.е запускается инсталл, извлекаются файлы и в это время была полоска прогрессбара?
P.S. Файлы извлекаются через InitializeWizard, а у временных файлов убрано в секции [Files] кат. назначения: DestDir: {tmp}.

Отправлено: 21:38, 10-11-2012 | #1240



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход