Compartilhar via


Noções básicas do WinInet

Você pode usar o WinInet para adicionar suporte a 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, FTP um arquivo e pesquisar um arquivo gopher. Eles não são feitos como exemplos completos e nem todos contêm tratamento de exceção.

Para obter informações adicionais sobre o WinInet, consulte WinInet (Extensões de Internet do Win32).

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();
}

FTP a File

#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 próprio CInternetSession objeto, substituir OnStatusCallbacke habilitar retornos de chamada de status, o MFC chamará sua OnStatusCallback função com informações de progresso sobre todas as atividades nessa sessão da Internet.

Como uma única sessão pode dar suporte a várias conexões (que, ao longo do tempo de vida, podem executar várias operações distintas diferentes), OnStatusCallback precisa de um mecanismo para identificar cada alteração de status com uma determinada conexão ou transação. Esse mecanismo é fornecido pelo parâmetro de ID de contexto fornecido a muitas das funções membro nas classes de suporte do WinInet. Esse parâmetro é sempre do tipo DWORD e sempre é nomeado dwContext.

O contexto atribuído a um objeto específico da Internet é usado apenas para identificar a atividade que o objeto causa no OnStatusCallback membro do CInternetSession objeto. A chamada para OnStatusCallback receber 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 CInternetSession objeto, 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 CInternetConnection objetos passarão a ID de contexto para CInternetFile os objetos 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 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 fornecidas a você em sua OnStatusCallback função.

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, você terá um CInternetSession objeto, dois CInternetConnection objetos (um seria um CFtpSession e o outro seria um CHttpSession) e dois CInternetFile objetos (um para cada conexão). Se você usou valores padrão para os parâmetros dwContext , não seria capaz de distinguir entre as invocações que indicam o OnStatusCallback progresso da conexão FTP e as invocações que indicam o progresso da conexão HTTP. Se você especificar uma ID dwContext , para a qual poderá testar OnStatusCallbackposteriormente, saberá em qual operação gerou o retorno de chamada.

Consulte também

Noções básicas de programação da Internet do MFC
Extensões de Internet win32 (WinInet)