Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 253

/ вопрос открыт /

Здравствуйте, эксперты! C помощью wininet качаю файлы... узнаю размер так -
if HttpQueryInfo(hURL, HTTP_QUERY_CONTENT_LENGTH, @dwBuffer, dwBufferLen, dwIndex)
then s:= PChar(@dwBuffer);

иногда мне отображается размер как 56981448˜ с квадратиком в конце, но если брать без него то размер как раз тот что надо. Пожалуйста подскажите как с этим бороться? Заранее спасибо.

eclipse Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

eclipse (статус: Посетитель), 31 мая 2010, 18:44 [#1]:

Ага тоесть мне можно избежать Pchar... например FloatToStr ... верно?
min@y™

min@y™ (статус: Доктор наук), 31 мая 2010, 18:54 [#2]:

Функция возвращает строку, так что никакой FloatToStr здесь рядом не стоит.
Просто перед вызовом делай
FillChar(dwBuffer, SizeOf(dwBuffer), 0);
Глянь сюда.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 31 мая 2010, 18:55 [#3]:

Хотя чёт фигню написал... подскажи пожалуйста свою мысль примерчиком
eclipse

eclipse (статус: Посетитель), 31 мая 2010, 19:08 [#4]:

В общем не получилось... Я пытаюсь скачать архив отсюда http://letitbit.net/download/5164.59203f1a8e9eb7faeeb261bbb/BestMixedWallpapersPack28.rar.html и у меня выдаёт вот такой размер (выше указан), хотя другие скачивал нормально, но вот такая свинья иногда бывает! Бляха-муха уже и с докачкой всё нормально... почти всё работает как надо тока вот такая фигня... мож дело то в скачиваемом файле??? Подскажите!
eclipse

eclipse (статус: Посетитель), 31 мая 2010, 19:19 [#5]:

Ах да! ещё выдаёт иногда что размер равен 236
Вадим К

Вадим К (статус: Академик), 31 мая 2010, 19:20 [#6]:

для начала советую просто сделать на один байт больше буфер. Но функции передавать старый размер. А там будет видно.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 31 мая 2010, 19:29 [#7]:

http://letitbit.net/download/5164.59203f1a8e9eb7faeeb261bbb/BestMixedWallpapersPack28.rar.html - не есть ссылка на архив.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 31 мая 2010, 19:32 [#8]:

Да я в курсе что это не ссылка я просто кинул её чтоб было понятно откуда брал... ссылки то меняются!
eclipse

eclipse (статус: Посетитель), 31 мая 2010, 19:34 [#9]:

тут нарыл... if not HttpQueryInfo( hRequest, HTTP_QUERY_CONTENT_LENGTH, @lpBuf, dwBufLen, PDWORD( nil )^ ) then а если так? Немного изменив
eclipse

eclipse (статус: Посетитель), 31 мая 2010, 19:49 [#10]:

К стати вот ещё http://forum.sources.ru/index.php?showtopic=198995
особенно заинтересовала вот эта строчка - InternetSetFilePointer(FRequest, 0, nil, FILE_END, 0); входе промотра будет понятна!!!
eclipse

eclipse (статус: Посетитель), 2 июня 2010, 15:54 [#11]:

Всё разобрался! "Дело было не в бабине"! Всё дело в том что я использую набор красивых компонентов (SUIPack) , так вот... во время того когда я узнавал размер файла размер выдавался как цифры с двоеточием в конце (узнал это когда попробывал засунуть результат размера в Label н.р. - 123456:), потом у меня в теле программы этот размер присваивался компоненту suiProgressBar как значение Max , а так как это не есть integer то у прогрессбара съезжала крыша и соответственно у всей программы... нашел из этого выход так - удалял просто последний знак, т.е. - : и всё заработало! программа теперь сосёт всё подряд, скачивает нормально и докачка тоже работает. вот только у меня есть подозрения что закачка работает из кэша (во время продолжения докачки прогрессбар и размер файла стоят на одном месте как раз столько же примерно времени сколько длилась скачка, а как только доходит до того момента где прервалась (по времени) сразу все идёт дальше) может пожскажет кто что делать с этой ерундой?

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.03 сек.