Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual2.doc
Скачиваний:
5
Добавлен:
07.03.2016
Размер:
3.31 Mб
Скачать

If ((pInternetSession)

{

AfxMessageBox("He удалось начать сеанс Internet",

MB_OK);

return;

}

.............................................................

}

У разі вдалого підключення до Інтернету додаток повинен завантажити код HTML для Web-сторінки Microsoft.

Пересилання файлів через HTTP

Метод OpenURL() класу CInternetSession відкриває Web-сторінку для передачі даних через HTTP. Він повертає вказівку на файловий об'єкт класу CStdioFile (цей клас є похідним від CFile і являє не фізичний файл на диску, а потік C++), який ми зберігаємо в змінній pFile:

void CHTTPDlg::OnButton1()

{

CInternetSession* pInternetSession;

pInternetSession = new CInternetSession();

if (!pInternetSession)

{

AfxMessageBox("He удалось начать сеанс Internet",

MB_OK);

return;

}

CStdioFile* pFile = NULL;

pFile = pInternetSession->

OpenURL(CString("http://www.microsoft.com"));

.............................................................

}

У нас є вказівка на файловий об'єкт, що представляє необхідну нам Web-сторінку. Ми можемо працювати з ним, як із звичайним файлом. У нашому випадку потрібно прочитати перші 1000 байт файлу. Як ми дізналися із розділу, присвяченого роботі з файлами, для цього потрібно створити буфер для зберігання даних і викликати метод Read():

void CHTTPDlg::OnButton1()

{

CInternetSession* pInternetSession;

pInternetSession = new CInternetSession();

if (!pInternetSession)

{

AfxMessageBox("He удалось начать сеанс Internet",

MB_OK);

return;

}

CStdioFile* pFile = NULL;

char* buffer;

buffer = new char[1000];

pFile = pInternetSession->

OpenURL(CString("http://www.microsoft.com"));

pFile->Read(buffer,1000);

.............................................................

}

Цей фрагмент зчитує перші 1000 байт Web-сторінки і поміщає їх у буфер.

Підказка. Метод Read() у даному прикладі використовується абсолютно так само, як і у прикладі, присвяченому роботі з файлами. Наприклад, якщо б нам треба було прочитати весь вміст Web-сторінки, можна було б викликати метод Read() у циклі до тих пір, поки кількість прочитаних байтів не виявиться рівною 0.

Залишається лише відобразити отримані дані. Для цього ми зв'яжемо з текстовим полем змінну m_text і занесемо в нього інформацію. Крім того, слід закрити відкритий файл разом з сеансом Інтернету:

void CHTTPDlg::OnButton1()

{

CInternetSession* pInternetSession;

pInternetSession = new CInternetSession();

if (!pInternetSession)

{

AfxMessageBox("He удалось начать сеанс Internet",

MB_OK);

return;

}

CStdioFile* pFile = NULL;

char* buffer;

buffer = new char[1000];

pFile = pInternetSession->

OpenURL(CString("http://www.microsoft.com"));

pFile->Read(buffer,1000);

m_text = CString(buffer, 1000);

UpdateData(false);

pFile->Close();

pInternetSession->Close();

}

Програма готова – запустіть її та натисніть кнопку Отримати Web-сторінку. Програма приймає перші 1000 символів Web-сторінки Microsoft і відображає їх у текстовому полі (рис. 11.5). Ми навчилися використовувати протокол HTTP для передачі коду HTML в Web.

Як ми бачимо з програми, метод OpenURL() надає просту, але досить потужну можливість – використовувати протокол HTTP для того, щоб відкрити Web-об'єкт як звичайний файл, щоб надалі з ним можна було працювати, застосовуючи стандартні файлові методи.

Рис. 11.5. Початок Web-сторінки Microsoft, отриманий за допомогою протоколу HTTP

Тим не менш, при деякому досвіді роботи з HTTP у вас може виникнути бажання використовувати стандартні запити HTTP - Get, Put або Post. У Visual C++ вони реалізуються настільки ж просто: слід лише викликати метод GetHttpConnection класу CInternetSession, щоб створити об'єкт класу MFC CHttpConnection. Потім метод OpenRequest() цього класу використовується для виконання HTTP-запитів, при цьому йому передаються такі «командні» константи, як HTTP_VERB_GET, HTTP_VERB_PUT або HTTP_VERB_POST.

Підказка. Клас CHttpConnection містить всього два методи: конструктор і метод OpenRequest() для виконання HTTP-запитів.

Отже, крім використання спрощених методів типу OpenURL() ви також можете виконувати в своїх програмах загальні HTTP-запити; завдяки такій підтримці класи MFC помітно спрощують роботу з протоколом HTTP. Вихідний текст програми HTTP міститься у файлах HTTPDlg.h/ HTTPDlg.cpp.

HTTPDlg.h і HTTPDlg.cpp

// HTTPDlg.h : заголовочний файл

//

#if !defined(AFX_HTTPDLG_H__F4238337_9410_11D0_8860_444553540000__INCLUDED_)

#define AFX_HTTPDLG_H__F4238337_9410_11D0_8860_444553540000__INCLUDED_

#if _MSC_VER >= 1000

#pragma once

#endif // _MSC_VER >= 1000

/////////////////////////////////////////////////////////////////////////

// Діалогове вікно CHTTPDlg

class CHTTPDlg : public CDialog

{

// Конструювання

public:

CHTTPDlg(CWnd* pParent = NULL);

// Стандартний конструктор

// Дані діалогового вікна

//{{AFX_DATA(CHTTPDlg)

enum { IDD = IDD_HTTP_DIALOG };

CString m_text;

//}}AFX_DATA

// Перевантаження

// Перевантажені віртуальні функції,

// сформовані ClassWizard-ом.

//{{AFX_VIRTUAL(CHTTPDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX);

// Підтримка DDX/DDV

//}}AFX_VIRTUAL

// Реалізація

protected:

HICON m_hIcon;

// Сформовані функції карти повідомлень

//{{AFX_MSG(CHTTPDlg)

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

afx_msg void OnButton1();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ буде вставляти додаткові

// оголошення перед попереднім рядком.

#endif

// !defined(AFX_HTTPDLG_H__F4238337_9410_

// 11D0_8860_444553540000 INCLUDED_)

// HTTPDlg.cpp : файл реалізації

//

#include "stdafx.h"

#include "HTTP.h"

#include "HTTPDlg.h"

#include <afxinet.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////

// Діалогове вікно CAboutDlg, що виводиться по команді About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Дані діалогового вікна

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// Перевантаження

// Перевантажені віртуальні функції,

// сформовані ClassWizard-ом.

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX);

// Підтримка DDX/DDV

//}}AFX_VIRTUAL

// Реалізація

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// Обробники повідомлень відсутні

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////

// Діалогове вікно CHTTPDlg

CHTTPDlg::CHTTPDlg(CWnd* pParent /*=NULL*/)

: CDialog(CHTTPDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CHTTPDlg)

m_text = _T("");

//}}AFX_DATA_INIT

// Зверніть увагу на те, що в Win32 LoadIcon

// не потребує наступного виклика DestroyIcon

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CHTTPDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CHTTPDlg)

DDX_Text(pDX, IDC_EDIT1, m_text);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CHTTPDlg, CDialog)

//{{AFX_MSG_MAP(CHTTPDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////

// Обробники повідомлень CHTTPDlg

BOOL CHTTPDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Додати команду "About..." в системне меню.

// Значення IDM_ABOUTBOX повинно знаходитись у діапазоні

// системних команд.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,

IDM_ABOUTBOX, strAboutMenu);

}

}

// Поставити значок для діалогового вікна. Бібліотека

// робить це автоматично, якщо головне вікно програми

// не є діалоговим.

SetIcon(m_hIcon, TRUE); // Встановити великий значок

SetIcon(m_hIcon, FALSE); // Встановити малий значок

// ЗРОБИТИ: додайте додаткову ініціалізацію

return TRUE; // повернути TRUE, якщо тільки ви

// не передаєте фокус елементу

}

void CHTTPDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// Якщо в діалоговому вікні є кнопка згортання, наведений

// нижче код знадобиться для малювання значка. У додатках MFC,

// які використовують модель документ / вид, це робиться

// автоматично.

void CHTTPDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // контекст пристрою для

// малювання

SendMessage(WM_ICONERASEBKGND,

(WPARAM) dc.GetSafeHdc(), 0);

// Вивести значок в центрі клієнтського

// прямокутника

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Намалювати значок

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// Викликається системою для отримання вказівки,

// відображаємого при перетаскуванні згорнутого вікна.

HCURSOR CHTTPDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CHTTPDlg::OnButton1()

{

CInternetSession* pInternetSession;

pInternetSession = new CInternetSession();

if (!pInternetSession)

{

AfxMessageBox("He удалось начать сеанс Internet",

MB_OK);

return;

}

CStdioFile* pFile = NULL;

char* buffer;

buffer = new char[1000];

pFile = pInternetSession->

OpenURL(CString("http://www.microsoft.com"));

pFile->Read(buffer,1000);

m_text = CString(buffer, 1000);

UpdateData(false);

pFile->Close();

pInternetSession->Close();

}

Ми познайомилися із використанням HTTP для отримання HTML-коду Web-сторінки. Продовжуючи вивчення WinInet, ми переходимо до протоколу FTP.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]