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

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

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

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


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

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

 

Аватара для Johny777

Ветеран


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

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


Nordek,
Цитата Nordek:
У тебя InitializeWizard не один? »
Цитата Shkutu:
Должен быть один) »
Цитата Nordek:
//Пример событий имеющие дубликацию »
Shkutu права. Например та же процедура procedure InitializeWizard(); может быть только одна с таким названием
тк инно не поддерживает перегрузку (http://www.delphibasics.ru/Overload.php), и даже не в этом дело. Если б компилятор допускал одинаковые названия глобальных переменных, констант, функций/процедур не отличающихся друг от друга по вызову, такой код если б работал бы, то в режиме хаоса и анархии.
то что у тебя в коде это вызов одних процедур из других
например это
читать дальше »
Код: Выделить весь код
procedure CurPageChanged(CurPageID: Integer);
begin
  CurPageChanged1(CurPageID);
//  CurPageChanged2(CurPageID);
//  CurPageChanged3(CurPageID);
//  CurPageChanged4(CurPageID);
//  CurPageChanged5(CurPageID);
end;

////////////////////////////////////////////////////////////

function InitializeSetup(): Boolean;
begin
  Result := InitializeSetup1(); if not Result then exit;
//  Result := InitializeSetup2(); if not Result then exit;
//  Result := InitializeSetup3(); if not Result then exit;
//  Result := InitializeSetup4(); if not Result then exit;
//  Result := InitializeSetup5(); if not Result then exit;
end;

тоже самое, что и это:
читать дальше »
Код: Выделить весь код
procedure  Johny(CurPageID: Integer);
begin
    //...
end;
procedure  Nordek(CurPageID: Integer);
begin
    //...
end;
procedure  SomeProc(CurPageID: Integer);
begin
    //...
end;
procedure  BadProc(CurPageID: Integer);
begin
    //...
end;
  
procedure CurPageChanged(CurPageID: Integer);
begin
  Johny(CurPageID);
  Nordek(CurPageID);
  SomeProc(CurPageID);
  BadProc(CurPageID);
  //..
end;

/////////////////////////////////////////////////////////////////////////////

function A(): Boolean;
begin

end;
function B(): Boolean;
begin

end;
function C(): Boolean;
begin

end;
function InitializeSetup(): Boolean;
begin
  Result := InitializeSetup1(); if not Result then exit;
//  Result := A(); if not Result then exit;
//  Result := B(); if not Result then exit;
//  Result := C(); if not Result then exit;

end;

Дубликация в моём понимании - это например копирование одного участка памяти по адресу в другой такого-же размера. Вот только в том и дело - это копирование (называем действия своими именами), а не дубликация
в Си-шке есть strdup например...
и на будущее будь внимательнее, чтоб тебе по ушам не ездили с мифическими терминами типа "дубликации событий", тк это может сказаться на твоём восприятии кода, который по сути без подобных терминов всегда очень логичен!

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


Отправлено: 20:55, 05-12-2013 | #1621



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

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


SHVtYW4=


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

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


Цитата Johny777:
procedure InitializeWizard(); может быть только одна с таким названием »
Johny777,
читать дальше »
Это родитель будет только один
Код: Выделить весь код
procedure InitializeWizard();
а потомков от него сколько угодно
Код: Выделить весь код
begin
  InitializeWizard1();
  InitializeWizard2();
  InitializeWizard3();
  InitializeWizard4();
  InitializeWizard5();
end;
да и не мне тебе рассказывать.

Восприятие каждого относительно. Нужно учитывать всё, и обязательно уточнить чтоб в дальнейшем при помощи постоянно не исправлять одну ошибку за другой.



На скрине сразу виден был весь скрипт?
На скриншоте указан был только кусок кода:
Код: Выделить весь код
//прячем имена файлов
WizardForm.FileNameLabel.Visible:= False;
//голубой цвет текста вместо блеклого
  with WizardForm do begin
    with BeveledLabel do begin
    Font.Color:=clBlue;
    Enabled:=True;
    end;
  end;
end;
  var
Page: TOutputMsgMemoWizardPage;
//procedure InitializeWizard();
begin
 Page := CreateOutputMsgMemoPage(wpSelectComponents,
   'Предупреждение!', '',
   '', 'Внимание! Прежде чем инсталировать Microsoft .NET Framework только 4.0 для Windows 7, установите версию 3.5.1 из Панель управления-Программы и компоненты-Включение и отключение компонентов Windows-Microsoft .NET Framework 3.5.1');
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case PageFromID(PageID) of
        Page: Result := not IsComponentSelected('Framework\4');
    end;
end;
так ещё процедура procedure InitializeWizard(); была закомментирована //procedure InitializeWizard();, что там выше и ниже было, оставалось только догадываться.

Не всегда код может быть таким
Код: Выделить весь код
procedure InitializeWizard();
begin
  with WizardForm.DirEdit do
  begin
    Top := ScaleY(92);
  end;
end;
может быть и таким
Код: Выделить весь код
procedure RedesignWizardForm;
begin
  with WizardForm.DirEdit do
  begin
    Top := ScaleY(92);
  end;
end;















procedure InitializeWizard();
begin
  RedesignWizardForm;
end;
и от куда что вываливается не понятно.
Чтоб не гадать, лучше показывать не скриншот, а весь скрипт.
Я тоже могу наделать скриншотов, вечности не хватит чтоб угадать весь скрипт.

-------
09a468a9b4293cd82adf6d6c60a9da82 | Tm9yZGVr
В связи со сменой железа и переходом на LInux с полным отказом от Windows - посещение на форуме будет редким.


Последний раз редактировалось Nordek, 05-12-2013 в 21:40.


Отправлено: 21:03, 05-12-2013 | #1622


Аватара для habib2302

Ветеран


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

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


Dimas2011,

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


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


Отправлено: 21:26, 05-12-2013 | #1623


SHVtYW4=


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

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


Цитата Dimas2011:
Как сделать так чтобы когда наводишь на название какого-то файла выскакивала картинка? »
Dimas2011, какая-то странная мода пошла. Вас там ещё много?
Сообщения #662 в шапке явно не хватает.

Цитата Dimas2011:
сделайте хотябы для одного элемента плыз »
#1560.

-------
09a468a9b4293cd82adf6d6c60a9da82 | Tm9yZGVr
В связи со сменой железа и переходом на LInux с полным отказом от Windows - посещение на форуме будет редким.

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

Отправлено: 21:52, 05-12-2013 | #1624


Аватара для Johny777

Ветеран


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

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


Nordek,
читать дальше »
Цитата Nordek:
Это родитель будет только один, а потомков от него сколько угодно»
извращение понятий.
давай поговорим об абстрактном
термин родитель/предок --> наследник/потомок применим к классам в ООП
Например ты написал визуальный класс - "Кнопка" (у которой например нет возможность менять цвет),
type
TButton = class(TWinControl)
private
// методы и свойства
public
// методы и свойства
end;
но потом понял, что помимо неё ещё нужна более продвинутая
со свойством "цвет", "прозрачность" + всё то, что есть у TButton (текст, хинт,...)
чтоб не писать заново класс ты пишешь наследника TColorButton = class(TButton)
TColorButton наследует все методы и свойства TButton + теперь уже в классе TColorButton ты описываешь те дополнительные свойства, ради чего ты её сабклассил
понимаешь теперь,
не подумай, что я придираюсь к словам. От души тебе желаю, чтоб ты в будущем создавал свои классы, но чтоб при этом у тебя не было путаницы в голове, чтоб
вызов одной процедуры/функции из другой для тебя был бы вызов одной процедуры/функции из другой, а не дубликация
и понятия родитель - потомок ассоциировались с тем самым (о чём я только что говорил)
Цитата Nordek:
Восприятие каждого относительно. »
согласен. На тему восприятия другой пример:
код пишется как правило для себя, но не всегда (иногда выложишь в свободный доступ, захочешь когда-нибудь переписать, или будут проблемы - спросишь например на форуме)
к примеру у тебя вызов
begin
InitializeWizard1(); // извлечение картинок
InitializeWizard2(); // создание страницы
end;
это "быдлокод" http://otvet.mail.ru/question/62758337 (во втором сообщении одна из особенностей)
(я не раз при чтении чужого скрипта для его исправления, запутывался во всех этих невнятных названиях. Само по себе чтение чужого кода - штука невесёлая, даже если он нормально написан )
не будет ли более ясным такой вызов?
begin
ExtractPictures(); // извлечение картинок
CreatePage(); // создание страницы
end;
еще как будет!

Цитата Nordek:
какая-то странная мода пошла. Вас там ещё много?
Сообщения #662 в шапке явно не хватает. »
поддерживаю!

Последний раз редактировалось Johny777, 05-12-2013 в 22:40.


Отправлено: 22:00, 05-12-2013 | #1625


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

Ветеран


Contributor


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

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


Цитата Johny777:
Предлагаю добавить код в шапку (с заменой, если сочтёшь нужным), тк он может многим пригодиться »
Johny777, на втором пустом элементе массива прямых ссылок будет выход и до свиданья закачки, не учитываешь, что у людей может интернет через прокси быть, про редирект ты тоже не знаешь.
Цитата Johny777:
только я так и не понял зачем нужен флаг в твоём коде InternetOpenUrl(... INTERNET_FLAG_NEED_FILE )»
Johny777, ну, игрался с флагами, с этим флагом файл кешируется на прокси (при наличии прокси) или создается временный файл (при отсутствии прокси), сейчас этот флаг не использую.
Цитата Johny777:
когда уже непосредственно получаешь указатель на файл для скачивания? »
Johny777, флаги влияют на свойства получаемого дескриптора файла.
Цитата Johny777:
El Sanchez, ты тогда говорил:
Цитата El Sanchez:
P.S. Вообще-то пример в шапке устарел, заменю его как-нибудь. » »
Ну раз обещал, последняя моя версия:
читать дальше »

Код: Выделить весь код
[Setup]
AppName=test
AppVerName=test
CreateAppDir=false
DefaultDirName={tmp}
Uninstallable=false

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

[code]
#define A = (Defined UNICODE) ? "W" : "A"
const
    INTERNET_OPEN_TYPE_PRECONFIG = 0;
    INTERNET_FLAG_NO_CACHE_WRITE = $4000000;
    INTERNET_FLAG_PRAGMA_NOCACHE = $100;
    INTERNET_FLAG_RELOAD = $80000000;
    INTERNET_FLAG_NEED_FILE = $10;
    INTERNET_FLAG_NO_AUTO_REDIRECT = $200000;
    HTTP_QUERY_FLAG_NUMBER = $20000000;
    HTTP_QUERY_LOCATION = 33;
    HTTP_QUERY_CONTENT_LENGTH = 5;
    HTTP_QUERY_STATUS_CODE = 19;
    ERROR_INSUFFICIENT_BUFFER = 122;
    HTTP_STATUS_OK = 200;
    HTTP_STATUS_REDIRECT = 302;
    GENERIC_READ = $80000000;
    GENERIC_WRITE = $40000000;
    CREATE_ALWAYS = 2;
    HEAP_ZERO_MEMORY = $8;
    IRF_SYNC = $4;

type
    INTERNET_BUFFERS = record
        dwStructSize: DWORD;
        Next: Longint;
        lpcszHeader: String;
        dwHeadersLength: DWORD;
        dwHeadersTotal: DWORD;
        lpvBuffer: Longint;
        dwBufferLength: DWORD;
        dwBufferTotal: DWORD;
        dwOffsetLow: DWORD;
        dwOffsetHigh: DWORD;
    end;

var
    g_DownloadPage: TOutputProgressWizardPage;

function InternetOpen(lpszAgent: String; dwAccessType: DWORD; lpszProxyName, lpszProxyBypass: String; dwFlags: DWORD): Integer; external 'InternetOpen{#A}@wininet.dll stdcall';
function InternetOpenUrl(hInternet: Longint; lpszUrl, lpszHeaders: String; dwHeadersLength, dwFlags: DWORD; dwContext: DWORD_PTR): Integer; external 'InternetOpenUrl{#A}@wininet.dll stdcall';
function InternetReadFileEx(hFile: Longint; var lpBuffersOut: INTERNET_BUFFERS; dwFlags: DWORD; dwContext: DWORD_PTR): BOOL; external 'InternetReadFileEx{#A}@wininet.dll stdcall';
function InternetCloseHandle(hInternet: Longint): BOOL; external 'InternetCloseHandle@wininet.dll stdcall';
function HttpQueryInfo(hRequest: Longint; dwInfoLevel: DWORD; var lpvBuffer: Longint; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function _HttpQueryInfo(hRequest: Longint; dwInfoLevel: DWORD; lpvBuffer: String; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function StrFormatByteSize64(qdw: Currency; pszBuf: AnsiString; cchBuf: UINT): Longint; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function StrFromTimeInterval(pszOut: String; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function CreateFile(lpFileName: String; dwDesiredAccess, dwShareMode: DWORD; lpSecurityAttributes: Longint; dwCreationDisposition, dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; external 'CreateFile{#A}@kernel32.dll stdcall';
function WriteFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD; lpOverlapped: Longint): BOOL; external 'WriteFile@kernel32.dll stdcall';
function GetProcessHeap(): THandle; external 'GetProcessHeap@kernel32.dll stdcall';
function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Longint; external 'HeapAlloc@kernel32.dll stdcall';
function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): BOOL; external 'HeapFree@kernel32.dll stdcall';
function HeapSize(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): DWORD; external 'HeapSize@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';

///////////////////////////////////////////////////
function TicksToTime(const dwTicks: DWORD): String;
begin
    Result := StringOfChar(#0, StrFromTimeInterval(Result, 0, dwTicks, 8));
    StrFromTimeInterval(Result, Length(Result)+1, dwTicks, 8);
end;

////////////////////////////////////////////////////////
function BytesToSize(const exBytes: Double): AnsiString;
begin
    Result := StringOfChar(#0, 15);
    if Abs(exBytes) > 9.223372036854775807E18 then exBytes := 0;
#ifdef UNICODE
    Result := CastIntegerToAnsiString(StrFormatByteSize64(Abs(exBytes div 1E4), Result, Length(Result)));
#else
    Result := CastIntegerToString(StrFormatByteSize64(Abs(exBytes div 1E4), Result, Length(Result)));
#endif
end;

////////////////////////////////////////////////////
function DownloadFile(const szURL: String): Boolean;
var
    hConnect, hSession, hFile, hHeap: THandle;
    szHeader, szFileName: String;
    dwBufferLength, dwIndex, dwStartDownload, dwStart, dwElapsed, dwWritten: DWORD;
    lpBuffer, lpStatus, lpSize: Longint;
    ib: INTERNET_BUFFERS;
begin
    try
        hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
        if hSession = 0 then Exit;

        // additional header
        szHeader := 'Referer: http://example.org/'#13#10;

        // try direct link
        repeat
            hConnect := InternetOpenUrl(hSession, szURL, szHeader, Length(szHeader), INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_AUTO_REDIRECT, 0);
            if hConnect = 0 then Exit;
            dwBufferLength := SizeOf(lpBuffer);
            dwIndex := 0;
            lpStatus := 0;
            if not HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, lpStatus, dwBufferLength, dwIndex) then Exit;
            lpBuffer := 0;
            HttpQueryInfo(hConnect, HTTP_QUERY_LOCATION, lpBuffer, dwBufferLength, dwIndex);
            if DLLGetLastError = ERROR_INSUFFICIENT_BUFFER then
            begin
                szURL := StringOfChar(#0, dwBufferLength-1);
                if not _HttpQueryInfo(hConnect, HTTP_QUERY_LOCATION, szURL, dwBufferLength, dwIndex) then Exit;
                if lpStatus = HTTP_STATUS_REDIRECT then InternetCloseHandle(hConnect);
            end;
        until lpStatus = HTTP_STATUS_OK;

        // get file size
        dwBufferLength := 4;
        dwIndex := 0;
        if not HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, lpSize, dwBufferLength, dwIndex) then Exit;

        // save dialog
        szFileName := ExtractFileName(szURL);
        if GetSaveFileName('Сохранить как...', szFileName, '', Format('*%s', [ExtractFileExt(szFileName)]), ExtractFileExt(szFileName)) then
        try
            hFile := CreateFile(szFileName, GENERIC_READ or GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);  //create file
            if hFile = 0 then Exit;
            hHeap := GetProcessHeap();
            lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4*1024);     // buffer size must be >= 512Kb
            ib.dwStructSize := SizeOf(ib);
            ib.lpvBuffer := lpBuffer;
            ib.dwBufferLength := HeapSize(hHeap, 0, lpBuffer);

            // show page
            g_DownloadPage.Show;
            g_DownloadPage.ProgressBar.Show;
            g_DownloadPage.SetProgress(0, lpSize);

            // try download
            try
                // initial labels
                g_DownloadPage.Msg1Label.Caption := Format(
                    'Файл:'#9#9'%s'#13#10 +
                    'Загружено:'#9'%s из %s', [ExtractFileName(szFileName), BytesToSize(0), BytesToSize(lpSize)]
                );
                g_DownloadPage.Msg2Label.Caption := Format(
                    'Прогресс:'#9'%s'#13#10 +
                    'Скорость:'#9'%s/сек'#13#10 +
                    'Прошло:'#9'0 сек'#13#10 +
                    'Осталось:'#9'%d сек', [FormatFloat('0.#0 %', MulDiv(g_DownloadPage.ProgressBar.Position, 100, lpSize)), BytesToSize(0), MaxInt]
                );
                
                // download
                dwStartDownload := GetTickCount;
                while ib.dwBufferLength > 0 do
                begin
                    dwStart := GetTickCount;
                    dwElapsed := 0;
                    while dwElapsed < 1000 do
                    begin
                        // read file
                        InternetReadFileEx(hConnect, ib, IRF_SYNC, 0);
                        
                        // write file
                        WriteFile(hFile, ib.lpvBuffer, ib.dwBufferLength, dwWritten, 0);
                        ib.dwBufferTotal := ib.dwBufferTotal + dwWritten;

                        // update progressbar
                        g_DownloadPage.ProgressBar.Position := ib.dwBufferTotal;
                        
                        // process messages
                        Application.ProcessMessages;
                        dwElapsed := GetTickCount - dwStart;
                    end;

                    // update labels
                    dwElapsed := GetTickCount-dwStartDownload;
                    g_DownloadPage.Msg1Label.Caption := Format(
                        'Файл:'#9#9'%s'#13#10 +
                        'Загружено:'#9'%s из %s', [ExtractFileName(szFileName), BytesToSize(ib.dwBufferTotal), BytesToSize(lpSize)]
                    );
                    g_DownloadPage.Msg2Label.Caption := Format(
                        'Прогресс:'#9'%d %%'#13#10 +
                        'Скорость:'#9'%s/сек'#13#10 +
                        'Прошло:'#9'%s'#13#10 +
                        'Осталось:'#9'%d сек', [MulDiv(ib.dwBufferTotal, 100, lpSize), BytesToSize(MulDiv(ib.dwBufferTotal, 1000, dwElapsed)), TicksToTime(dwElapsed), MulDiv(lpSize-ib.dwBufferTotal, dwElapsed, 1000)/(ib.dwBufferTotal + 1)]
                    );
                end;
            except
                Result := False;    // error
            finally
            end;
        finally
            CloseHandle(hFile);
            HeapFree(hHeap, 0, lpBuffer);
            Result := ib.dwBufferTotal = lpSize;    // success
        end;
    except
        Result := False;    // error
    finally
        InternetCloseHandle(hConnect);
        InternetCloseHandle(hSession);
        g_DownloadPage.Hide;
    end;
end;

/////////////////////////////////////
procedure CreateDownloadProgressPage;
begin
    g_DownloadPage := CreateOutputProgressPage('Загрузка файла', '');
    with g_DownloadPage do
    begin
        Msg1Label.Height := Msg1Label.Height shl 1;
        Msg2Label.Height := Msg2Label.Height shl 2;
        Msg2Label.Top := ProgressBar.Top + ProgressBar.Height + ScaleY(5);
    end;
end;

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

//////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
    Result := True;
    case CurPageID of
        wpWelcome: DownloadFile('http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe');
    end;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:39, 05-12-2013 | #1626


Аватара для Dinvin4ester

Старожил


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

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


Ребята , как прописать , чтобы после установки выходило два ехе файла на рабочий стол ?
Вот скрипт http://sendfile.su/905823

Отправлено: 22:40, 05-12-2013 | #1627


SHVtYW4=


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

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


Johny777, Кстати, мне показалось или код немного не корректно отрабатывает? Имею ввиду относительно только одного компонента.

Цитата El Sanchez:
редирект »
плохая штука этот редирект. Когда обнаруживаешь вместо закаченного файла, закаченную страницу.

-------
09a468a9b4293cd82adf6d6c60a9da82 | Tm9yZGVr
В связи со сменой железа и переходом на LInux с полным отказом от Windows - посещение на форуме будет редким.


Отправлено: 22:47, 05-12-2013 | #1628


Аватара для Johny777

Ветеран


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

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


Цитата El Sanchez:
на втором пустом элементе массива прямых ссылок будет выход и до свиданья закачки »
так и задумывалось. Те предполагается что если нужно скачать несколько файлов, то функция завершится успешно, если они скачались все!
тк что толку например с 1 файла из 3 если они все втроём составляют одно целое, но это исправить не долго,
я ж не знаю, тонкостей запроса Tco 03
Цитата El Sanchez:
что у людей может интернет через прокси быть »
Цитата El Sanchez:
про редирект ты тоже не знаешь »
как конкретно это учитывается?
Коду работы с интернетом я уделял только 2 раза внимание.
Потому пока ещё не знаю всех тонкостей

Nordek,
Цитата Nordek:
Кстати, мне показалось или код немного не корректно отрабатывает? Имею ввиду относительно только одного компонента. »
вызов ShowPicHint() для всех компонентов одинаковый, картинка отображается в точке расположения курсора.
только-что проверил. Кажись всё в порядке.

улучшил код. Должен теперь быстрее работать, тк установка стиля и прозрачности теперь 1 раз при создании формы, а не каждый раз при показе
+ перезалил "наглядный пример"

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

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

Отправлено: 22:55, 05-12-2013 | #1629


SHVtYW4=


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

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


Цитата Johny777:
только-что проверил. Кажись всё в порядке. »
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
Compression=none
AppId=TheBestAppId
DisableWelcomePage=yes
DisableFinishedPage=yes
DisableDirPage=yes
DisableReadyPage=yes


[Components]
Name: a; Description: A


[Files]
Source: A.bmp; Flags: dontcopy nocompression


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

const
    UNDEF_INDEX = -777;
    ALPHA_BLEND_LEVEL = 128; // max=Byte=255

    WS_EX_LAYERED = $80000;
    WS_EX_TRANSPARENT = $20;
    LWA_COLORKEY = 1;
    LWA_ALPHA = 2;
    GWL_EXSTYLE = (-20);


var
    InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
    PicForm: TForm;


type
    COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';


procedure ShowPicHint(const PicFilePath: String);
var
    pt: TPoint;
begin
    if not GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with PicForm do
        begin
            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
            SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
            SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
            Show;
        end;
    finally
        SetFocus(WizardForm.Handle);
    end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
    UndefPic: String;
begin
    if Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case TNewCheckListBox(Sender).ItemCaption[Index] of
            'A': UndefPic := 'A.bmp';
        else
            begin
                LastIndex := UNDEF_INDEX;
                PicForm.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
        LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
    PicForm.Hide;
end;


procedure InitInfo();
begin
    WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
    PicForm := TForm.Create(WizardForm)
    with PicForm do
    begin
        BorderStyle := bsNone;
        FormStyle := fsStayOnTop;
        InfoPic := TBitmapImage.Create(PicForm)
        with InfoPic do
        begin
            Parent := PicForm;
            AutoSize := True;
        end;
    end;
end;


procedure InitializeWizard();
begin
    InitInfo();
end;

Да вот смотрю, в первый раз картинка появляется. Потом отвожу курсор, ещё раз навожу и уже не появляется.
При трёх компонентах нормально.

Dinvin4ester,
Если файлы разные
Код: Выделить весь код
[Files]
Source: Твой_файл1.exe; DestDir: {commondesktop}
Source: Твой_файл2.exe; DestDir: {commondesktop}
Если файл один и тот же
Код: Выделить весь код
[Files]
Source: Твой_файл.exe; DestDir: {commondesktop}; DestName: Твой_файл1.exe
Source: Твой_файл.exe; DestDir: {commondesktop}; DestName: Твой_файл2.exe

-------
09a468a9b4293cd82adf6d6c60a9da82 | Tm9yZGVr
В связи со сменой железа и переходом на LInux с полным отказом от Windows - посещение на форуме будет редким.

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

Отправлено: 23:16, 05-12-2013 | #1630



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




 
Переход