Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Вниз

Проблема с установкой 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.033 c
1-1110372935
Green_Templar
2005-03-09 15:55
2005.03.27
Самооптимизация


6-1106575071
Progh
2005-01-24 16:57
2005.03.27
Сохранить вложение из idMessage


4-1108324162
jackz
2005-02-13 22:49
2005.03.27
Как бороться с региональными настройками?


1-1111052504
Gerakl
2005-03-17 12:41
2005.03.27
Delphi2005 (IDE)


14-1109935545
boriskb
2005-03-04 14:25
2005.03.27
Молдавия





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский