Noções básicas de WinInet
Você pode usar o WinInet para adicionar suporte para FTP para baixar e carregar arquivos de dentro de seu aplicativo. Você pode substituir OnStatusCallback e usar o parâmetro dwContext para fornecer informações de progresso aos usuários à medida que você pesquisa e baixa arquivos.
Este artigo inclui as seções a seguir:
Os trechos de código abaixo demonstram como criar um navegador simples, baixar uma página da Web, usar FTP em um arquivo e pesquisar um arquivo gopher. Esses exemplos não têm como objetivo serem exaustivos e não contêm todos os tratamentos de exceção.
Para mais informações sobre o WinInet, confia Extensões da Internet Win32 (WinInet).
Criar um navegador muito simples
#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();
}
Baixar uma página da 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();
}
Usar FTP em um arquivo
#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 um diretório 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();
}
Usar OnStatusCallback
Ao usar as classes WinInet, você pode usar o membro OnStatusCallback do objeto CInternetSession do aplicativo para recuperar informações de status. Se você derivar seu objeto CInternetSession
, substituir OnStatusCallback
e habilitar retornos de chamada de status, o MFC chamará sua função OnStatusCallback
com informações de progresso sobre toda a atividade nessa sessão da Internet.
Como uma só sessão pode dar suporte a várias conexões (que, ao longo do tempo de vida, podem executar muitas operações distintas diferentes), OnStatusCallback
precisa de um mecanismo para identificar cada alteração de status com uma conexão ou transação específica. Esse mecanismo é fornecido pelo parâmetro de ID de contexto fornecido a muitas das funções de membro nas classes de suporte do WinInet. Esse parâmetro sempre é do tipo DWORD e sempre se chama dwContext.
O contexto atribuído a um objeto de Internet específico é usado apenas para identificar a atividade que o objeto causa no membro OnStatusCallback
do objeto CInternetSession
. A chamada para OnStatusCallback
recebe vários parâmetros; esses parâmetros funcionam juntos para informar ao aplicativo qual progresso foi feito para qual transação e conexão.
Ao criar um objeto CInternetSession
, você pode especificar um parâmetro dwContext para o construtor. CInternetSession
em si não usa a ID de contexto. Em vez disso, ele passa a ID de contexto para qualquer objeto derivado de InternetConnection que não obtém explicitamente uma ID de contexto própria. Por sua vez, esses objetos CInternetConnection
passarão a ID de contexto para os objetos CInternetFile
que eles criam se você não especificar explicitamente uma ID de contexto diferente. Se, por outro lado, você especificar uma ID de contexto específica por conta própria, o objeto e qualquer trabalho que ele fizer serão associados a essa ID de contexto. Você pode usar as IDs de contexto para identificar quais informações de status estão sendo dadas a você em sua função OnStatusCallback
.
Exibir informações de progresso durante a transferência de arquivos
Por exemplo, se você escrever um aplicativo que cria uma conexão com um servidor FTP para ler um arquivo e também se conectar a um servidor HTTP para obter uma página da Web, terá um objeto CInternetSession
, dois objetos CInternetConnection
(um seria um CFtpSession
e o outro seria um CHttpSession
) e dois objetos CInternetFile
(um para cada conexão). Se você usasse valores padrão para os parâmetros dwContext, não poderia distinguir entre as invocações OnStatusCallback
que indicam o progresso da conexão FTP e as invocações que indicam o progresso da conexão HTTP. Se você especificar uma ID dwContext, que você depois pode testar em OnStatusCallback
, saberá em qual operação gerou o retorno de chamada.
Confira também
Noções básicas de programação da Internet no MFC
Extensões da Internet Win32 (WinInet)