| 
| 
 | Вопрос # 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 то у прогрессбара съезжала крыша и соответственно у всей программы... нашел из этого выход так - удалял просто последний знак, т.е. - : и всё заработало! программа теперь сосёт всё подряд, скачивает нормально и докачка тоже работает. вот только у меня есть подозрения что закачка работает из кэша (во время продолжения докачки прогрессбар и размер файла стоят на одном месте как раз столько же примерно времени сколько длилась скачка, а как только доходит до того момента где прервалась (по времени) сразу все идёт дальше) может пожскажет кто что делать с этой ерундой? |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |