Главная страница
    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.46 MB
Время: 0.072 c
1-1111010081
GanibalLector
2005-03-17 00:54
2005.03.27
TStringList


9-1104594267
Xenon
2005-01-01 18:44
2005.03.27
Опаньки посмотрите


3-1109583378
wolf2541
2005-02-28 12:36
2005.03.27
Не работает etoCanNavigation в dxDbTreeList


1-1110424363
SerKom
2005-03-10 06:12
2005.03.27
Как узнать, есть ли обработчик события у компонента?


1-1110540052
Володя
2005-03-11 14:20
2005.03.27
ProcessTerminate





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский