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

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

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

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

Ветеран


Contributor


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


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

Профиль | Отправить 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

 

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


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

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


Цитата:
insombia
Inno Setup Ultra
думаю не точно объяснил - выдает ошибку не при сборке, а при установки - при попытки перейти на страницу компонентов

Последний раз редактировалось tsskz, 24-02-2013 в 11:13.


Отправлено: 11:07, 24-02-2013 | #1721



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

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


Аватара для Tco 03

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


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

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


Цитата Johny777:
Это удобно, тк я заргузил бы его немного изменённой функцией El Sanchez-а и прочитал бы как ини и не нужно код переписывать? »
А возможно ли функцией El Sanchez-а INI-файл загрузить из инсталлятора сразу в оперативную память, не извлекая его на жёсткий диск?

Отправлено: 15:28, 24-02-2013 | #1722


Аватара для Johny777

Ветеран


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

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


Tco 03,
Цитата Tco 03:
А возможно ли функцией El Sanchez-а INI-файл загрузить из инсталлятора сразу в оперативную память, не извлекая его на жёсткий диск? »
Возможно! Благодаря функции расширенной версии инно ExtractTemporaryFileToBuffer(...).
на основе примера \Inno Setup 5\Examples\Example_ExtractTemporaryFileToBuffer.iss сделал простенькую функцию:
читать дальше »
Код: Выделить весь код
function TempTextFileToString(const Filename: String): String;
begin
    SetLength(Result, ExtractTemporaryFileSize(FileName));
    #ifdef UNICODE
        ExtractTemporaryFileToBuffer(FileName, CastAnsiStringToInteger(Result));
    #else
        ExtractTemporaryFileToBuffer(FileName, CastStringToInteger(Result));
    #endif
end;

входной параметр - имя временного файла, содержащего текст
на выходе - строка
ну и соответственно немного изменил функцию El Sanchez-а парсинга ини-файла
оригинальный прототип - function ParseIniFile(const Filename: String): TIniFile; ( полный код тут: http://forum.oszone.net/thread-235078-93.html )
на function ConvertStringToIniFile(const uString: String): TIniFile;
код ниже использует в качестве примера ини следующего содержания:
читать дальше »

[Constructor]
Install_Pics_Off=
Backgr_Pic_Off=1
Quit_Dialog_Off=

код:
читать дальше »
Код: Выделить весь код
#ifndef IS_ENHANCED
    #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif

[Setup]
AppName=Modified El Sanchez Ini-Parsing-Demo
AppVerName=777
CreateAppDir=no

[Files]
Source: Selfish.ini; Flags: dontcopy

[code]
type
    TIniFile = array of record
        Section: String;
        Entries: TStringList;
    end;


function ConvertStringToIniFile(const uString: String): TIniFile;
var
    iFile: TStringList;
    i, Len: Integer;
begin
    iFile := TStringList.Create;
    try
        iFile.Text := uString;
        SetArrayLength(Result, 0);
                                       //для всех непустых строк, исключая комментарии
        for i := 0 to iFile.Count-1 do if (iFile[i] <> '') and (Copy(iFile[i], 1, 1) <> ';') then
        //если строка является секцией...
        if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
        begin
            //...пишем в результат имя секции...
            Len := GetArrayLength(Result);
            SetArrayLength(Result, Len+1);
            Result[Len].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
        end
            else
        begin
            //...иначе пишем пару параметр/значение
            if TObject(Result[GetArrayLength(Result)-1].Entries) = nil then
                Result[GetArrayLength(Result)-1].Entries := TStringList.Create;
            Result[GetArrayLength(Result)-1].Entries.Append(iFile[i]);
        end;
        
    finally
        iFile.Free;
    end;
end;


//своя функция для чтения значений параметров из секций
function GetIniValue(const Section, Key, Default: String; iFile: TIniFile): String;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key];
            Break;
        end;
        Break;
    end;
end;


function TempTextFileToString(const Filename: String): String;
begin
    SetLength(Result, ExtractTemporaryFileSize(FileName));
    #ifdef UNICODE
        ExtractTemporaryFileToBuffer(FileName, CastAnsiStringToInteger(Result));
    #else
        ExtractTemporaryFileToBuffer(FileName, CastStringToInteger(Result));
    #endif
end;


procedure InitializeWizard();
var
    Ini: TIniFile;
begin
    Ini := ConvertStringToIniFile(TempTextFileToString('Selfish.ini'));
    MsgBox(GetIniValue('Constructor', 'Backgr_Pic_Off', '0', Ini), mbInformation, MB_OK);
end;


=========================================================================================

El Sanchez,
Цитата El Sanchez:
да, их достаточно »
спасибо, кажись разобрался
результат (работает с кодом чуть выше):
читать дальше »
Код: Выделить весь код
procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
  SetPreviousData(PreviousDataKey, 'Install',
    '[Parameters]'             + #13#10 +
    'Launch_hl2=-console'              + #13#10 +  // тест
    'Launch_hl2_ep1='          + #13#10 +
    'Launch_hl2_ep2='          + #13#10 +
    'Launch_portal='           + #13#10 +
    ''                         + #13#10 +
    '[Installed]'              + #13#10 +
    ';Half-Life 2'             + #13#10 +
    'hl2='                     + #13#10 +
    'hl2_ru='                  + #13#10 +
    'hl2_ru_buka='             + #13#10 +
    'hl2_en='                  + #13#10 +
    'hl2_ru_en=1'               + #13#10 +   // тест
    'AuroraB='                 + #13#10 +
    ''                         + #13#10 +
    ';Half-Life 2 Episode One' + #13#10 +
    'ep1='                     + #13#10 +
    'ep1_ru='                  + #13#10 +
    'ep1_en='                  + #13#10 +
    'ep1_ru_en='               + #13#10 +
    ''                         + #13#10 +
    ';Half-Life 2 Episode Two' + #13#10 +
    'ep2='                     + #13#10 +
    'ep2_ru='                  + #13#10 +
    'ep2_en='                  + #13#10 +
    'ep2_ru_en='               + #13#10 +
    ''                         + #13#10 +
    ';Portal'                  + #13#10 +
    'portal='                  + #13#10 +
    'portal_ru='               + #13#10 +
    'portal_en='               + #13#10 +
    'portal_ru_en='            + #13#10 +
    ''                         + #13#10 +
    ';Common '                 + #13#10 +
    'Start_Folder_Exist='
  );
end;


procedure InitializeWizard();
var
  Ini: TIniFile;
begin
  Ini := ConvertStringToIniFile(GetPreviousData('Install', ''));
  MsgBox(GetIniValue('Parameters', 'Launch_hl2', '', Ini), mbInformation, MB_OK);
  MsgBox(GetIniValue('Installed', 'hl2_ru_en', '', Ini), mbInformation, MB_OK);
end;

Последний раз редактировалось Johny777, 25-02-2013 в 05:23.

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

Отправлено: 04:22, 25-02-2013 | #1723


Аватара для habib2302

Ветеран


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

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


люди.подскажите как создать несколько разделов на последней завершающей странице инсталлятора.
например:как указанно на этом скрине

-------
Помог? От "Полезное сообщение" не откажусь!!!


Отправлено: 09:11, 25-02-2013 | #1724


Аватара для alert30

Ветеран


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

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


habib2302, не ужели так трудно распаковать оригинальный инсталлятор через Universal Extractor; и скрипты будут...

Отправлено: 13:14, 25-02-2013 | #1725


Ветеран


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

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


кто-то может прогресс бар на iswin7 наложить?
http://rghost.ru/44102099

Последний раз редактировалось insombia, 25-02-2013 в 20:19.


Отправлено: 17:47, 25-02-2013 | #1726


Аватара для habib2302

Ветеран


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

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


alert30, тоже самое что и при извлечении через ISUnpacker
скрипт получается один и тот же
вот сами скрипты

это через ISUnpacker
Код: Выделить весь код
;InnoSetupVersion=5.2.3

[Setup]
AppName=CheMax Rus
AppVerName=CheMax Rus 13.0
AppVersion=13.0
DefaultDirName={pf}\CheMaxRus
DefaultGroupName=CheMaxRus
OutputBaseFilename=CheMax 13.0 Rus
Compression=bzip2
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp

[Files]
Source: "{app}\chemax.exe"; DestDir: "{app}"; 
Source: "{app}\cheats.dat"; DestDir: "{app}"; 
Source: "{app}\Readme.txt"; DestDir: "{app}"; 
Source: "{app}\Readme_ukr.txt"; DestDir: "{app}"; 
Source: "{app}\updater.exe"; DestDir: "{app}"; 

[Icons]
Name: "{group}\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база"; 
Name: "{group}\Readme"; Filename: "{app}\Readme.txt"; WorkingDir: "{app}"; Comment: "Прочти меня"; 
Name: "{group}\Удаление CheMax Rus"; Filename: "{app}\unins000.exe"; WorkingDir: "{app}"; Comment: "Удаление CheMax Rus"; 
Name: "{userdesktop}\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база"; Tasks: "desktopicon"; 
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база"; Tasks: "qlaunchicon"; 

[Tasks]
Name: "desktopicon"; Description: "Создать ярлык на &рабочем столе"; 
Name: "qlaunchicon"; Description: "Создать ярлык на &панели быстрого запуска"; 

[Types]
Name: "custom"; Description: "Выборочная установка"; 

[CustomMessages]
russian.NameAndVersion=%1, версия %2
russian.AdditionalIcons=Дополнительные значки:
russian.CreateDesktopIcon=Создать значок на &Рабочем столе
russian.CreateQuickLaunchIcon=Создать значок в &Панели быстрого запуска
russian.ProgramOnTheWeb=Сайт %1 в Интернете
russian.UninstallProgram=Деинсталлировать %1
russian.LaunchProgram=Запустить %1
russian.AssocFileExtension=Св&язать %1 с файлами, имеющими расширение %2
russian.AssocingFileExtension=Связывание %1 с файлами %2...

[Languages]
; These files are stubs
; To achieve better results after recompilation, use the real language files
Name: "russian"; MessagesFile: "embedded\russian.isl";
это через Universal Extractor
Код: Выделить весь код
;InnoSetupVersion=5.2.3

[Setup]
AppName=CheMax Rus
AppVerName=CheMax Rus 13.0
DefaultDirName={pf}\CheMaxRus
DefaultGroupName=CheMaxRus
OutputBaseFilename=CheMax 13.0 Rus
Compression=bzip2
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp

[Files]
Source: "{app}\chemax.exe"; DestDir: "{app}"; 
Source: "{app}\cheats.dat"; DestDir: "{app}"; 
Source: "{app}\Readme.txt"; DestDir: "{app}"; 
Source: "{app}\Readme_ukr.txt"; DestDir: "{app}"; 
Source: "{app}\updater.exe"; DestDir: "{app}"; 

[Icons]
Name: "{group}\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база"; 
Name: "{group}\Readme"; Filename: "{app}\Readme.txt"; WorkingDir: "{app}"; Comment: "Прочти меня"; 
Name: "{group}\Удаление CheMax Rus"; Filename: "{app}\unins000.exe"; WorkingDir: "{app}"; Comment: "Удаление CheMax Rus"; 
Name: "{userdesktop}\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база"; Tasks: "desktopicon"; 
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база"; Tasks: "qlaunchicon"; 

[Tasks]
Name: "desktopicon"; Description: "Создать ярлык на &рабочем столе"; 
Name: "qlaunchicon"; Description: "Создать ярлык на &панели быстрого запуска"; 

[Types]
Name: "custom"; Description: "Выборочная установка"; 

[CustomMessages]
russian.NameAndVersion=%1, версия %2
russian.AdditionalIcons=Дополнительные значки:
russian.CreateDesktopIcon=Создать значок на &Рабочем столе
russian.CreateQuickLaunchIcon=Создать значок в &Панели быстрого запуска
russian.ProgramOnTheWeb=Сайт %1 в Интернете
russian.UninstallProgram=Деинсталлировать %1
russian.LaunchProgram=Запустить %1
russian.AssocFileExtension=Св&язать %1 с файлами, имеющими расширение %2
russian.AssocingFileExtension=Связывание %1 с файлами %2...

[Languages]
; These files are stubs
; To achieve better results after recompilation, use the real language files
Name: "russian"; MessagesFile: "embedded\russian.isl";

-------
Помог? От "Полезное сообщение" не откажусь!!!


Последний раз редактировалось habib2302, 16-12-2013 в 00:15.


Отправлено: 19:07, 25-02-2013 | #1727


Аватара для Tco 03

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


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

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


Johny777
Цитата Johny777:
немного изменил функцию El Sanchez-а парсинга ини-файла
оригинальный прототип - function ParseIniFile(const Filename: String): TIniFile; ( полный код тут: http://forum.oszone.net/thread-235078-93.html ) »
El Sanchez и господин Johny777: как всегда, красяво
Тут ещё одна делема есть... Возможно ли как-то загрузить этот самый INI-файл с хоста (из интернета) сразу в оперативную память? Используя тотже отличный код господина El Sanchez-а. Либо на примере скрипта: \Inno Setup 5\Examples\CodeAutomation.iss - правда там пример про XML-файл...
А то:
Цитата Tco 03:
файлы (по замыслу) должны загружаются через интернет всегда одним установщиком и размер файлов прописывать в установщике (по понятным причинам) бесмысленно. »
То же самое и тут - файл же всё равно будет находиться в инсталляторе и всега один и тот же... Подскажите, пожалйтста, если такое возможно

Отправлено: 20:25, 25-02-2013 | #1728


Ветеран


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

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


как убрать кнопку отмены isdone чтобы стандартная отвечала за отмену?

Отправлено: 00:22, 26-02-2013 | #1729


Аватара для Johny777

Ветеран


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

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


insombia, извиняй iswin7 и Isdone не знаю.

==================================================================================================== ==================

habib2302,
Цитата habib2302:
люди.подскажите как создать несколько разделов на последней завершающей странице инсталлятора. »
Нужно создавать чекбоксы и проверять при нажатии на кнопку "Завершить" их статус, писать булев переменные, тк скорей всего они, чекбоксы, разрушатся и выполнять действия в зависимости от True значения перемнной. Тексты (TNewStaticText или TLabel), как и чекбоксы можешь создать в дизайнере расширенной версии.
Делай, будут непонятки - спрашивай!

и убирай пожалуйста длинные коды (как здесь http://forum.oszone.net/post-2098750-1760.html) под спойлер

==================================================================================================== ==================

Tco 03,
Цитата Tco 03:
Возможно ли как-то загрузить этот самый INI-файл с хоста (из интернета) »
да
Цитата Tco 03:
сразу в оперативную память »
не знаю как , а процедуру El Sanchez-а боюсь модифицировать, тк скорее всего накосячу!
Поэтому предлагаю такой вариант
используя WinApi функцию URLDownloadToFile( http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx )
вот пример простого скачивания файла (любого) куда хочешь:
читать дальше »
Код: Выделить весь код
function DownloadFile(const URL, FileName: String): Boolean;  /// простое скачивание файла
begin
  try
    Result := UrlDownloadToFile(0, URL, FileName, 0, 0) = 0;
  except
    Result := False;
  end;
end;

но мы будем качать в темп, потом загружать из текстового файла текст в переменную типа String и удалять файл вот таким вот чудо-макаром:
читать дальше »
Код: Выделить весь код
function TextFileFromInternetToString(const URL: String): String;
begin
  try /// если файл скачался (функция UrlDownloadToFile возвращает 0) в папку темп, в файл uTextFile, то грузим его в строку, в данном случае сразу в зарезервированную переменную Result
    if UrlDownloadToFile(0, URL, ExpandConstant('{tmp}\uTextFile'), 0, 0) = 0 then LoadStringFromFile(ExpandConstant('{tmp}\uTextFile'), Result);
  finally
    DeleteFile(ExpandConstant('{tmp}\uTextFile')); /// в конечном итоге удаляем файл
  end;
end;

полный пример:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=Download-File-Demo
AppVerName=777
CreateAppDir=no
InfoBeforeFile=compiler:license.txt


[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

function URLDownloadToFile(Caller: DWORD; URL, FileName: String; Reserved, StatusCB: DWORD): Longint; external 'URLDownloadToFile{#A}@UrlMon.dll stdcall';

function DownloadFile(const URL, FileName: String): Boolean;  /// простое скачивание файла
begin
  try
    Result := UrlDownloadToFile(0, URL, FileName, 0, 0) = 0;
  except
    Result := False;
  end;
end;

function TextFileFromInternetToString(const URL: String): String;
begin
  try /// если файл скачался (функция UrlDownloadToFile возвращает 0) в папку темп, в файл uTextFile, то грузим его в строку, в данном случае сразу в зарезервированную переменную Result
    if UrlDownloadToFile(0, URL, ExpandConstant('{tmp}\uTextFile'), 0, 0) = 0 then LoadStringFromFile(ExpandConstant('{tmp}\uTextFile'), Result);
  finally
    DeleteFile(ExpandConstant('{tmp}\uTextFile')); /// в конечном итоге удаляем файл
  end;
end;

procedure InitializeWizard();
begin
  DownloadFile('http://tululu.org/txt.php?id=38061', 'C:\Свихнувшееся время (Филип Дик).txt');
  WizardForm.InfoBeforeMemo.Text := TextFileFromInternetToString('http://tululu.org/txt.php?id=38061');
end;

для чтения ини используй сразу вложенность функций Ini := ConvertStringToIniFile(TextFileFromInternetToString('http://tululu.org/txt.php?id=38061'));
PS: в данном случае качается не ини. Это просто пример

Последний раз редактировалось Johny777, 26-02-2013 в 04:35.

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

Отправлено: 03:00, 26-02-2013 | #1730



Компьютерный форум 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




 
Переход