powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / WININET в VS2017
10 сообщений из 10, страница 1 из 1
WININET в VS2017
    #39496992
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чем больше приходится использовать 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
WININET в VS2017
    #39496996
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сразу скажу, что я не пользуюсь в свой практике классом string (ибо он крайне неудобен для меня), но мне думается, что объект url - это класс string и использовать макрос TEXT с этим классом не получится.

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

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

Код: 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
WININET в VS2017
    #39496998
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

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

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

варианты:
вместо std::string - использовать std::wstring,
преобразовать string к unicode,
явно использовать ANSI версию InternetOpenA
...
Рейтинг: 0 / 0
WININET в VS2017
    #39497021
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исправл код, как Вы советовали, код скомпилировался,
запускаю в качестве 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
WININET в VS2017
    #39497023
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
WININET в VS2017
    #39497025
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вангую -
в url - полный url



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

на MSDN полно примеров
...
Рейтинг: 0 / 0
WININET в VS2017
    #39497026
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
WININET в VS2017
    #39497029
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

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


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