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

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

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

Аватара для 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] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Отправлено: 19:06, 28-03-2013

 

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


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

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


habib2302,
Цитата saurn:
В качестве иконки ярлыка берется иконка исполняемого файла. »

Отправлено: 21:08, 13-05-2013 | #441



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

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


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

Ветеран


Contributor


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

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


Цитата by_gangster:
А в примере от El Sanchez, можно сделать что бы окно выбора не высвечивалось ? »
by_gangster, замените эти строки:
Код: Выделить весь код
if GetSaveFileName('Сохранить как...', fName, '', '*' + ExtractFileExt(fName), ExtractFileExt(fName)) then
try
вот этими:
Код: Выделить весь код
if DirExists(szDestDir) then
try
    fName := Format('%s\%s', [szDestDir, fName]);
Саму процедуру объявите как:
Код: Выделить весь код
procedure DownloadFile(urlFilename, szDestDir: String);
P.S. Вообще-то пример в шапке устарел, заменю его как-нибудь.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:23, 13-05-2013 | #442


Аватара для Johny777

Ветеран


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

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


by_gangster, El Sanchez,
позволил себе изменить немного процедуру скачивания:

procedure DownloadFile(интернет_ссылка_на_файл, имя_файла_сохранения, указатель_на_каллбэк_процедуру);
упростил немного код, благодаря каллбэку избавился от глобальных переменных и вынес конвертацию массива символов в строку в отдельную функцию и таким макаром избавился от некоторых действий
процедуры скачивания и теперь в функцию передаются не переменные, а const ссылки (так лучше)
пример скачивания и работы каллбэка ниже:


читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma2/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[code  ]

#ifdef UNICODE
    #define A "W"
    #define UCHAR "AnsiChar"
#else
    #define A "A"
    #define UCHAR "Char"
#endif

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;
    
    DOWNLOAD_START = -1;
    DOWNLOADING = 1;
    DOWNLOAD_END = 0;

type
    _DOWNLOAD_CALLBACK = function(const StatusMessage, sFileNameAddr, dwFileSize, dwPosition: Longint): Boolean;
    HINTERNET = Longint;
    
var
    StopDownload: Boolean;
    StopDownloadBtn: TButton;

function InternetOpen(lpszAgent: String; dwAccessType: DWORD; lpszProxy, lpszProxyBypass: String; dwFlags: DWORD): HINTERNET; external 'InternetOpen{#A}@wininet.dll stdcall';
function InternetOpenUrl(hInet: HINTERNET; lpszUrl, lpszHeaders: String; dwHeadersLength, dwFlags, dwContext: DWORD): HINTERNET; external 'InternetOpenUrl{#A}@wininet.dll stdcall';
function InternetSetFilePointer(hFile: HINTERNET; lDistanceToMove, pReserved: Longint; dwMoveMethod, dwContext: DWORD): DWORD; external 'InternetSetFilePointer@wininet.dll stdcall';
function InternetReadFile(hFile: HINTERNET; var lpBuffer: {#UCHAR}; dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; external 'InternetReadFile@wininet.dll stdcall';
function InternetQueryDataAvailable(hFile: HINTERNET; var lpdwNumberOfBytesAvailable: DWORD; dwFlags, dwContext: DWORD): Boolean; external 'InternetQueryDataAvailable@wininet.dll stdcall';
function InternetCloseHandle(hInet: HINTERNET): BOOL; external 'InternetCloseHandle@wininet.dll stdcall';
function DeleteUrlCacheEntry(lpszUrlName: String): BOOL; external 'DeleteUrlCacheEntryA@wininet.dll stdcall';
function HttpQueryInfo(hRequest: HINTERNET; dwInfoLevel: DWORD; var lpvBuffer: {#UCHAR}; var lpdwBufferLength, lpdwReserved: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: {#UCHAR}; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64{#A}@shlwapi.dll stdcall';
function StrFromTimeInterval(var pszOut: {#UCHAR}; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function GetTickCount(): DWORD; external 'GetTickCount@kernel32.dll stdcall';

////////////////////////////////////////////
function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of {#UCHAR};
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 {#UCHAR};
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 CancelDownloadOnClick(Sender: TObject);
begin
    StopDownload := True;
end;

         
function DownloadProgress(const StatusMessage, sFileNameAddr, dwFileSize, dwPosition: Longint): Boolean;
begin
    case StatusMessage of
        DOWNLOAD_START:
        begin
            WizardForm.ProgressGauge.Max := dwFileSize;
            StopDownloadBtn := TButton.Create(WizardForm)
            with StopDownloadBtn do
            begin
                Parent := WizardForm;
                SetBounds(WizardForm.CancelButton.Left, WizardForm.CancelButton.Top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
                Caption := WizardForm.CancelButton.Caption;
                OnClick := @CancelDownloadOnClick;
            end;
            WizardForm.CancelButton.Hide;
        end;
        DOWNLOADING:
        begin
            WizardForm.ProgressGauge.Position := dwPosition;
            WizardForm.StatusLabel.Caption := Format( 'FileName:' #32 '%s' #32 'FileSize:' #32 '%s', [CastIntegerToString(sFileNameAddr), BytesToSize(Extended(dwFileSize))] );
            WizardForm.FilenameLabel.Caption := Format( 'Downloaded:' #32 '%s' #32 'Ready:' #32 '%s', [BytesToSize(Extended(dwPosition)), FormatFloat('0.#0 %', (dwPosition*100)/dwFileSize)] );
            Application.ProcessMessages;
        end;
        DOWNLOAD_END:
        begin
            WizardForm.CancelButton.Show;
            if StopDownloadBtn <> nil then StopDownloadBtn.Free;
        end;
    end;
   // Result := True;
    Result := StopDownload;
end;


function CharArrayToString(const cArray: array of Char): String;
var
    i: Integer;
begin
    for i := 0 to GetArrayLength(cArray)-1 do Result := Result + cArray[i];
end;


procedure DownloadFile(const urlFilename, DestFileName: String; const CallBack: _DOWNLOAD_CALLBACK);
var
    lpdwNumberOfBytesRead, lpdwNumberOfBytesAvailable, lpdwBufferLength, lpdwIndex: DWORD;
    hInt, hRedir, hFile: HINTERNET;
    dStop: Boolean;
    lpBuffer: array of {#UCHAR};
    fStream: TFileStream;
    fSize: DWORD;
begin
    hInt := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
    if hInt <> 0 then
    try   
        //Get file size
        hRedir := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE or INTERNET_FLAG_NO_AUTO_REDIRECT, 0);
        if hRedir <> 0 then
        try
            SetArrayLength(lpBuffer, 1024);
            fSize := InternetSetFilePointer(hRedir, 0, 0, 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);
                hFile := InternetOpenUrl(hInt, CharArrayToString(lpBuffer), '', 0, INTERNET_FLAG_NEED_FILE, 0);
                if hFile <> 0 then
                try
                    fSize := InternetSetFilePointer(hFile, 0, 0, FILE_END, 0);
                finally
                    InternetCloseHandle(hFile);
                    DeleteUrlCacheEntry(urlFilename);
                end;
            end;
        finally
            InternetCloseHandle(hRedir);
            DeleteUrlCacheEntry(urlFilename);
        end;
        // download
        
        if FileExists(DestFileName) then if not DeleteFile(DestFileName) then
        begin
            InternetCloseHandle(hInt);
            Exit;
        end;
        if not DirExists(ExtractFileDir(DestFileName)) then if not ForceDirectories(ExtractFileDir(DestFileName)) then
        begin
            InternetCloseHandle(hInt);
            Exit;
        end;
        
        hFile := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE, 0);
        if hFile <> 0 then 
        try
            fStream := TFileStream.Create(DestFileName, fmCreate);

            if CallBack <> nil then dStop := CallBack( DOWNLOAD_START, CastStringToInteger(DestFileName), Longint(fSize), 0);
            while (InternetQueryDataAvailable(hFile, lpdwNumberOfBytesAvailable, 0, 0) and (lpdwNumberOfBytesAvailable > 0)) and not dStop do
            begin
                SetArrayLength(lpBuffer, RoundDword(lpdwNumberOfBytesAvailable));
                InternetReadFile(hFile, lpBuffer[0], GetArrayLength(lpBuffer), lpdwNumberOfBytesRead);
                fStream.WriteBuffer(CharArrayToString(lpBuffer), lpdwNumberOfBytesRead);
                fStream.Seek(0, soFromEnd);
                if CallBack <> nil then dStop := CallBack(DOWNLOADING, CastStringToInteger(DestFileName), Longint(fSize), Longint(fStream.Size + lpdwNumberOfBytesRead));
            end;
        finally
            fStream.Free;
            InternetCloseHandle(hFile);
            DeleteUrlCacheEntry(urlFilename);
            if CallBack <> nil then dStop := CallBack( DOWNLOAD_END, CastStringToInteger(DestFileName), Longint(fSize), 0);
            if dStop then DeleteFile(DestFileName);
        end;
    finally
        InternetCloseHandle(hInt);
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssInstall then DownloadFile('http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe', ExpandConstant('{app}\File.exe'), @DownloadProgress); // ..., nil); - no Callback
end;


надеюсь не накосячил
и ещё есть поддержка юникодной инно и кнопка отмены

Последний раз редактировалось Johny777, 14-05-2013 в 00:30. Причина: кач-кач теперь можно отменить!

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

Отправлено: 21:32, 13-05-2013 | #443


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


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

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


Johny777, Ага только процедуру отмениь нельзя (кнопочкой) когда начинается скачивание...

Johny777, И ещё, почему нельзя так делать ?
begin
if CurStep = ssInstall then DownloadFile('http://sayt.ru/1.rar', '{app}\File.exe', @DownloadProgress); // ..., nil); - no Callback
end;

Последний раз редактировалось by_gangster, 13-05-2013 в 21:45.

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

Отправлено: 21:40, 13-05-2013 | #444


Аватара для habib2302

Ветеран


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

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


Цитата saurn:
В качестве иконки ярлыка берется иконка исполняемого файла. »
может что-то можно дописать в vbs скрипт

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


Отправлено: 21:58, 13-05-2013 | #445


Аватара для Johny777

Ветеран


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

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


by_gangster,
Цитата by_gangster:
процедуру отмениь нельзя (кнопочкой) когда начинается скачивание »
добавил кнопку отменны, в перед. сообщении
Цитата by_gangster:
И ещё, почему нельзя так делать ? »
И что это по твоему за путь '{app}\File.exe' ?
так нельзя, тк {app} - константа. Такую строку нужно пропускать через функцию ExpandConstant(...), которая заменяет константы на пути
короче нужно вот так DownloadFile('http://sayt.ru/1.rar', ExpandConstant('{app}\File.exe'), @DownloadProgress);

Отправлено: 23:32, 13-05-2013 | #446


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


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

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


Johny777, Выскакивает ошибка

Cannot create file D:\new\1.rar

Отправлено: 23:52, 13-05-2013 | #447


Аватара для Johny777

Ветеран


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

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


by_gangster, без понятия, у меня всё в порядке. Посмотри в дебаггере на какой строке вылетает. К тому же что касается непосредственно скачивания я ничего не менял, так что ошибок быть не должно
предположу что файлстрим не может создать файл, тк он существует и его держит какой-то процесс
или папка "new" в пути "D:\new\1.rar" не существует (скорее всего именно из-за этого ошибка), исправил пост, пробуй

Последний раз редактировалось Johny777, 14-05-2013 в 00:31.


Отправлено: 23:56, 13-05-2013 | #448


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


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

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


Johny777, Сейчас всё нормально... но деинсталлятор не удаляет файл...

Отправлено: 10:39, 14-05-2013 | #449


Ветеран


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

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


Цитата by_gangster:
Johny777, Сейчас всё нормально... но деинсталлятор не удаляет файл... »
Код: Выделить весь код
[UninstallDelete]
Name: {app}\1.rar; Type: files
или
Код: Выделить весь код
[UninstallDelete]
Name: {app}\*; Type: filesandordirs

Последний раз редактировалось saurn, 15-05-2013 в 17:19.

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

Отправлено: 12:25, 14-05-2013 | #450



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты 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
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59




 
Переход