Fundamentos de WinInet
Puede utilizar WinInet para agregar compatibilidad de FTP para descargar y cargar los archivos dentro de la aplicación. Puede reemplazar OnStatusCallback y utilizar el parámetro de dwContext para proporcionar información sobre el progreso a los usuarios mientras busca y descarga los archivos.
Este artículo contiene los siguientes temas:
Cree un explorador de Muy Simple
Descargue una página Web
FTP un archivo
Recuperar un directorio de Gopher
Muestra información de progreso mientras transfiere los archivos
Los extractos de código siguientes muestran cómo crear un explorador simple, descargar una página Web, FTP un archivo, y busque un archivo de gopher. No está pensada como los ejemplos completos y no todos contienen control de excepciones.
Para obtener más información sobre WinInet, vea Extensiones de Internet para Win32 (WinInet).
Cree un explorador de Muy Simple
#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();
}
Descargue una página Web
//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 un archivo
#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();
}
Recuperar un directorio de 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();
}
Utilice OnStatusCallback
Al utilizar las clases WinInet, puede utilizar el miembro de OnStatusCallback del objeto de CInternetSession de la aplicación a la información de estado de recuperación. Si deriva posee el objeto de CInternetSession , reemplace OnStatusCallback, y habilitar las devoluciones de llamada de estado, MFC llamará a la función de OnStatusCallback con la información de progreso sobre toda la actividad en esa sesión de internet.
Dado que una sola sesión podría admitir varias conexiones (que, en su período de duración, pueden realizar varias operaciones diferentes), OnStatusCallback necesita un mecanismo identificar cada cambio de estado con una conexión o transacción determinada. Que el mecanismo proporcionado por el parámetro Id. de contexto determinado a muchas de las funciones miembro de las clases de soporte WinInet. Este parámetro es siempre de DWORD escrito y siempre se denomina dwContext.
El contexto asignado a un objeto determinado de internet se utiliza para identificar sólo la actividad las causas de objeto en el miembro de OnStatusCallback del objeto de CInternetSession . La llamada a OnStatusCallback recibe varios parámetros; estos parámetros colaboran para indicar a la aplicación se ha creado el progreso que transacción y conexión.
Cuando se crea un objeto de CInternetSession , puede especificar un parámetro de dwContext al constructor. CInternetSession propio no utiliza el Id. de contexto; en su lugar, pasa el Id. de contexto en cualquier InternetConnection- objetos derivados que no obtienen un Id. de contexto propios. A su vez, esos objetos de CInternetConnection superan el Id. de contexto adelante a los objetos de CInternetFile que crean si no especifica otra identificación de contexto Si, por otro lado, especifica un Id. de contexto específico de dispone, el objeto y cualquier trabajo que lo haga es asociado a esa identificación de contexto Puede utilizar los id. de contexto para identificar qué información de estado se da se en función de OnStatusCallback .
Muestra información de progreso mientras transfiere los archivos
Por ejemplo, si escribe una aplicación que cree una conexión a un servidor FTP para leer un archivo y también se conecte a un servidor HTTP para obtener una página Web, tendrá un objeto de CInternetSession , dos objetos de CInternetConnection (uno sería CFtpSession y el otro se CHttpSession), y dos objetos de CInternetFile (uno para cada conexión). Si utiliza los valores predeterminados para los parámetros de dwContext , no puede distinguir entre las invocaciones de OnStatusCallback que indican el progreso de la conexión de FTP e invocaciones que indican el progreso para la conexión HTTP. Si especifica un identificador de dwContext , que puede probar más adelante en OnStatusCallback, sabrá qué operación generó la devolución de llamada.