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)