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

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

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

Ветеран


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


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

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


Изменения
Автор: Serega
Дата: 13-08-2011
Вложения
Тип файла: 7z Inno Setup [все вопросы] часть 1.7z
(1.34 Mb, 908 просмотров)
Тип файла: 7z Inno Setup [все вопросы] часть 2.7z
(3.12 Mb, 806 просмотров)
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
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] - Скачать;

  • InnoSetup Script Joiner - Программа для объединения нескольких скриптов InnoSetup в один;

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


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

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Отправлено: 00:28, 04-11-2010

 

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

Ветеран


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

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


Цитата murlakatamenka:
postinstall, т.к. при нём операции выполняются после завершения установки »
не совсем, этот флаг на последней странице установки делает галку, к примеру, "Показать README"
Код: Выделить весь код
[Run]
Filename: "{app}\README.TXT"; Description: "Показать README"; Flags: postinstall shellexec skipifsilent
и таки да, запускает отмеченное галкой после нажатия кнопки "Завершить"

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


Отправлено: 08:48, 16-05-2011 | #1621



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

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


Новый участник


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

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


Есть *.xml файл с настройками программы. Часть из этих настроек указывает на местоположение ресурсов нужных для этой программы.
Возможно ли автозаполнение этих строк с подменой стандартного указания C:\Program Files на {app}

Отправлено: 19:27, 16-05-2011 | #1622


Аватара для Gnom_aka_Lexander

Ветеран


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

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


ivsatel, Можно, есть готовый модуль для работы с xml - файлами.

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

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

Отправлено: 21:03, 16-05-2011 | #1623


Новый участник


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

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


Основываясь на этом примере:

читать дальше »

Код: Выделить весь код
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Files]
Source: report.xml; Flags: dontcopy

(Code)
Function InitializeSetup: Boolean;
var
  xml, currNode, rootNode, subNode, xmlParser, Fragment: Variant;
begin
  ExtractTemporaryFile('report.xml');

  xml:= CreateOleObject('MSXML2.DOMDocument');
  xml.async:= false;
  xml.preserveWhiteSpace:= true;
  xml.load(ExpandConstant('{tmp}\report.xml'));

  currNode:= xml.selectSingleNode('//SMBIOS/section[(@name=''Mainboard'')]')
  MsgBox(currNode.text, mbInformation, MB_OK);

//	----------------------------------------------
  xmlParser:= CreateOleObject('MSXML2.DOMDocument');

//'Создание объявления XML
  xmlParser.appendChild(xmlParser.createProcessingInstruction('xml', 'version="1.0" encoding="windows-1251"'));

//'Создание комментария
  xmlParser.appendChild(xmlParser.createComment('Текст комментария'));

//'Создание корневого элемента
  rootNode:= xmlParser.appendChild(xmlParser.createElement('ROOT'));

//'Создание первого вложенного элемента
  subNode:= rootNode.appendChild(xmlParser.createElement('SUB'));
  subNode.text:= 'Текст первого вложенного элемента';

//'Создание второго вложенного элемента
  subNode:= rootNode.appendChild(xmlParser.createElement('SUB'));

//'Создание раздела CDATA
  subNode.appendChild(xmlParser.createCDATASection('<<< >>> &&& Произвольные текстовые данные'));

//'Создание ссылки на примитив
  subNode.appendChild(xmlParser.createEntityReference('amp'));

//'Создание текстового узла
  subNode.appendChild(xmlParser.createTextNode('Текст второго вложенного элемента'));

//'Создание третьего вложенного элемента с использованием пространства имён
  subNode:= rootNode.appendChild(xmlParser.createNode(1, 'html:H1', 'http://www.w3c.org/TR/REC-html40/'));
  subNode.text:= 'Заголовок HTML';

//'Создание четвёртого и пятого вложенных элементов с использованием фрагмента
  Fragment:= xmlParser.createDocumentFragment;
  Fragment.appendChild(xmlParser.createElement('SUB'));
  Fragment.appendChild(xmlParser.createElement('SUB'));
  rootNode.appendChild(Fragment);

  xmlParser.save('C:\Test.xml')
End;


Попытался изменить код в своих нуждах, но при установке выходит ошибка "Недопустимое число параметров" в чем ошибка?

читать дальше »

Код: Выделить весь код
Function InitializeSetup: Boolean;
var
  xml, currNode, rootNode, subNode, xmlParser, Fragment: Variant;
begin
  ExtractTemporaryFile('preferences.xml');

  xml:= CreateOleObject('MSXML2.DOMDocument');
  xml.async:= false;
  xml.preserveWhiteSpace:= true;
  xml.load(ExpandConstant('{tmp}\preferences.xml'));

//	----------------------------------------------
  xmlParser:= CreateOleObject('MSXML2.DOMDocument');

//'Создание объявления XML
  xmlParser.appendChild(xmlParser.createProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"')); 

//'Создание корневого элемента MyProgSettings
  rootNode:= xmlParser.appendChild(xmlParser.createElement('MyProgSettings', 'version="1"'));

//'Создание первого вложенного элемента MyProgHotkeys
  subNode:= rootNode.appendChild(xmlParser.createElement('PuntoHotkeys'));
  subNode.text:= '19,275,1043,1169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4179,0,0,0,0';
  
  //'Создание вложенного элемента LayoutSwitchKey
  subNode:= rootNode.appendChild(xmlParser.createElement('LayoutSwitchKey'));
  subNode.text:= '0';

  //'Создание вложенного элемента SeparateLangCombination
  subNode:= rootNode.appendChild(xmlParser.createElement('SeparateLangCombination'));
  subNode.text:= '0';

    //'Создание вложенного элемента TransparentFormsFiller
  subNode:= rootNode.appendChild(xmlParser.createElement('TransparentFormsFiller'));
  subNode.text:= '0';       

    //'Создание вложенного элемента CheckForUpdate
  subNode:= rootNode.appendChild(xmlParser.createElement('CheckForUpdate'));
  subNode.text:= 'No';

  //'Создание вложенного элемента RunAtStartup
  subNode:= rootNode.appendChild(xmlParser.createElement('RunAtStartup'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента DontConvertCapitals
  subNode:= rootNode.appendChild(xmlParser.createElement('DontConvertCapitals'));
  subNode.text:= 'No';

  //'Создание вложенного элемента DontShowTrayIcon
  subNode:= rootNode.appendChild(xmlParser.createElement('DontShowTrayIcon'));
  subNode.text:= 'No';

  //'Создание вложенного элемента ChangeIconClrOnMisprint
  subNode:= rootNode.appendChild(xmlParser.createElement('ChangeIconClrOnMisprint'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента ShowCurLayoutInWndIcon
  subNode:= rootNode.appendChild(xmlParser.createElement('ShowCurLayoutInWndIcon'));
  subNode.text:= 'No';

  //'Создание вложенного элемента ShowPopupOnException
  subNode:= rootNode.appendChild(xmlParser.createElement('ShowPopupOnException'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента ExceptionCount
  subNode:= rootNode.appendChild(xmlParser.createElement('ExceptionCount'));
  subNode.text:= '2';

  //'Создание вложенного элемента FixTwoUpperLetters
  subNode:= rootNode.appendChild(xmlParser.createElement('FixTwoUpperLetters'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента FixInvertedCase
  subNode:= rootNode.appendChild(xmlParser.createElement('FixInvertedCase'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента ShowLayoutFlags
  subNode:= rootNode.appendChild(xmlParser.createElement('ShowLayoutFlags'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента OneKeySwitchLayoutEnabled
  subNode:= rootNode.appendChild(xmlParser.createElement('OneKeySwitchLayoutEnabled'));
  subNode.text:= 'No';

  //'Создание вложенного элемента BinarySwitchLayout
  subNode:= rootNode.appendChild(xmlParser.createElement('BinarySwitchLayout'));
  subNode.text:= 'No';

  //'Создание вложенного элемента DisablePreHandle
  subNode:= rootNode.appendChild(xmlParser.createElement('DisablePreHandle'));
  subNode.text:= 'No';

  //'Создание вложенного элемента AllSoundsEnabled
  subNode:= rootNode.appendChild(xmlParser.createElement('AllSoundsEnabled'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента FirstLaunch
  subNode:= rootNode.appendChild(xmlParser.createElement('FirstLaunch'));
  subNode.text:= 'No';

  //'Создание вложенного элемента SeparateLangKeysEnabled
  subNode:= rootNode.appendChild(xmlParser.createElement('SeparateLangKeysEnabled'));
  subNode.text:= 'No';

  //'Создание вложенного элемента ShowQuickWordsListInLeftBtnMenu
  subNode:= rootNode.appendChild(xmlParser.createElement('ShowQuickWordsListInLeftBtnMenu'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента DontReactOnOtherLangs
  subNode:= rootNode.appendChild(xmlParser.createElement('DontReactOnOtherLangs'));
  subNode.text:= 'No';

  //'Создание вложенного элемента SingleLayout
  subNode:= rootNode.appendChild(xmlParser.createElement('SingleLayout'));
  subNode.text:= 'No';

  //'Создание вложенного элемента ShowTooltips
  subNode:= rootNode.appendChild(xmlParser.createElement('ShowTooltips'));
  subNode.text:= 'No';

  //'Создание вложенного элемента EnableDiary
  subNode:= rootNode.appendChild(xmlParser.createElement('EnableDiary'));
  subNode.text:= 'No';

  //'Создание вложенного элемента DiarySkipSepWords
  subNode:= rootNode.appendChild(xmlParser.createElement('DiarySkipSepWords'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента ScrollAsCaps
  subNode:= rootNode.appendChild(xmlParser.createElement('ScrollAsCaps'));
  subNode.text:= 'No';

  //'Создание вложенного элемента HidePopIndicAfterLayoutChange
  subNode:= rootNode.appendChild(xmlParser.createElement('HidePopIndicAfterLayoutChange'));
  subNode.text:= 'No';

  //'Создание вложенного элемента PSWorks
  subNode:= rootNode.appendChild(xmlParser.createElement('PSWorks'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента DisableHotKeysWhenTurnedOff
  subNode:= rootNode.appendChild(xmlParser.createElement('DisableHotKeysWhenTurnedOff'));
  subNode.text:= 'No';

  //'Создание вложенного элемента FixPopupIndicator
  subNode:= rootNode.appendChild(xmlParser.createElement('FixPopupIndicator'));
  subNode.text:= 'No';

  //'Создание вложенного элемента ShowUsefulTips
  subNode:= rootNode.appendChild(xmlParser.createElement('ShowUsefulTips'));
  subNode.text:= 'No';

  //'Создание вложенного элемента EnableIntelliMenus
  subNode:= rootNode.appendChild(xmlParser.createElement('EnableIntelliMenus'));
  subNode.text:= 'No';

  //'Создание вложенного элемента AutoReplaceAlways
  subNode:= rootNode.appendChild(xmlParser.createElement35('AutoReplaceAlways'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента TurnOffDiaryInProgExceptions
  subNode:= rootNode.appendChild(xmlParser.createElement('TurnOffDiaryInProgExceptions'));
  subNode.text:= 'No';

  //'Создание вложенного элемента ShowFormsFiller
  subNode:= rootNode.appendChild(xmlParser.createElement('ShowFormsFiller'));
  subNode.text:= 'No';

  //'Создание вложенного элемента ReplaceOnEnterAndTab
  subNode:= rootNode.appendChild(xmlParser.createElement('ReplaceOnEnterAndTab'));
  subNode.text:= 'Yes';

  //'Создание вложенного элемента ReplaceOnSpace
  subNode:= rootNode.appendChild(xmlParser.createElement('ReplaceOnSpace'));
  subNode.text:= 'No';

  //'Создание вложенного элемента DontShowTranslitWin
  subNode:= rootNode.appendChild(xmlParser.createElement('DontShowTranslitWin'));
  subNode.text:= 'No';

  //'Создание вложенного элемента FullUnhookWhenDisabled
  subNode:= rootNode.appendChild(xmlParser.createElement('FullUnhookWhenDisabled'));
  subNode.text:= 'No';

  //'Создание вложенного элемента EnableClipboardHistory
  subNode:= rootNode.appendChild(xmlParser.createElement('EnableClipboardHistory'));
  subNode.text:= 'No';

  //'Создание вложенного элемента AutoSaveClipboardToDiary
  subNode:= rootNode.appendChild(xmlParser.createElement('AutoSaveClipboardToDiary'));
  subNode.text:= 'No';

  //'Создание вложенного элемента EnableMouseEmulation
  subNode:= rootNode.appendChild(xmlParser.createElement('EnableMouseEmulation'));
  subNode.text:= 'No';

  //'Создание вложенного элемента DisableCapsLock
  subNode:= rootNode.appendChild(xmlParser.createElement('DisableCapsLock'));
  subNode.text:= 'No';

  //'Создание вложенного элемента PopupIndicatorPos
  subNode:= rootNode.appendChild(xmlParser.createElement('PopupIndicatorPos'));
  subNode.text:= 'CPoint(300, 300)';

  //'Создание вложенного элемента FormsFillerRect
  subNode:= rootNode.appendChild(xmlParser.createElement('FormsFillerRect'));
  subNode.text:= 'CRect(100, 100, 350, 500)';

  //'Создание вложенного элемента RestrictKeysEnabled
  subNode:= rootNode.appendChild(xmlParser.createElement('RestrictKeysEnabled'));
  subNode.text:= 'No,No,No,No,No,No,No';

  //'Создание вложенного элемента MinDiaryRecordWords
  subNode:= rootNode.appendChild(xmlParser.createElement('MinDiaryRecordWords'));
  subNode.text:= '1';

  //'Создание вложенного элемента CurrentAdviceNum
  subNode:= rootNode.appendChild(xmlParser.createElement('CurrentAdviceNum'));
  subNode.text:= '0';

  //'Создание вложенного элемента DontSwitchOnOtherLangs
  subNode:= rootNode.appendChild(xmlParser.createElement('DontSwitchOnOtherLangs'));
  subNode.text:= 'No';

  //'Создание вложенного элемента Sounds
  subNode:= rootNode.appendChild(xmlParser.createElement('Sounds'));
  subNode.text:= '{app}\MyProg\Sounds\typerus.wav,{app}\MyProg\Sounds\typeeng.wav,{app}\MyProg\Sounds\switch.wav,{app}\MyProg\Sounds\misprint.wav,{app}\MyProg\Sounds\ru.wav,{app}\MyProg\Sounds\en.wav,{app}\MyProg\Sounds\reverse.wav,{app}\MyProg\Sounds\switch.wav,{app}\MyProg\Sounds\switch.wav,{app}\MyProg\Sounds\switch.wav,{app}\MyProg\Sounds\switch.wav,{app}\MyProg\Sounds\switch.wav,{app}\MyProg\Sounds\switch.wav,{app}\MyProg\Sounds\switch.wav,{app}\MyProg\Sounds\switch.wav,{app}\MyProg\Sounds\replace.wav';

  //'Создание вложенного элемента SoundsStates
  subNode:= rootNode.appendChild(xmlParser.createElement('SoundsStates'));
  subNode.text:= '98304003,131072003,163840002,45875202,65536003,131072003,131072002,131072002,131072002,131072002,131072002,98304002,111411203,124518403,32768003,26214402';

  //'Создание вложенного элемента AskF12Support
  subNode:= rootNode.appendChild(xmlParser.createElement('AskF12Support'));
  subNode.text:= 'No';

  xmlParser.save('{userappdata}\preferences.xml')
End;

Последний раз редактировалось ivsatel, 17-05-2011 в 15:04.


Отправлено: 22:59, 16-05-2011 | #1624


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

Ветеран


Contributor


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

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


ivsatel, так вам же нужно заменить данные, а не новые записать. Пример функции, заменяющей данные между всеми найденными тегами в файле:
Код: Выделить весь код
[code]
function ReplaceDataXML(FileName, TagName, Data: String): Boolean;
var
  oXMLDoc, objNodeList: Variant;
  i: integer;
  MD5: String;
begin
  if not FileExists(FileName) then Exit;
  MD5 := GetMD5OfFile(FileName);
  try
    oXMLDoc := CreateOleObject('Microsoft.XMLDOM');
  except
    ShowExceptionMessage;
    Exit;
  end;
  oXMLDoc.async := False;
  oXMLDoc.load(FileName);
  objNodeList := oXMLDoc.getElementsByTagName(TagName);
  for i := 0 to objNodeList.length-1 do
    objNodeList.item[i].firstChild.data := Data;
  oXMLDoc.save(FileName);
  Result := (MD5 <> GetMD5OfFile(FileName));
end;

//где-то там вызов
if ReplaceDataXML(ExpandConstant('{src}\preferences.xml'), 'filename', 'blablabla') then
  MsgBox('OK', mbInformation, MB_OK)
else
  MsgBox('Failure', mbError, MB_OK);
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:42, 17-05-2011 | #1625


Новый участник


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

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


Подскажите пожалуйста. Задача такая, при установке пользователю нужно сделать выбор, выбрать один из 5-ти dll файлов, который в дальнейшем будет установлен и зарегестрирован на компьютере. Подскажите, как организовать такой выбор?

Отправлено: 11:50, 17-05-2011 | #1626


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


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

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


давно не был...
начал писать скрипт и передо мной встала задача сделать чекбокс с таким же положением как при флаге fixed
вот то что проделал сам
PHP код: Выделить весь код

MyCheck1 := TCheckBox.Create(WizardForm);

with MyCheck1 do
begin
Top 
:= Label1.Top ScaleY(1);
Left := ScaleX(4)
Width := ScaleX(15);
Enabled:=false;
end

собственно появился вот такой вопрос, как сделать чтобы галочка была нажата?

Отправлено: 19:59, 17-05-2011 | #1627


Аватара для Sotonisto

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


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

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


Всем привет! Сегодня мой друг купил игру The Witcher 2. Устанавливал ее при мне.
Я заметил что инсталл русской версии создан innostup'ом Есть у кого скрипт такого инсталлятора (ну или похожий)?

Изображения "вытащить" получилось, а вот звуки (при нажатии на кнопки) и все остальное - нет

-------
Большой шаг вперед, как правило, следствие хорошего пинка под зад.


Последний раз редактировалось Sotonisto, 21-05-2011 в 05:29.


Отправлено: 20:17, 17-05-2011 | #1628


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


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

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


Imitri7,
Цитата Imitri7:
как сделать чтобы галочка была нажата? »
Код: Выделить весь код
Checked := True;
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:45, 17-05-2011 | #1629


Новый участник


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

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


Посмотрите пожалуйста, в чем ошибка?

Код: Выделить весь код
procedure ChangeString;
var
  S: TArrayOfString;
  F: string;
  i: Integer;
begin
  F:= ExpandConstant('C:\report.txt');
  if not FileExists(F) then Exit; // если файла нет, выходим
  LoadStringsFromFile(F, S); // загружаем файл
  for i:= 0 to GetArrayLength(S)-1 do
    if Pos('c:\Program Files', S[i]) > 0 then
      S[i]:= {app};   // записываем параметр
  SaveStringsToFile(F, S, False); // сохраняем файл
end;

Последний раз редактировалось ivsatel, 17-05-2011 в 23:31.


Отправлено: 22:20, 17-05-2011 | #1630



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Утилиты - [addon] Inno Setup CrOsP Наборы обновлений для Windows XP/2003/Windows 7 33 11-05-2011 16:03
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Inno Setup 5.3.6 OSZone Software Новости программного обеспечения 0 15-11-2009 17:30
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход