-
Может кто нибудь подскажет возможно ли это??? И если да то подскажите как. Отправка данных идет примерно так: hInternet := InternetOpen(PChar(FClientName),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
If hInternet <> nil then begin
hConnect := InternetConnect(hInternet,PChar(FSiteHost),INTERNET_DEFAULT_HTTP_PORT,'anonymous ',nil,INTERNET_SERVICE_HTTP,0,0);
If hConnect <> nil then begin
hRequest := HTTPopenRequest(hConnect,PChar('POST'),PChar(FScriptURL),nil,nil,nil,INTERNET_FL AG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD,0);
If hRequest <> nil then begin
If FParameters <> '' then begin
Header := 'Content-Type: application/x-www-form-urlencoded';
MyResult := HTTPsendRequest(hRequest,PChar(Header),Length(Header),PChar(FParameters),Length( FParameters));
end else MyResult := HTTPsendRequest(hRequest,nil,0,nil,0);
. . . Проблема в том, что данные отправляются методом POST и могут быть большого размера (до 40 МБ)... И ясно дело хотелось бы что бы пользователь был проинформирован о количестве отправленных данных (даже банальным progressbar'ом)...
-
Без доп.выкрутасов, пожалуй, никак. Если нет возможности отказаться от wininet-функций в пользу иных средств (предоставляющих такого рода контроль), то можно посоветовать реализовать в программе простейший локальный прокси с функцией портмаппера, через который прогонять весь свой wininet-траффик и который позволит контролировать потоки передаваемых/принимаемых данных.
-
Хотя вру, причем нагло)
Есть в wininet такой механизм. См. InternetSetStatusCallback()
-
К сожалению чой-то не получается... или я чего то не пойму... делю так:
procedure Callback(hInet: HINTERNET; dwContext: DWORD; dwInternetStatus: DWORD; lpvStatusInformation: Pointer; dwStatusInformationLength: DWORD); stdcall;
var
St : String;
begin
St := '1'; end;
. . .
hInternet := InternetOpen(PChar(FClientName),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
If hInternet <> nil then begin
InternetSetStatusCallback(hInternet, INTERNET_STATUS_CALLBACK(@Callback));
hConnect := InternetConnect(hInternet,PChar(FSiteHost),INTERNET_DEFAULT_HTTP_PORT,'anonymous ',nil,INTERNET_SERVICE_HTTP,0,0);
If hConnect <> nil then begin
hRequest := HTTPopenRequest(hConnect,PChar('POST'),PChar(FScriptURL),nil,nil,nil,INTERNET_FL AG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD,0);
If hRequest <> nil then begin
(@Callback));
If FParameters <> '' then begin
Header := 'Content-Type: application/x-www-form-urlencoded';
MyResult := HTTPsendRequest(hRequest,PChar(Header),Length(Header),PChar(FParameters),Length( FParameters));
end else MyResult := HTTPsendRequest(hRequest,nil,0,nil,0);
. . .
И по debug'у не зажодит в функцию Callback никогда... Может кто чего нить подскажет???
-
Ты справку к упомянутой функции внимательно читал ?
Там ведь четко описаны условия для работы функции (см. параметры вызова InternetOpen)
Ты эти условия не соблюдаешь, вот оно и не полачается)
-
> Сергей М. (29.11.2007 12:43:04) [4]
Кроме того значение в функции не используется, оптимизатор выкинет.
-
Такс... с этим вроде разобрались!!! Функция вызывается... (оказывается при вызове нужно было dwContex ставить не нулевой!!!)
Вот теперь вопрос по существу...
Мне нужно получать кол-во отправленных на сервер байт. По описанию функции мне подходят вот какие статусы:
INTERNET_STATUS_REQUEST_COMPLETE (это когда закончилась отправка) INTERNET_STATUS_REQUEST_SENT (это когда полностью отправлен запрос и в lpvStatusInformation ссылка на DWORD содержащий кол-во отправленных байт) INTERNET_STATUS_SENDING_REQUEST (это во время отправки... но lpvStatusInformation = NULL ????? )
И вот собственно говоря и вопрос... так как и при каком статусе мне получить кол-во отправленных байт на текущий момент вызова функции Callback???
-
Фиг его знает ..
Я не пользовал эту фичу, ничего сказать по этому поводу не могу.
Гугли по теме INTERNET_STATUS_SENDING_REQUEST, думаю, найдешь то что ищешь.
-
> WStealth (29.11.2007 13:15:06) [6]
А в каком тебе нужно, все три правильные.
-
То что правильные - это точно!!!
Только вот мне нужно во время отправки писать кол-во отправленных байт (или же progressBar), т.е. статусы INTERNET_STATUS_REQUEST_COMPLETE и INTERNET_STATUS_REQUEST_SENT - мне не подходят, т.к. в INTERNET_STATUS_REQUEST_COMPLETE вообще данных никаких нет (статус сигнализирует об окончании отправки запроса), а в INTERNET_STATUS_REQUEST_SENT данные есть, но они - это размер всего отправленного пакета.
А в INTERNET_STATUS_SENDING_REQUEST нет никаких данных о размере переданных данных.
-
> WStealth (29.11.2007 13:27:09) [9]
Если отправленых, но еще не закончено, то это прошедшие время, это в переводе на английский получается SEND. И расшифруй что ты имеешь в виду под </>размер всего отправленного пакета.
-
неа... INTERNET_STATUS_REQUEST_SENT возвращает полный размер всего отправленного пакета...
В общем ничего не получается...
Буду наверное через Indy отправлять... :о(
-
> Буду наверное через Indy отправлять
Шило на мыло менять ?)
Проще и надежней сочинить локальный прокси-портмэппер (на базе, скажем, проверенных временем TTCPClient/Server или TClient/ServerSocket), как я тебе и советовал вначале.
-
> WStealth (29.11.2007 13:46:11) [11]
А может стоит освоить WinInet, Инди освоить сложнее.
-
вопрос решен? автор изначально неправильно подошел к отправке. если интересно - могу разъяснить
-
> если интересно - могу разъяснить
Интересно. Разъясни. Всё-таки, форум читают не только авторы.
-
-
Удалено модератором
-
Удалено модератором
-
2
-
Удалено модератором
|