Основы WinInet
Можно использовать WinInet, чтобы добавить поддержку протокола FTP, чтобы загрузить и передавать файлы из приложения.Можно переопределить OnStatusCallback и использовать параметр dwContext для реализации данные о ходе выполнения операции пользователи при поиске и загрузите файлы.
Данный раздел содержит следующие подразделы.
Создайте очень простой браузер
Загрузите страницу
FTP файл
Восстановите каталог gopher
Отображает данные о ходе выполнения во время Переключащ файлы
Фрагменты кода ниже показано создание простой страницы обозреватель загрузят FTP файл и поиск файла gopher.Они не предназначен для полных примеров, а не как все содержащие обработку ошибок.
Дополнительные сведения о WinInet см. в разделе расширения Win32 Интернета (WinInet).
Создайте очень простой браузер
#include <afxinet.h>
void DisplayPage(LPCTSTR pszURL)
{
CInternetSession session(_T("My Session"));
CStdioFile* pFile = NULL;
CHAR szBuff[1024];
//use a URL and print a Web page to the console
pFile = session.OpenURL(pszURL);
while (pFile->Read(szBuff, 1024) > 0)
{
printf_s("%1023s", szBuff);
}
delete pFile;
session.Close();
}
Загрузите страницу
//this code excerpt also demonstrates try/catch exception handling
#include <afxinet.h>
void DisplayHttpPage(LPCTSTR pszServerName, LPCTSTR pszFileName)
{
CInternetSession session(_T("My Session"));
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
try
{
CString strServerName;
INTERNET_PORT nPort = 80;
DWORD dwRet = 0;
pServer = session.GetHttpConnection(pszServerName, nPort);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, pszFileName);
pFile->SendRequest();
pFile->QueryInfoStatusCode(dwRet);
if (dwRet == HTTP_STATUS_OK)
{
CHAR szBuff[1024];
while (pFile->Read(szBuff, 1024) > 0)
{
printf_s("%1023s", szBuff);
}
}
delete pFile;
delete pServer;
}
catch (CInternetException* pEx)
{
//catch errors from WinInet
TCHAR pszError[64];
pEx->GetErrorMessage(pszError, 64);
_tprintf_s(_T("%63s"), pszError);
}
session.Close();
}
FTP файл
#include <afxinet.h>
void GetFtpFile(LPCTSTR pszServerName, LPCTSTR pszRemoteFile, LPCTSTR pszLocalFile)
{
CInternetSession session(_T("My FTP Session"));
CFtpConnection* pConn = NULL;
pConn = session.GetFtpConnection(pszServerName);
//get the file
if (!pConn->GetFile(pszRemoteFile, pszLocalFile))
{
//display an error
}
delete pConn;
session.Close();
}
Восстановите каталог gopher
#include <afxinet.h>
void RetrieveGopherFile(LPCTSTR pszGopherSite, LPCTSTR pszFile)
{
CInternetSession session(_T("My Gopher Session"));
CGopherConnection* pConn = NULL;
CGopherFileFind* pFile;
pConn = session.GetGopherConnection(pszGopherSite);
pFile = new CGopherFileFind(pConn);
BOOL bFound = pFile->FindFile(pszFile);
while (bFound)
{
//retrieve attributes of found file
bFound = pFile->FindNextFile();
}
delete pFile;
delete pConn;
session.Close();
}
Используйте OnStatusCallback
При использовании классов WinInet, можно использовать элемент OnStatusCallback объекта CInternetSession приложения для получения сведений о состоянии.При наследовании собственный объект CInternetSession, переопределите OnStatusCallback и включает обратные вызовы состояния вызовет MFC функция OnStatusCallback с данными о ходе выполнения о работе в полностью этом сеансе через интернет.
Поскольку один сеанс может поддерживать несколько соединений (за их течением времени существования, которые могут выполняться много различных, определенных операций) OnStatusCallback требуется механизм определения каждое изменение состояния с указанными соединением или транзакцией.Что механизм предоставляется параметром контекстного идентификатора, присвоенное многие функции-члены в классах поддержки WinInet.Данный параметр всегда типа DWORD и всегда имеет имя dwContext.
Контекст, присвоенный объекту через интернет частности используется только для определения работы причины объекта в элементе OnStatusCallback объекта CInternetSession.Вызов OnStatusCallback возвращает несколько параметров; эти параметры работают вместе, чтобы сообщить приложению, какой ход выполненной для которого транзакция, а соединение.
При создании объекта CInternetSession можно указать параметр dwContext в конструктор.Само CInternetSession не использует ид контекста; вместо этого он передает идентификатор контекста on к любому InternetConnection- производным объекты, которые явно не задает идентификатор контекста.Эти объекты, в свою очередь, передают CInternetConnection ид контекста обратно в объекты CInternetFile они создают, если явно не указано другое идентификатор контекста.С другой стороны, если необходимо задать определенный идентификатор контекста ваших объект и любые это связывает с таким идентификатором контекстаМожно использовать идентификаторы контекста, чтобы указать, какие сведения о состоянии даны в функции OnStatusCallback.
Отображает данные о ходе выполнения во время Переключащ файлы
Например, если создается приложение, которое создает соединение с ftp-сервером для считывания файла, а также подключается к HTTP-серверу для получения страницу будет содержать объект CInternetSession, 2 был бы одного объекта CInternetConnection ( CFtpSession, а другой будет CHttpSession) и 2 CInternetFile объекта (по одной для каждого соединения).При использовании значения по умолчанию для параметров dwContext, то пользователь не сможет отличить между вызовами OnStatusCallback, которые показывают ход выполнения для соединения по протоколу FTP и вызовы, которые показывают ход выполнения для HTTP-соединения.Если указан идентификатор dwContext, которое позднее можно будет проверять в OnStatusCallback, известно, что операция является создателем обратный вызов.