Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 05.09.2019, 13:48   #1
Рурик
Пользователь
 
Регистрация: 05.09.2019
Сообщений: 25
По умолчанию Последовательность байтов, возвращаемых InternetReadFile

Привет всем. У меня задача извлечь с сайта некоторый текст и отобразить его на мониторе.
Я извлекаю текст с помощью этих трех функций:
InternetOpen
InternetOpenUrl
InternetReadFile

InternetReadFile возвращает такие байты с сайта, что не известно, что с этими байтами делать.
Если я просто копирую html-содержимое с сайта, затем вставляю в Notepad++, сохраняю файл, затем извлекаю байты из файла с помощью своей программы, то последовательность байтов другая и с ними уже что-то да получается сделать.

Как извлечь с сайта байты в таком виде, чтобы с ними можно было что-то сделать?
Интересует именно этот сайт, а не любой, т.к. проблема именно с этим сайтом, с другими сайтами такой проблемы нет.

Прикладываю два файла с байтами. Одни байты получены с помощью "InternetReadFile", вторые я скопировал вручную (Ctrl+C, Ctrl+V) и вставил в Notepad++.

Про функцию "URLDownloadToFile" мне известно. У меня вопрос по функции "InternetReadFile".
Вложения
Тип файла: zip Байты.zip (92.8 Кб, 15 просмотров)

Последний раз редактировалось Alex11223; 10.09.2019 в 12:46.
Рурик вне форума Ответить с цитированием
Старый 07.09.2019, 21:33   #2
Omatic
Новичок
Джуниор
 
Регистрация: 07.09.2019
Сообщений: 1
По умолчанию

Извините, не смотрел по ссылке включая ваш пакет - попахивает пиаром.
Так вот, скорее всего, если вы работаете с функцией не предназначенной
для работы с Много байтовой кодировкой вы получите что-то подобное
"W E L C O M E" вместо "Добро пожаловать".

Грузить страницы можно так
Код:
#define WIN32_LEAN_AND_MEAN
#pragma comment(lib, "urlmon.lib")
#include <iostream>
#include <urlmon.h>
 
int main()
{
    if(S_OK==URLDownloadToFile(0, "http://programmersforum.ru", "index.htm", 0, 0))
        std::cout << "Page download\n";
    else
        std::cout << "Failed\n";
    return 0;
}
Omatic вне форума Ответить с цитированием
Старый 07.09.2019, 21:37   #3
Рурик
Пользователь
 
Регистрация: 05.09.2019
Сообщений: 25
По умолчанию

А что делать с функцией "InternetReadFile"? Отказаться от её использования? Это бракованная функция?
Рурик вне форума Ответить с цитированием
Старый 10.09.2019, 12:48   #4
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,487
По умолчанию

Использовать нормальный HTTP клиент.

Например, libcurl.
Alex11223 на форуме Ответить с цитированием
Старый 10.09.2019, 13:22   #5
Рурик
Пользователь
 
Регистрация: 05.09.2019
Сообщений: 25
По умолчанию

А InternetReadFile считается ненормальным? Его ведь сделали в Microsoft'е, а не какой-то программист-самоучка.
Получается, что InternetReadFile изменяет извлеченные байты. Сначала InternetReadFile извлекает байты, затем внутренний механизм функции "InternetReadFile" изменяет байты и выдает их.
Рурик вне форума Ответить с цитированием
Старый 10.09.2019, 13:37   #6
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,487
По умолчанию

Ну как минимум это менее удобно.
И может быть не поддерживает что-то новое.

Вообще еще надо не забывать заголовки выставлять. Например, может какой-нибудь сервер блокирует по стандартным юзерагентам ботов (или другим заголовкам не похожими на браузеры).
Alex11223 на форуме Ответить с цитированием
Старый 10.09.2019, 13:42   #7
Рурик
Пользователь
 
Регистрация: 05.09.2019
Сообщений: 25
По умолчанию

Насколько я начинаю понимать, любая библиотека или еще что-то сделана на основе Win32 api-функций. В том числе и libcurl тоже использует Win32 api-функции.

Значит libcurl использует "URLDownloadToFile".

Alex11223, можете скачать байты с сайта, который указан в первом посте, с помощью "libcurl" и посмотреть, все ли нормально?
У меня нет возможности протестировать "libcurl".

Последний раз редактировалось Alex11223; 10.09.2019 в 14:09.
Рурик вне форума Ответить с цитированием
Старый 10.09.2019, 14:08   #8
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,487
По умолчанию

Цитата:
Сообщение от Рурик Посмотреть сообщение
Значит libcurl использует "URLDownloadToFile".
Нет, там же есть более низкоуровневые функции (сокеты и т.д.) не привязанные к HTTP.

Цитата:
Сообщение от Рурик Посмотреть сообщение
можете скачать байты с сайта, который указан в первом посте,
нет, он и в браузере не работает.
Alex11223 на форуме Ответить с цитированием
Старый 10.09.2019, 15:24   #9
Рурик
Пользователь
 
Регистрация: 05.09.2019
Сообщений: 25
По умолчанию

Alex11223, а что вы скачивали? В первом посте ссылки на сайт удалили.

Всё, вижу, вы и удалили ссылки.
У меня открывается этот сайт в браузере. Если бы сайт не открывался в браузерах, я бы не создал этой темы.
И есть другие инструменты для скачивания по HTTP, они нормально скачивают, в том числе и "URLDownloadToFile".

Alex11223, а сокеты это что такое? Тоже Win32 API функции или совсем другое?
Кто их сделал эти сокеты? В Microsoft'е?
Официальный сайт сокетов есть?

По сути нужно скачать байты в исходном виде, без каких-либо преобразований. Я так понимаю это делает "URLDownloadToFile". Но "URLDownloadToFile" сохраняет в файл. А у меня нет задачи скачать в файл, а нужно отобразить данные на мониторе.

Последний раз редактировалось Alex11223; 10.09.2019 в 16:20.
Рурик вне форума Ответить с цитированием
Старый 10.09.2019, 16:18   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 5,976
По умолчанию

Цитата:
Сообщение от Рурик Посмотреть сообщение
Но "URLDownloadToFile" сохраняет в файл
Ну возьмите URLOpenBlockingStream(), только на мой взгляд через InternetReadFile будет проще.
waleri вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где посмотреть список ошибок, возвращаемых PathFileExistsA? Korshi Win Api 16 30.04.2019 19:42
Проблема с InternetReadFile. FULEREN Общие вопросы C/C++ 7 21.12.2014 11:56
InternetReadFile не читает архивы questy Win Api 3 24.08.2013 11:03
Просуммировать последовательность байтов в цикле deman_sibir Assembler - Ассемблер 0 10.09.2012 18:04
Последовательность из 6 символов (байтов), размещённых в сегменте данных, записать в обратном порядке Batyrin Assembler - Ассемблер 2 03.06.2011 15:48