|
Вопрос # 4 253/ вопрос открыт / |
|
Здравствуйте, эксперты! C помощью wininet качаю файлы... узнаю размер так -
if HttpQueryInfo(hURL, HTTP_QUERY_CONTENT_LENGTH, @dwBuffer, dwBufferLen, dwIndex)
then s:= PChar(@dwBuffer);
иногда мне отображается размер как 56981448˜ с квадратиком в конце, но если брать без него то размер как раз тот что надо. Пожалуйста подскажите как с этим бороться? Заранее спасибо.
 |
Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 31 мая 2010, 18:30
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, eclipse!
при работе с сишными стоками есть святое правило - нужно выделять на один байт места больше и последний байт занулять (можно и все - так даже лучше).
Только в этом случе PChar(@dwBuffer); отработает так как нужно. А если это не делать, то возможны самые различные глюки - ведь PChar ищет конец строки по первому нулевому символу, а в некоторых случаях он может быть очень далеко. Вам просто везёт и его находит достаточно быстро.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 31 мая 2010, 18:37
|
Ответ #2. Отвечает эксперт: bugmenot
Бороться, как и всегда, чтением документации.
Функция на вход принимает размер буфера, а при выходе - кол-во байт в буфер записанных.
Следовательно:
if HttpQueryInfo(hURL, HTTP_QUERY_CONTENT_LENGTH, @dwBuffer, dwBufferLen, dwIndex) then
SetString(s, @dwBuffer, dwBufferLen);
Про терминатор (#0) тоже четко сказано.
Но это еще не всё - читаем дальше:
You can retrieve the following types of data from HttpQueryInfo:
...
DWORD (for STATUS_CODE, CONTENT_LENGTH, and so on, if HTTP_QUERY_FLAG_NUMBER has been used)
Таким образом всё сводится к передаче указателя на DWORD, SizeOf(DWORD) и вуаля, получаем целое значение.
 |
Ответ отправил: bugmenot (статус: 3-ий класс)
Время отправки: 31 мая 2010, 19:05
|
Мини-форум вопроса
Всего сообщений: 11; последнее сообщение — 2 июня 2010, 15:54; участников в обсуждении: 3.
|
eclipse (статус: Посетитель), 31 мая 2010, 18:44 [#1]:
Ага тоесть мне можно избежать Pchar... например FloatToStr ... верно?
|
|
min@y™ (статус: Доктор наук), 31 мая 2010, 18:54 [#2]:
Функция возвращает строку, так что никакой FloatToStr здесь рядом не стоит.
Просто перед вызовом делай
FillChar(dwBuffer, SizeOf(dwBuffer), 0);
Глянь сюда.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 31 мая 2010, 18:55 [#3]:
Хотя чёт фигню написал... подскажи пожалуйста свою мысль примерчиком
|
|
eclipse (статус: Посетитель), 31 мая 2010, 19:19 [#5]:
Ах да! ещё выдаёт иногда что размер равен 236
|
|
Вадим К (статус: Академик), 31 мая 2010, 19:20 [#6]:
для начала советую просто сделать на один байт больше буфер. Но функции передавать старый размер. А там будет видно.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 31 мая 2010, 19:32 [#8]:
Да я в курсе что это не ссылка я просто кинул её чтоб было понятно откуда брал... ссылки то меняются!
|
|
eclipse (статус: Посетитель), 31 мая 2010, 19:34 [#9]:
тут нарыл... if not HttpQueryInfo( hRequest, HTTP_QUERY_CONTENT_LENGTH, @lpBuf, dwBufLen, PDWORD( nil )^ ) then а если так? Немного изменив
|
|
eclipse (статус: Посетитель), 2 июня 2010, 15:54 [#11]:
Всё разобрался! "Дело было не в бабине"! Всё дело в том что я использую набор красивых компонентов (SUIPack) , так вот... во время того когда я узнавал размер файла размер выдавался как цифры с двоеточием в конце (узнал это когда попробывал засунуть результат размера в Label н.р. - 123456 , потом у меня в теле программы этот размер присваивался компоненту suiProgressBar как значение Max , а так как это не есть integer то у прогрессбара съезжала крыша и соответственно у всей программы... нашел из этого выход так - удалял просто последний знак, т.е. - : и всё заработало! программа теперь сосёт всё подряд, скачивает нормально и докачка тоже работает. вот только у меня есть подозрения что закачка работает из кэша (во время продолжения докачки прогрессбар и размер файла стоят на одном месте как раз столько же примерно времени сколько длилась скачка, а как только доходит до того момента где прервалась (по времени) сразу все идёт дальше) может пожскажет кто что делать с этой ерундой?
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|