Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / WININET в VS2017 / 10 сообщений из 10, страница 1 из 1
29.07.2017, 13:20
    #39496992
polin11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WININET в VS2017
Чем больше приходится использовать VS C++, тем больше мне нравится Python.
Задача тривиальная по URL получить html разметку и записать в файл, взял пример http://rsdn.org/?article/inet/wininet.xml
В VS 2010 в свойствах проекта ставишь НАБОР СИМВОЛОВ - ИСПОЛЬЗОВАТЬ МНОГОБАЙТОВУЮ КОДИРОВКУ -все работает.
В VS 2017 при аналогичных действиях ошибка при компиляции //ОШИБКА идентификатор Lurl не определен
Что еще нужно сделать??????
Если знаете другой способ получить html разметку напишите!!!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
#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;
}
...
Рейтинг: 0 / 0
29.07.2017, 13:51
    #39496996
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WININET в VS2017
сразу скажу, что я не пользуюсь в свой практике классом string (ибо он крайне неудобен для меня), но мне думается, что объект url - это класс string и использовать макрос TEXT с этим классом не получится.

Нужно, либо переконвертировать string в wstring и потом передавать ее без TEXT, либо сконвертировать ulr.c_str() в wchar_t* и тоже передавать его без TEXT. Либо использовать ANSI версию функции InternetConnect, то есть InternetConnectA, если таковая вообще существует, тут надо смотреть как она объявлена в <wininet.h>. Но опять же макрос TEXT в данном случае лишний.

По конвертации см. Какой извращенец писал MessageBoxW? ,
первый пост, в спойлере куча функций для конвертации строк
...
Рейтинг: 0 / 0
29.07.2017, 13:56
    #39496997
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WININET в VS2017
Еще один вариант

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
void getHTML(LPCTSTR lpUrl)
{
	...
	...
	if (hInternet != NULL) {
		HINTERNET hConnect =
			::InternetConnect(
				hInternet,
				lpUrl,
				INTERNET_DEFAULT_HTTP_PORT,
				NULL, NULL,
				INTERNET_SERVICE_HTTP,
				0,
				1u);
	...
	...
}

int main(int argc, char* argv[])
{

	getHTML(TEXT("yandex.ru"));
	getchar();
	return 0;
}
...
Рейтинг: 0 / 0
29.07.2017, 14:05
    #39496998
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WININET в VS2017
polin11,

макрос TEXT -он для строковых/символьных литералов (если определён UNICODE - добавляет к литералу префикс L)
с переменной - смысла не имеет.
многобайтовая кодировка - это не UNICODE

префикс L - приписался- проект юникодный

варианты:
вместо std::string - использовать std::wstring,
преобразовать string к unicode,
явно использовать ANSI версию InternetOpenA
...
Рейтинг: 0 / 0
29.07.2017, 17:07
    #39497021
polin11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WININET в VS2017
Исправл код, как Вы советовали, код скомпилировался,
запускаю в качестве URL пробовал yandex.ru (протокол https), mail.ru (протокол https),
rsdn.org (протокол http) и другие, переменная bSend имеет значение false.
В файл html разметка не записывается. Почему, что делаю неверно???
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
#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;
}
...
Рейтинг: 0 / 0
29.07.2017, 17:25
    #39497023
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WININET в VS2017
polin11,

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384247(v=vs.85).aspx
устанавливает код ошибки, если вернула FALSE, его можно получить вызвав ::GetLastError();

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
BOOL bSend = ::HttpSendRequest(hRequest, NULL, 0, NULL, 0); //bSend : false
if (bSend) 
{
	....
}
else
{
	DWORD dwErrCode = ::GetLastError();
	// анализируем, разбираемся, читаем документацию к функции, изучаем что она хочет и как это должно быть
}
...
Рейтинг: 0 / 0
29.07.2017, 17:28
    #39497025
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WININET в VS2017
вангую -
в url - полный url



в InternetConnect нужно передавать имя хоста
в HttpOpenRequest - только путь и querystring ( или просто / )

на MSDN полно примеров
...
Рейтинг: 0 / 0
29.07.2017, 17:40
    #39497026
polin11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WININET в VS2017
dwErrCode = 2
исходя из
https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx
2 ERROR_FILE_NOT_FOUND

А что мне передовать, как я понимаю например url=host+path, например
url="news.sportbox.ru/Vidy_sporta/Biatlon"
host="news.sportbox.ru"
path="/Vidy_sporta/Biatlon"
тогда
Код: plaintext
1.
2.
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="", path="/" поэтому
Код: plaintext
1.
2.
3.
hRequest =::HttpOpenRequest(hConnect,TEXT("GET"), TEXT(""), NULL, NULL,0, INTERNET_FLAG_KEEP_CONNECTION,1);
или
hRequest =::HttpOpenRequest(hConnect,TEXT("GET"), TEXT("/"), NULL, NULL,0, INTERNET_FLAG_KEEP_CONNECTION,1);


dwErrCode = 2
...
Рейтинг: 0 / 0
29.07.2017, 18:24
    #39497029
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WININET в VS2017
polin11,

запустил Ваш пример - всё работает
...
Рейтинг: 0 / 0
30.07.2017, 05:51
    #39497133
polin11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WININET в VS2017
https://stackoverflow.com/questions/18611274/httpsendrequest-returns-failure-error-code-2-when-work-offline-enabled
Всем СПАСИБО, сделал IE браузером по умолчанию, флаг работать автономно не стоял, проставил, снял, все заработало
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / WININET в VS2017 / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]