Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Проблема с установкой callback-функции на функцию WinInet...   Найти похожие ветки 

 
AlexG ©   (2005-01-27 15:10) [0]

Я хочу скачать файл с FTP-сервера, но при этом мне нужно контролировать состояние закачки. Для этого я использую ф-цию InternetReadFile. Чтобы получать состояние я хотел использовать такую ф-цию:

type
 PDWORD = ^DWORD;
...
procedure StatusUpload(hInternet: HINTERNET;
                      dwContext: PDWORD;
                      dwInternetStatus: DWORD;
                      lpvStatusInformation: pointer;
                      dwStatusInformationLength: DWORD); stdcall; far;
begin
{l - это TLabel, указатель на экземпляр метки на форме}
        l.Caption := l.Caption + "0!"; {просто, чтобы видно было}
end;


Ее я попытался установить с помощью ф-ции:


typedef void (CALLBACK *INTERNET_STATUS_CALLBACK)(
HINTERNET hInternet,
DWORD_PTR dwContext,
DWORD dwInternetStatus,
LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength
);

InternetSetStatusCallback(HINTERNET hInternet, INTERNET_STATUS_CALLBACK lpfnInternetCallback);


таким образом:


FSession := InternetOpen("FTPUpdater", INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

FFTP := InternetConnect(FSession,pchar(Host),INTERNET_DEFAULT_FTP_PORT,nil,nil,INTERNET_SERVICE_FTP,INTERNET_FLAG_RELOAD,0);

hFile := FtpOpenFile(FFTP, pchar(TransferFiles.Remote), GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 0);

{InternetSetStatusCallback(FSession, @StatusUpload);
InternetSetStatusCallback(FFTP, @StatusUpload);}

InternetSetStatusCallback(hFile, @StatusUpload);


Но при чтении файла я не получаю того события, которое хотел бы видеть, т.е. изменения надписи. А если ставлю брекпоинт в StatusUpload, то он не срабатывает. Читаю так:


  dwBytesRead := 0;
  bufsize := READ_BUFFERSIZE;
  buffer := stralloc(READ_BUFFERSIZE+1);

  while (bufsize > 0) do
  begin
     if not InternetReadFile(hFile, buffer, READ_BUFFERSIZE, bufsize) then
     begin
        ErrCode := GetLastError;
        raise ETransferFileError.Create(ErrCode);
     end;
     if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then
        blockwrite(LocalFile, buffer, bufsize);
     dwBytesRead := dwBytesRead + bufsize;
     frmGUI.Gauge.Progress := dwBytesRead;
  end;


Сейчас меня не устраивает, что заполнение прогресбара frmGUI.Gauge не соответствует реальной ситуации.

Посоветуйте, как мне организовать работу callback-функции, чтобы получить прогресбар, реально показывающий кол-во скачанной информации?


 
Eraser ©   (2005-01-27 15:31) [1]

Правильно построить алгоритм расчёта прогресса.


 
Соискатель   (2005-01-27 15:41) [2]

//Eraser ©   (27.01.05 15:31) [1]
Проблема вся в том, что скачивание происходит асинхронно. Нужно callback-функцию использовать для реального отображения состояния...


 
AlexG ©   (2005-01-27 15:43) [3]

Оппа!!! Забыл стереть имя :)))


 
AlexG ©   (2005-01-27 16:45) [4]

hFile := FtpOpenFile(FFTP, pchar(TransferFiles.Remote), GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, <>0);

Нужно чтобы параметр последний не равнялся 0. Тогда вызывается. Я понял.



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.033 c
1-1110875571
awk
2005-03-15 11:32
2005.03.27
Как сделать форму


9-1101050960
-=OpeR=-
2004-11-21 18:29
2005.03.27
Поиск кратчайшего растояния


1-1110441078
lipskiy
2005-03-10 10:51
2005.03.27
Глючит ImageList


1-1110901761
xsh
2005-03-15 18:49
2005.03.27
Stringgrid и Edit


4-1108496540
Коля
2005-02-15 22:42
2005.03.27
Как програмно убрать "Только чтение" в свойствах файла?