Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > WININET в VS2017


Автор: polin11 29.7.2017, 13:22
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.7.2017, 17:13
Исправл код, как Вы советовали, код скомпилировался, 
запускаю в качестве 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;
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)