PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [35] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

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

alert30
22-08-2012, 18:42
InnoTools Downloader »
Вы об этом?
http://www.sherlocksoftware.org/innotools/images/itd_ui.png

Johny777
22-08-2012, 19:20
Как добавить проценты удаления на деинсталлятор... »

[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;


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

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

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

возможно ли через Inno подкачать недастающие файлы через интернет, не прибегая, к примеру "InnoTools Downloader " »
эту тему почитай
в сообщении El Sanchez - а найдёшь!
Возможно ли запустить инсталлятор только при подключении к интернет? »
в шапке пример "IsInternetActive.iss"
впиши в него заместо процедуры InitializeWizard();
это:

function InitializeSetup(): Boolean;
begin
if IsInternetActive() then Result := True else
begin
MsgBox('Отсутствует соединение с интернетом. Бывай!', mbError, MB_OK);
Result := False;
end;
end;

Ivan_009
22-08-2012, 19:47
Johny777, Спасибо выручил... :up

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

Respin
23-08-2012, 11:19
Вы об этом?
http://www.sherlocksoftware.org/inno...ges/itd_ui.png »
Да, я именно это и имел в виду.

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

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

Johny777
23-08-2012, 11:55
но всплывает окно о запросе подключения »
какое окно?
Можно ли обойтись без окна сохранить как? »
не знаю
код покажи! (код под тегами твой код )

Respin
23-08-2012, 12:58
какое окно? »
Запускается инсталлятор, проверяет нет ли интернет, интернета нет, появляется окно (http://img705.imageshack.us/img705/5773/30174927.jpg) о запросе подключения. Только после отказа в подключении появляется сообщение, что интернета нет и на этом действие заканчивается. Соответсвенно, интернет есть - ничего не появляется, инсталлятор просто запускается.

По поводу окна о запросе сохранения файла:
Скрипт, как ты и сказал: в сообщении El Sanchez находится на этой (http://forum.oszone.net/post-1930003.html#post1930003) странице (второй сверху). Может ты имел в виду другой код, но я нашёл только его.
[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;

За открытие окна (http://img196.imageshack.us/img196/2709/85626360.jpg) о сохранении отвечает строка: GetSaveFileName('Сохранить как...', fName, '', '*' + ExtractFileExt(fName), ExtractFileExt(fName)) И если её убрать, то файл сохраняется рядом с exe-ешником.

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

Ivan_009
24-08-2012, 12:38
Помогите соеденить 2 скрипта чето неполучается... :sorry:

Ivan_009
24-08-2012, 13:07
Johny777, В твоем примере почемуто до 100 процентов не доходит все время поразному то 93 то 85

Vista-w
24-08-2012, 13:16
Подскажите пожалуйста как убрать два русских языка и списка? цель: оставить только русский и английский, если в строке [Languages] закомментить русский, то появляется ошибка, из за месседжей, которые написаны под версию языка.
http://i43.fastpic.ru/big/2012/0824/59/8bcc4ac1a48446833d49c10ffba04359.png

Johny777
24-08-2012, 13:19
Ваня, ты на код посмотри
UPercentsLabel.Caption := IntToStr(UninstallProgressForm.ProgressBar.Position) + ' %';
текст лейбла := переводим целое число в строковое(позиция прогресс бара деинсталятора) + ' %'
а теперь подумай проценты ли не доходят до 100% или твой прогрессбар?
к тому же в таймере эта функция с переводом числа обновляется каждые 10 милисекунд (в секунде 1000)
UPercentsTimer:= SetTimer(UninstallProgressForm.Handle, 0, 10, CallbackAddr('UPercentsProc'));
поставь одну если хочешь

Vista-w,
покажи всю секцию [Languages]

Ivan_009
24-08-2012, 14:33
Johny777, Чтобы проценты равномерно шли и до 100 процентов... :biggrin:

Gnom_aka_Lexander
24-08-2012, 14:40
поставь одну если хочешь »
В любом случае, ввиду особенностей системы, практически невозможно использовать интервал менее 30-40 миллисекунд, соответственно минимальный интервал зависти уже от мощности компьютера. Отсюда и беда с процентами, когда
почемуто до 100 процентов не доходит все время поразному то 93 то 85 »
Просто, когда прогрессбар приходит к концу, он попадает внутрь времени обновления и проценты не успевают обновиться.

Vista-w
25-08-2012, 13:39
Johny777,
вот
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Languages\English.isl

Ivan_009
25-08-2012, 14:17
Johny777, Как исправить вокруг кнопок обводку и при нажатии кнопки сьезжают вниз :(

Ivan_009
25-08-2012, 16:45
Vista-w, так попробуй...
Name: russian; MessagesFile: compiler:Languages\Russian.isl
Name: english; MessagesFile: compiler:Languages\English.isl

alert30
25-08-2012, 18:09
Vista-w, покажи код.

Vista-w
25-08-2012, 18:25
...

Ivan_009
25-08-2012, 18:29
Vista-w, у тебя 2 секции [Languages] убери одну... :yes:




© OSzone.net 2001-2012