Hej!
Pobieram plik ze strony za pomoca funkcji URLDownloadToFile. Robie to w ten sposob i wszystko pieknie smiga:
URLDownloadToFile(nil,
'http://www.adres.eu/klient.zip',
PChar(ExtractFilePath(Application.ExeName) + 'pobieranie.zip'),
0,
nil);
chcialbym zrobic oczywiscie to bardziej bajerancko wiec probuje dodac progress bar. Znalazlem rozwiazanie na 4p ale dosc stare i pod Delphi. W zwiazku z tym przy kompilacji otrzymuje komunikaty o nierozpoznawaniu typow np. LPCWSTR czy PFormatEtc.
Czy mozecie mi pomoc przerobic ponizszy fragment zeby smigal pod lazarusem?
Rozwiazanie zaproponowane przez @Szczawik 12 lat temu :P
Jak ściągnąć plik z Internetu
uses
UrlMon, ActiveX.
type
TCallbackObject = class(TObject, IBindStatusCallBack)
public
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
function GetPriority(out nPriority): HResult; stdcall;
function OnLowResource(reserved: DWORD): HResult; stdcall;
function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult; stdcall;
function OnObjectAvailable(const IID: TGUID; punk: IUnknown): HResult; stdcall;
function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult; stdcall;
end;
W sekcji
var
Cancel: Boolean = False;
implementation
function TCallbackObject._AddRef: Integer;
begin
result:=S_OK;
end;
function TCallbackObject._Release: Integer;
begin
result:=S_OK;
end;
function TCallbackObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if(GetInterface(IID,Obj)) then
result:=S_OK
else
result:=E_NOINTERFACE;
end;
function TCallbackObject.OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult;
begin
result:=S_OK;
end;
function TCallbackObject.GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
begin
result:=S_OK;
end;
function TCallbackObject.OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
begin
result:=S_OK;
end;
function TCallbackObject.GetPriority(out nPriority): HResult;
begin
result:=S_OK;
end;
function TCallbackObject.OnLowResource(reserved: DWORD): HResult;
begin
result:=S_OK;
end;
function TCallbackObject.OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult;
begin
result:=S_OK;
end;
function TCallbackObject.OnObjectAvailable(const IID: TGUID; punk: IUnknown): HResult; stdcall;
begin
result:=S_OK;
end;
function TCallbackObject.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
begin
case ulStatusCode of
BINDSTATUS_FINDINGRESOURCE:
begin
Form1.Caption:='Nawiązywanie połączenia';
if (Cancel) then
begin
result:=E_ABORT;
exit;
end;
end;
BINDSTATUS_CONNECTING:
begin
if (Cancel) then
begin
Form1.Caption:='Anulowano!';
result:=E_ABORT;
exit;
end
else
Form1.Caption:='Łączenie..';
end;
BINDSTATUS_BEGINDOWNLOADDATA:
begin
Form1.ProgressBar1.Position:=0;
if (Cancel) then
begin
Form1.Caption:='Anulowano!';
result:=E_ABORT;
exit;
end
else
Form1.Caption:='Rozpoczynam pobieranie..';
end;
BINDSTATUS_DOWNLOADINGDATA:
begin
if (Cancel) then
begin
Form1.Caption:='Anulowano!';
result:=E_ABORT;
exit;
end
else
begin
Form1.ProgressBar1.Max:=ulProgressMax;
Form1.ProgressBar1.Position:=ulProgress;
Form1.Caption:='Trwa pobieranie ( '+inttostr(ulProgress div 1024)+'kB / '+inttostr(ulProgressMax div 1024)+'kB )';
end;
end;
BINDSTATUS_ENDDOWNLOADDATA:
begin
Form1.Caption:='Zakończono pobieranie danych';
end;
end;
Application.ProcessMessages;
result:=S_OK;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
CallBack:TCallbackObject;
begin
if Button1.Caption='Pobieraj' then
begin
Button1.Caption:='Anuluj';
CallBack := TCallBackObject.Create;
try
Form1.Caption:='Pobieranie zakończono kodem: '+inttostr( URLDownloadToFile(nil,'http://serwer/plik','dysk:\katalog\plik',0,CallBack) );
finally
CallBack.Free;
end;
end
else
Cancel:=TRUE;
end;