Шаг 265 - Следим за соединением

Мы будем менять предыдущий проект для того, чтобы добавить функции слежения за соединением. Для этого в классе CInternetSession предусмотрена виртуальная функция OnStatusCallback.

Сначало нам надо породить новый класс от класса CInternetSession. Для этого мы пойдем в меню Insert и выберем функцию New Class. И дальше тип Generic class. Вот так:

265.gif (4086 b)

После того, как Вы нажмете OK вам скажут, что не могут найти класс CInternetSession, ну и ладно. Нажмите опять OK. VC++ создаст класс. Вот теперь надо объяснить ему, что CInternetSession существует.

// StatusInternetSession.h: interface for the CStatusInternetSession class.
//
//////////////////////////////////////
......

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "afxinet.h"
......

Теперь мы можем перегрузить функцию OnStatusCallback.

// StatusInternetSession.h: interface for the CStatusInternetSession class.
//
/////////////////////////////////////
#if !defined(AFX_STATUSINTERNETSESSION_H__5219D0D4_B248_11D4_9413_ACE82DCCA163__INCLUDED_)
#define AFX_STATUSINTERNETSESSION_H__5219D0D4_B248_11D4_9413_ACE82DCCA163__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "afxinet.h"

class CStatusInternetSession : public CInternetSession  
{
public:
	CStatusInternetSession();
	virtual ~CStatusInternetSession();
	void OnStatusCallback(DWORD dwContext, 
		DWORD dwInternetStatus,LPVOID lpvStatusInformation,
		DWORD dwStatusInformationLength);
};

#endif // !defined(AFX_STATUSINTERNETSESSION_H__5219D0D4_B248_11D4_9413_ACE82DCCA163__INCLUDED_)

// StatusInternetSession.cpp: implementation of the CStatusInternetSession class.
//
////////////////////////////////////////

#include "stdafx.h"
#include "TestHTTP.h"
#include "StatusInternetSession.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////
// Construction/Destruction
//////////////////////////////

CStatusInternetSession::CStatusInternetSession()
{

}

CStatusInternetSession::~CStatusInternetSession()
{

}

void CStatusInternetSession::OnStatusCallback(DWORD dwContext,
		DWORD dwInternetStatus, LPVOID lpvStatusInformation,
		DWORD dwStatusInformationLength)
{

}

Теперь надо научить наш класс диалогового окна новым классам:

// TestHTTPDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestHTTP.h"
#include "TestHTTPDlg.h"

#include "StatusInternetSession.h"

#ifdef _DEBUG

......

void CTestHTTPDlg::OnButton1() 
{
	CStatusInternetSession session;
	CHttpConnection* pHttpCon = session.GetHttpConnection("http://www.firststeps.ru/"); 	
	......
}

Вся предварительная подготовка закончена. И изменим нашу функцию слежения:

void CStatusInternetSession::OnStatusCallback(DWORD dwContext,
	DWORD dwInternetStatus,LPVOID lpvStatusInformation,
	DWORD dwStatusInformationLength)
{
	switch(dwInternetStatus)
	{
	case INTERNET_STATUS_RESOLVING_NAME:
		TRACE("Look IP\n");
		break;
	case INTERNET_STATUS_NAME_RESOLVED:
		TRACE("Yes IP\n");
		break;
	default:
		TRACE("Not Info\n");
		break;
	}

Константы статуса описаны в файле WinInet.h:

//
// status manifests for Internet status callback
//

#define INTERNET_STATUS_RESOLVING_NAME          10
#define INTERNET_STATUS_NAME_RESOLVED           11
#define INTERNET_STATUS_CONNECTING_TO_SERVER    20
#define INTERNET_STATUS_CONNECTED_TO_SERVER     21
......

Для того, чтобы сообщения можно было обрабатывать в функции слежения это надо еще разрешить.

void CTestHTTPDlg::OnButton1() 
{
	CStatusInternetSession session;
	session.EnableStatusCallback(TRUE); 
	......
}

Запустим приложение и посмотрим на его вывод в окне Debug. Примерно так:

Loaded 'C:\WINDOWS\SYSTEM\MSNET32.DLL', no matching symbolic information found.
Look IP
Loaded 'C:\WINDOWS\SYSTEM\RNR20.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\MSAFD.DLL', no matching symbolic information found.
Yes IP
Not Info
......

Что и требовалось мы следим за соединением.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.