Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2017, 13:13   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию WININET в VS2017

Чем больше приходится использовать VS C++, тем больше мне нравится Python.
Задача тривиальная по URL получить html разметку и записать в файл, взял пример http://rsdn.org/?article/inet/wininet.xml
В VS 2010 в свойствах проекта ставишь НАБОР СИМВОЛОВ - ИСПОЛЬЗОВАТЬ МНОГОБАЙТОВУЮ КОДИРОВКУ -все работает.
В VS 2017 при аналогичных действиях ошибка при компиляции //ОШИБКА идентификатор Lurl не определен
Что еще нужно сделать??????
Если знаете другой способ получить html разметку напишите!!!
Код:
#include "stdafx.h"
#include <windows.h>
#include <wininet.h>
#pragma comment(lib,"wininet")
#include <stdlib.h>
#include<fstream>
#include<iostream>
#include <string>
using namespace std;
void getHTML(string url)
{
	bool ok = false;
	// инициализируем WinInet
	HINTERNET hInternet =
		::InternetOpen(
			TEXT("WinInet Test"),
			INTERNET_OPEN_TYPE_PRECONFIG,
			NULL, NULL,
			0);

	if (hInternet != NULL) {
		HINTERNET hConnect =
			::InternetConnect(
				hInternet,
				TEXT(url),    //ОШИБКА идентификатор Lurl не определен
				INTERNET_DEFAULT_HTTP_PORT,
				NULL, NULL,
				INTERNET_SERVICE_HTTP,
				0,
				1u);
		if (hConnect != NULL) {
			HINTERNET hRequest =
				::HttpOpenRequest(
					hConnect,
					TEXT("GET"),
					TEXT(""),
					NULL,
					NULL,
					0,
					INTERNET_FLAG_KEEP_CONNECTION,
					1);
			if (hRequest != NULL) {
				BOOL bSend = ::HttpSendRequest(hRequest, NULL, 0, NULL, 0);
				if (bSend) {
					ofstream fnews("news.html", ios::out | ios::binary);
					if (fnews.is_open()) for (;;) {
						char  szData[1024];
						DWORD dwBytesRead;
						BOOL bRead =
							::InternetReadFile(
								hRequest,
								szData, sizeof(szData) - 1,
								&dwBytesRead);

						if (bRead == FALSE || dwBytesRead == 0)
							break;

						szData[dwBytesRead] = 0;
						fnews << szData;
						cout << szData;
						cout << "asd" << endl;
						ok = true;
					}
				}
				::InternetCloseHandle(hRequest);
			}
			::InternetCloseHandle(hConnect);
		}
		::InternetCloseHandle(hInternet);
	}
	if (ok)
		system("start news.html");
}
int main(int argc, char* argv[])
{

	getHTML("yandex.ru");
	getchar();
	return 0;
}
polin11 вне форума Ответить с цитированием
Старый 29.07.2017, 13:38   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от polin11 Посмотреть сообщение
void getHTML(string url)
Замените это на void getHTML(LPCTSTR url)

И не надо про "работает на 2010" - не будет это и там работать.
waleri вне форума Ответить с цитированием
Старый 29.07.2017, 13:47   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

В С++ константы многобайтовых строк должны быть с припиской L. типа: L"строка".
TEXT - макрос, вместо которого пишется L, если проект компилируется для юникода.
TEXT(url) в итоге превращается в Lurl, а такой переменной нет. string однобайтовый.
Опишите функцию так:
Код:
void getHTML(LPCTSTR url)
и передавайте url в InternetConnect без заворачивания в TEXT.
в main вот нужно будет переписать:
Код:
getHTML(TEXT("yandex.ru"));
Если и работало в другой версии, то там не выносилось в функцию с параметром и подключались к TEXT("yandex.ru"), а не к TEXT(url).
pu4koff вне форума Ответить с цитированием
Старый 29.07.2017, 17:04   #4
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

Исправил код, как Вы советовали, код скомпилировался,
запускаю в качестве URL пробовал yandex.ru (протокол https), mail.ru (протокол https),
rsdn.org (протокол http) и другие, переменная bSend имеет значение false.
В файл html разметка не записывается. Почему, что делаю неверно???
Код:
#include "stdafx.h"
#include <windows.h>
#include <wininet.h>
#pragma comment(lib,"wininet")
#include <stdlib.h>
#include<fstream>
#include<iostream>
#include <string>
using namespace std;


void getHTML(LPCTSTR url)
{
	bool ok = false;
	HINTERNET hInternet =
		::InternetOpen(
			TEXT("WinInet Test"),
			INTERNET_OPEN_TYPE_PRECONFIG,
			NULL, NULL,
			0);

	if (hInternet != NULL) {
		// открываем HTTP сессию
		HINTERNET hConnect =
			::InternetConnect(
				hInternet,
				url,
				INTERNET_DEFAULT_HTTP_PORT,
				NULL, NULL,
				INTERNET_SERVICE_HTTP,
				0,
				1u);
		if (hConnect != NULL) {
			// открываем запрос
			HINTERNET hRequest =
				::HttpOpenRequest(
					hConnect,
					TEXT("GET"),
					TEXT(""),
					NULL,
					NULL,
					0,
					INTERNET_FLAG_KEEP_CONNECTION,
					1);
			if (hRequest != NULL) {
				BOOL bSend = ::HttpSendRequest(hRequest, NULL, 0, NULL, 0); //bSend : false
				if (bSend) {
					ofstream fnews("news.html", ios::out | ios::binary);
					if (fnews.is_open()) for (;;) {
						char  szData[1024];
						DWORD dwBytesRead;
						BOOL bRead =
							::InternetReadFile(
								hRequest,
								szData, sizeof(szData) - 1,
								&dwBytesRead);

						if (bRead == FALSE || dwBytesRead == 0)
							break;
						szData[dwBytesRead] = 0;
						fnews << szData;
						cout << szData;
						cout << "asd" << endl;
						ok = true;
					}
				}
				::InternetCloseHandle(hRequest);
			}
			::InternetCloseHandle(hConnect);
		}
		::InternetCloseHandle(hInternet);
	}
	if (ok)
		system("start news.html");
}
int main(int argc, char* argv[])
{
	getHTML(TEXT("tensor.ru")); 
	getHTML(TEXT("mail.ru"));
	getHTML(TEXT("rsdn.org"));
	getchar();
	return 0;
}

Последний раз редактировалось polin11; 29.07.2017 в 17:06.
polin11 вне форума Ответить с цитированием
Старый 29.07.2017, 17:12   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Потому что вы ничего не просите от сервера. GET ЧТО?
p51x вне форума Ответить с цитированием
Старый 29.07.2017, 17:27   #6
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

А что мне передовать, как я понимаю например url=host+path, например
url="news.sportbox.ru/Vidy_sporta/Biatlon"
host="news.sportbox.ru"
path="/Vidy_sporta/Biatlon"
тогда
Код:
hConnect =::InternetConnect(hInternet, host, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0,1u);
hRequest =::HttpOpenRequest(hConnect,TEXT("GET"), path, NULL, NULL,0, INTERNET_FLAG_KEEP_CONNECTION,1);
Если url="yandex.ru", то
host="yandex.ru"
path="", поэтому
Код:
hRequest =::HttpOpenRequest(hConnect,TEXT("GET"), TEXT(""), NULL, NULL,0, INTERNET_FLAG_KEEP_CONNECTION,1);
polin11 вне форума Ответить с цитированием
Старый 29.07.2017, 17:33   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Если url="yandex.ru", то
Нет. Урл yandex.ru/

Цитата:
host="yandex.ru"
path="", поэтому
Корень "/", а не "". Читайте доки перед тем, как лезть.
p51x вне форума Ответить с цитированием
Старый 29.07.2017, 17:50   #8
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

ОК попробовал
url="yandex.ru", то
host="yandex.ru"
path="/" поэтому
hRequest =::HttpOpenRequest(hConnect,TEXT("G ET"), TEXT("/"), NULL, NULL,0, INTERNET_FLAG_KEEP_CONNECTION,1);
bSend - false
попробовал найти последнюю ошибку
DWORD dwErrCode = ::GetLastError();
dwErrCode =2 (ERROR_FILE_NOT_FOUND)
polin11 вне форума Ответить с цитированием
Старый 29.07.2017, 19:00   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вообщем, проверяйте что написали. Вместо TEXT используйте L.

Я только что проверил на яндексе и все работает. Вот файло из вашего кода полученное.
Вложения
Тип файла: 7z news.7z (22.0 Кб, 8 просмотров)
p51x вне форума Ответить с цитированием
Старый 30.07.2017, 05:54   #10
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

https://stackoverflow.com/questions/...ffline-enabled
Всем СПАСИБО, сделал IE браузером по умолчанию, флаг работать автономно не стоял, проставил, снял, все заработало
polin11 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при попытке создать проект в VS2017 - Visual Studio Hunter342 Общие вопросы по программированию, компьютерный форум 4 17.05.2017 06:18
Работа в WININET polin11 Общие вопросы C/C++ 0 09.05.2017 22:19
WinInet [CACHE] Win Api 11 28.06.2011 21:52
WinInet vitalik007 Работа с сетью в Delphi 1 14.10.2007 13:09