|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 7] |
|
Скрипты Inno Setup. Помощь и советы [часть 7]
|
Ветеран Сообщения: 1264 |
Профиль | Отправить PM | Цитировать
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Скрипты Inno Setup. Помощь и советы (Archive Pack 1):
Скрипты Inno Setup. Помощь и советы [часть 6] |
|
Отправлено: 11:48, 10-03-2014 |
Старожил Сообщения: 212
|
Профиль | Отправить PM | Цитировать Цитата icetanker:
[*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 := ExpandConstant('{userdesktop}\' + ExtractFileName(szURL)); if 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; |
|
------- Отправлено: 11:23, 15-12-2014 | #2171 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать а как сделать,чтобы сначала выполнялся блок CODE,когда скачивается файл,а потом Source: "1.ocx"; DestDir:"{sys}"; Flags:ignoreversion regserver
|
Отправлено: 12:21, 15-12-2014 | #2172 |
Старожил Сообщения: 212
|
Профиль | Отправить PM | Цитировать Цитата icetanker:
Можно сделать функцию, которая будет возвращать определённый результат, в зависимости от чего-то: |
|
------- Отправлено: 13:17, 15-12-2014 | #2173 |
Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать я правильно понял,у нас идет выполнение блоков,как они идут по коду общему?если я меняю блоки местами у меня этот блок так и пойдет?
|
Отправлено: 13:23, 15-12-2014 | #2174 |
Старожил Сообщения: 212
|
Профиль | Отправить PM | Цитировать Цитата icetanker:
Всё приведено на прикреплённом скрине. Секция кода всегда последняя, а сетапа - первая. |
|
------- Последний раз редактировалось kotyarko@fb, 15-12-2014 в 13:32. Отправлено: 13:27, 15-12-2014 | #2175 |
Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать а есть ли возможность вывести статус с регистрации ActiveX?
в Source в мануале про это не пишется,а хотелось бы понять регистрирует или нет? |
Последний раз редактировалось icetanker, 16-12-2014 в 09:20. Отправлено: 08:57, 16-12-2014 | #2176 |
Новый участник Сообщения: 17
|
Профиль | Сайт | Отправить PM | Цитировать Здравствуйте. Подскажите пожалуйста как изменить размер окна инсталлятора и как подогнать кнопки
|
Отправлено: 23:10, 16-12-2014 | #2177 |
Старожил Сообщения: 212
|
Профиль | Отправить PM | Цитировать Цитата Юрій_Окропірідзе@vk:
[*Code] Procedure InitializeWizard(); var HeigthAdv, WidthAdv: Integer; begin HeightAdv := 200; WidthAdv := 200; with WizardForm do begin Width := WizardForm.Width + WidthAdv; Height := WizardForm.Height + HeightAdv; NextButton.Top := .... + HeightAdv; NextButton.Left := .... + WidthAdv; CancelButton...... ..... end; end; |
|
------- Отправлено: 23:16, 16-12-2014 | #2178 |
Ветеран Сообщения: 517
|
Профиль | Отправить PM | Цитировать Юрій_Окропірідзе@vk, kotyarko@fb, добавлю, координаты правильней указывать так:
Чтобы потом невозникало проблем, типа: кнопка съехала, текст оказался не там, где должен быть и т.д. |
Отправлено: 23:32, 16-12-2014 | #2179 |
Старожил Сообщения: 212
|
Профиль | Отправить PM | Цитировать Цитата saurn:
Цитата saurn:
|
||
------- Отправлено: 00:19, 17-12-2014 | #2180 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Скрипты Inno Setup. Помощь и советы [часть 6] | El Sanchez | Автоматическая установка приложений | 2494 | 10-03-2014 11:51 | |
Скрипты 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 |
|