Основные сведения о WinInet
С помощью WinInet можно добавить поддержку FTP для скачивания и отправки файлов из приложения. Вы можете переопределить OnStatusCallback и использовать параметр dwContext для предоставления сведений о ходе выполнения пользователям при поиске и скачивании файлов.
Эта статья включает следующие разделы:
В приведенном ниже фрагменте кода показано, как создать простой браузер, скачать веб-страницу, 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
само по себе не использует идентификатор контекста; Вместо этого он передает идентификатор контекста для любых объектов, производных от Интернета Подключение ion, которые явно не получают идентификатор контекста. В свою очередь, эти CInternetConnection
объекты будут передавать идентификатор контекста вместе CInternetFile
с объектами, которые они создают, если явно не указать другой идентификатор контекста. Если, с другой стороны, укажите определенный идентификатор контекста, объект и любая работа, которую она делает, будет связана с этим идентификатором контекста. Идентификаторы контекста можно использовать для определения сведений о состоянии, предоставленных вам в функции OnStatusCallback
.
Отображение сведений о ходе передачи файлов
Например, если вы создаете приложение, которое создает соединение с FTP-сервером для чтения файла, а также подключается к HTTP-серверу для получения веб-страницы, у вас будет CInternetSession
объект, два CInternetConnection
объекта (один CFtpSession
будет одним из них, а другой — CHttpSession
и двумя CInternetFile
объектами (по одному для каждого подключения). Если вы использовали значения по умолчанию для параметров dwContext , вы не сможете различать OnStatusCallback
вызовы, указывающие ход выполнения подключения FTP и вызовы, указывающие ход выполнения подключения HTTP. Если указать идентификатор dwContext , для которого можно позже протестировать OnStatusCallback
, вы узнаете, какая операция вызвала обратный вызов.
См. также
Основы программирования для интернет-решений MFC
Расширения Интернета Win32 (WinInet)