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

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

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

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

Ветеран


Contributor


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


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

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

 

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


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

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


Всем доброго времени суток.
Уважаемые программисты. Подскажите, пожалуйста, возможно ли через Inno подкачать недастающие файлы через интернет, не прибегая, к примеру "InnoTools Downloader "? Слышал про фунцию "Procedure url_download ", может кто знает как ей пользоватся? Через эту процедуру докачка файлов происходит во время устаноки и инсталлятор не переходит на другие странице чтобы скачать файлы.
Так же интерисует: Возможно ли запустить инсталлятор только при подключении к интернет? Если соединения нет, то и инсталлятор соответственно не запускается?
И самое важное: Возможно ли сделать запуск инсталлятора, только на определённой машине? Если sysuserinfoname не совпадает, то соответсвено: Result:= False
Спасибо за внимание.

Отправлено: 16:44, 22-08-2012 | #681



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

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


Аватара для alert30

Ветеран


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

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


Цитата Respin:
InnoTools Downloader »
Вы об этом?
http://www.sherlocksoftware.org/inno...ges/itd_ui.png

Отправлено: 18:42, 22-08-2012 | #682


Аватара для Johny777

Ветеран


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

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


Цитата Ivan_009:
Как добавить проценты удаления на деинсталлятор... »
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs

[  code]
var
  UPercentsTimer: LongWord;
  UPercentsLabel: TLabel;
  
  
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
  


procedure UPercentsProc;
begin
  UPercentsLabel.Caption := IntToStr(UninstallProgressForm.ProgressBar.Position) + ' %';
end;

procedure DeinitializeUninstall();
begin
  KillTimer(0, UPercentsTimer);
end;

procedure InitializeUninstallProgressForm();
begin
  with UninstallProgressForm do
  begin
    OuterNotebook.Hide;
    ProgressBar.Parent := UninstallProgressForm;
    ProgressBar.Max := 100;

    UPercentsLabel:= TLabel.Create(nil);
    with UPercentsLabel do
    begin
      SetBounds(ProgressBar.Left + ScaleX(30),ProgressBar.Top + ProgressBar.Height + ScaleY(10), ProgressBar.Width, ProgressBar.Height);
      AutoSize:= True;
      Transparent := True;
      Parent:= UninstallProgressForm;
    end;
  end;
  
  UPercentsTimer:= SetTimer(UninstallProgressForm.Handle, 0, 10, CallbackAddr('UPercentsProc'));
end;


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

Цитата apozlevich:
Ооочень желательно еще и с выбором из командной строки »
для компонентов есть спец. ком. строка
в справке почитай

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

Цитата Respin:
возможно ли через Inno подкачать недастающие файлы через интернет, не прибегая, к примеру "InnoTools Downloader " »
эту тему почитай
в сообщении El Sanchez - а найдёшь!
Цитата Respin:
Возможно ли запустить инсталлятор только при подключении к интернет? »
в шапке пример "IsInternetActive.iss"
впиши в него заместо процедуры InitializeWizard();
это:
читать дальше »
Код: Выделить весь код
function InitializeSetup(): Boolean;
begin
  if IsInternetActive() then Result := True else
  begin
    MsgBox('Отсутствует соединение с интернетом. Бывай!', mbError, MB_OK);
    Result := False;
  end;      
end;

Последний раз редактировалось Johny777, 22-08-2012 в 19:51.

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

Отправлено: 19:20, 22-08-2012 | #683


Аватара для Ivan_009

Ветеран


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

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


Johny777, Спасибо выручил...

Отправлено: 19:47, 22-08-2012 | #684


Аватара для apozlevich

Ветеран


Автор проектов


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

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


R.i.m.s.k.y., я Inno Setup изучал по скриптам из других инстоллеров, не знал про Components:
Про комстроку - в таком варианте можно будет указать, какой из компонентов ставить, и это хорошо

-------
echo 127.0.0.1 google.ru >> %systemroot%\system32\drivers\etc\hosts && ipconfig /flushdns && echo Я ничего не трогал, оно само!


Последний раз редактировалось apozlevich, 22-08-2012 в 20:52.


Отправлено: 20:41, 22-08-2012 | #685


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


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

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


Цитата alert30:
Вы об этом?
http://www.sherlocksoftware.org/inno...ges/itd_ui.png »
Да, я именно это и имел в виду.

Johny777
Благодарю за инфу. Всё работает прекрасно.
Инсталлятор действительно не запускается без подключения к интернет, но всплывает окно о запросе подключения - это даже хорошо, но можно в него вписать свою надпись вместо: "Подключение коммутируемого соединения"?

По поводу скачивания файлов тоже всё прекрасно, только также есть один вопрос:
Можно ли обойтись без окна сохранить как? Просто нужно докачать недостающие файлы в {app} без запроса.

Отправлено: 11:19, 23-08-2012 | #686


Аватара для Johny777

Ветеран


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

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


Цитата Respin:
но всплывает окно о запросе подключения »
какое окно?
Цитата Respin:
Можно ли обойтись без окна сохранить как? »
не знаю
код покажи! (код под тегами [more][code] твой код [/code][/more] )

Последний раз редактировалось Johny777, 23-08-2012 в 12:11.

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

Отправлено: 11:55, 23-08-2012 | #687


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


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

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


Цитата Johny777:
какое окно? »
Запускается инсталлятор, проверяет нет ли интернет, интернета нет, появляется окно о запросе подключения. Только после отказа в подключении появляется сообщение, что интернета нет и на этом действие заканчивается. Соответсвенно, интернет есть - ничего не появляется, инсталлятор просто запускается.

По поводу окна о запросе сохранения файла:
Скрипт, как ты и сказал: в сообщении El Sanchez находится на этой странице (второй сверху). Может ты имел в виду другой код, но я нашёл только его.
читать дальше »
[code]
Код: Выделить весь код
const
    INTERNET_OPEN_TYPE_PRECONFIG = 0;
    INTERNET_FLAG_NO_CACHE_WRITE = $4000000;
    INTERNET_FLAG_NEED_FILE = $10;
    INTERNET_FLAG_NO_AUTO_REDIRECT = $200000;
    HTTP_QUERY_LOCATION = 33;
    FILE_END = 2;
    INVALID_SET_FILE_POINTER = $FFFFFFFF;

var
    ProgressPage: TOutputProgressWizardPage;
    DownSpeedLabel, PercentLabel, PassedLabel, RemainLabel: TLabel;
    StartDownload: DWORD;
    FStream: TFileStream;
    fSize: DWORD;
    fName: String;
    Timer:  TTimer;
    LastSize, CurrentTimerEvent, LastTimerEvent: DWORD;
    

function InternetOpen(lpszAgent: String; dwAccessType: DWORD; lpszProxyName, lpszProxyBypass: String; dwFlags: DWORD): Integer; external 'InternetOpenA@wininet.dll stdcall';
function InternetOpenUrl(hInternet: Integer; lpszUrl, lpszHeaders: String; dwHeadersLength, dwFlags: DWORD; dwContext: DWORD_PTR): Integer; external 'InternetOpenUrlA@wininet.dll stdcall';
function InternetSetFilePointer(hFile: Integer; lDistanceToMove: Longint; lpDistanceToMoveHigh: Variant; dwMoveMethod, dwContext: DWORD): DWORD; external 'InternetSetFilePointer@wininet.dll stdcall';
function InternetReadFile(hFile: Integer; var lpBuffer: Char; dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; external 'InternetReadFile@wininet.dll stdcall';
function InternetQueryDataAvailable(hFile: Integer; var lpdwNumberOfBytesAvailable: DWORD; dwFlags: DWORD; dwContext: DWORD_PTR): Boolean; external 'InternetQueryDataAvailable@wininet.dll stdcall';
function InternetCloseHandle(hInternet: Integer): BOOL; external 'InternetCloseHandle@wininet.dll stdcall';
function DeleteUrlCacheEntry(lpszUrlName: String): BOOL; external 'DeleteUrlCacheEntryA@wininet.dll stdcall';
function HttpQueryInfo(hRequest: Integer; dwInfoLevel: DWORD; var lpvBuffer: Char; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfoA@wininet.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function StrFromTimeInterval(var pszOut: Char; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeIntervalA@shlwapi.dll stdcall';


////////////////////////////////////////////
function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;

function TicksToTime(Ticks: DWORD): String;
var
    i: Byte;
    arr: array [0..31] of Char;
begin
    for i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;

function RoundDword(dwValue: DWORD): DWORD;
begin
    dwValue := dwValue or (dwValue shr 1);
    dwValue := dwValue or (dwValue shr 2);
    dwValue := dwValue or (dwValue shr 4);
    dwValue := dwValue or (dwValue shr 8);
    dwValue := dwValue or (dwValue shr 16);
    Result := dwValue - (dwValue shr 1);
end;

procedure DownloadProgress(Sender: TObject);
begin
    try
        CurrentTimerEvent := GetTickCount;
        ProgressPage.SetText('Файл: '#9#9 + fName, 'Загружено: '#9 + BytesToSize(FStream.Size) + ' из ' + BytesToSize(fSize));
        PassedLabel.Caption := 'Прошло: '#9 + TicksToTime(CurrentTimerEvent-StartDownload);
        RemainLabel.Caption := 'Осталось: '#9 + TicksToTime(StrToInt(FormatFloat('0',(fSize-FStream.Size)*(CurrentTimerEvent-StartDownload)/FStream.Size)));
        with PercentLabel do
        begin
            Caption := FormatFloat('0.#0 %', (FStream.Size*100)/fSize);
            if Left <= (ProgressPage.ProgressBar.Width - Width) then
                Left := StrToInt(FormatFloat('0', FStream.Size*ProgressPage.ProgressBar.Width/fSize));
        end;
        if CurrentTimerEvent - LastTimerEvent >= 1000 then
        begin
            DownSpeedLabel.Caption := 'Скорость: '#9 + BytesToSize(FStream.Size-LastSize) + '/сек';
            LastTimerEvent := CurrentTimerEvent;
            LastSize := FStream.Size;
        end;
    finally
    end;
end;

procedure DownloadFile(urlFilename: String);
var
    i: SmallInt;
    lpBuffer: array of Char;
    lpdwNumberOfBytesRead, lpdwNumberOfBytesAvailable, lpdwBufferLength, lpdwIndex: DWORD;
    hInt, hRedir, hFile: Integer;
    fBuf: String;
begin
    try
        hInt := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
        if hInt <> 0 then
        try
            //Get file name and size
            hRedir := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE or INTERNET_FLAG_NO_AUTO_REDIRECT, 0);
            if hRedir = 0 then Exit;
            try
                SetArrayLength(lpBuffer, 1024);
                fSize := InternetSetFilePointer(hRedir, 0, NULL, FILE_END, 0);
                if fSize = INVALID_SET_FILE_POINTER then
                begin
                    lpdwBufferLength := GetArrayLength(lpBuffer);
                    lpdwIndex := 0;
                    HttpQueryInfo(hRedir, HTTP_QUERY_LOCATION, lpBuffer[0], lpdwBufferLength, lpdwIndex);
                    urlFilename := '';
                    for i := 0 to lpdwBufferLength-1 do urlFilename := urlFilename + lpBuffer[i];
                    hFile := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE, 0);
                    if hFile <> 0 then
                    try
                        fSize := InternetSetFilePointer(hFile, 0, NULL, FILE_END, 0);
                    finally
                        InternetCloseHandle(hFile);
                        DeleteUrlCacheEntry(urlFilename);
                    end;
                end;
            finally
                fName := ExtractFileName(urlFilename);
                InternetCloseHandle(hRedir);
                DeleteUrlCacheEntry(urlFilename);
            end;
            //
            hFile := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE, 0);
            if hFile <> 0 then
            begin
                if GetSaveFileName('Сохранить как...', fName, '', '*' + ExtractFileExt(fName), ExtractFileExt(fName)) then
                try
                    DeleteFile(fName);
                    FStream := TFileStream.Create(fName, fmCreate);
                    ProgressPage.SetProgress(0, fSize);
                    ProgressPage.Show;
                    StartDownload := GetTickCount();
                    while (InternetQueryDataAvailable(hFile, lpdwNumberOfBytesAvailable, 0, 0) and (lpdwNumberOfBytesAvailable > 0)) do
                    begin
                        SetArrayLength(lpBuffer, RoundDword(lpdwNumberOfBytesAvailable));
                        InternetReadFile(hFile, lpBuffer[0], GetArrayLength(lpBuffer), lpdwNumberOfBytesRead);
                        ProgressPage.SetProgress(FStream.Size + lpdwNumberOfBytesRead, fSize);
                        fBuf := '';
                        for i := 0 to GetArrayLength(lpBuffer)-1 do fBuf := fBuf + lpBuffer[i];
                        FStream.WriteBuffer(fBuf, lpdwNumberOfBytesRead);
                        FStream.Seek(0, soFromEnd);
                        Timer.Enabled := FStream.Size <> fSize;
                    end;
                finally
                    FStream.Free;
                    ProgressPage.Hide;
                end;
            end;
        finally
            InternetCloseHandle(hFile);
            DeleteUrlCacheEntry(urlFilename);
        end;
    finally
        InternetCloseHandle(hInt);
    end;
end;

procedure CreateDownloadProgressPage;
begin
    ProgressPage := CreateOutputProgressPage('Загрузка файла', '');
    ProgressPage.ProgressBar.Top := ProgressPage.ProgressBar.Top + ProgressPage.ProgressBar.Height div 2;
    PercentLabel := TLabel.Create(WizardForm);
    with PercentLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := ProgressPage.ProgressBar.Top - Height - ScaleY(2);
        Transparent := True;
    end;
    DownSpeedLabel := TLabel.Create(WizardForm);
    with DownSpeedLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := ProgressPage.ProgressBar.Top + ScaleY(30);
        Transparent := True;
    end;
    PassedLabel := TLabel.Create(WizardForm);
    with PassedLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := DownSpeedLabel.Top + ScaleY(15);
        Transparent := True;
    end;
    RemainLabel := TLabel.Create(WizardForm);
    with RemainLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := PassedLabel.Top + ScaleY(15);
        Transparent := True;
    end;
    Timer := TTimer.Create(WizardForm);
    with Timer do
    begin
        Interval := 100;
        OnTimer := @DownloadProgress;
        Enabled := False;
    end;
end;

//
procedure InitializeWizard();
begin
    CreateDownloadProgressPage;
end;
//

function NextButtonClick(CurPageID: Integer): Boolean;
begin
    if CurPageID = wpWelcome then
    begin
        DownloadFile('http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe');
        Result := True;
    end;
    Result := True;
end;


За открытие окна о сохранении отвечает строка:
читать дальше »
Код: Выделить весь код
 GetSaveFileName('Сохранить как...', fName, '', '*' + ExtractFileExt(fName), ExtractFileExt(fName))
И если её убрать, то файл сохраняется рядом с exe-ешником.

P.S. Стили окон меняются в зависимости от скина инсталлятора. Просто если в окне сохранения можно вписать "Сохранить как...", то в окне о подключении тоже как-то можно изменить надпись.

Отправлено: 12:58, 23-08-2012 | #688


Аватара для Ivan_009

Ветеран


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

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


Помогите соеденить 2 скрипта чето неполучается...

Последний раз редактировалось Ivan_009, 25-08-2012 в 14:15.


Отправлено: 12:38, 24-08-2012 | #689


Аватара для Ivan_009

Ветеран


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

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


Johny777, В твоем примере почемуто до 100 процентов не доходит все время поразному то 93 то 85

Отправлено: 13:07, 24-08-2012 | #690



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




 
Переход