Мы будем менять предыдущий проект для того, чтобы добавить функции слежения за соединением. Для этого в классе CInternetSession предусмотрена виртуальная функция OnStatusCallback.
Сначало нам надо породить новый класс от класса CInternetSession. Для этого мы пойдем в меню Insert и выберем функцию New Class. И дальше тип Generic class. Вот так:
После того, как Вы нажмете 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 ......
Что и требовалось мы следим за соединением.