Форум: "Сети";
Текущий архив: 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