Partilhar via


Noções básicas do WinInet

Você pode usar WinInet para adicionar suporte FTP para baixar e fazer upload de arquivos de dentro do seu aplicativo. Você pode substituir OnStatusCallback e usar o parâmetro dwContext para fornecer informações de progresso aos usuários enquanto pesquisa e baixa arquivos.

Este artigo contém os seguintes tópicos:

Os trechos de código abaixo demonstram como criar um navegador simples, baixar uma página da Web, FTP um arquivo e procurar um arquivo gopher. Não se destinam a ser exemplos completos e nem todos contêm tratamento de exceções.

Para obter informações adicionais sobre WinInet, consulte Win32 Internet Extensions (WinInet).

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

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

Utilizar OnStatusCallback

Ao usar as classes WinInet, você pode usar o membro OnStatusCallback do objeto CInternetSession do seu aplicativo para recuperar informações de status. Se o utilizador derivar o seu próprio objeto CInternetSession, substituir OnStatusCallback e habilitar callbacks de estado, o MFC chamará a sua função OnStatusCallback com informações de progresso sobre toda a atividade nessa sessão de Internet.

Como uma única sessão pode suportar várias conexões (que, ao longo de sua vida útil, 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 "ID de contexto" dado a muitas das funções membro nas classes de suporte do WinInet. Este parâmetro é sempre do tipo DWORD e é sempre chamado dwContext.

O contexto atribuído a um determinado objeto da Internet é usado apenas para identificar a atividade que o objeto causa no OnStatusCallback membro do CInternetSession objeto. A chamada para OnStatusCallback recebe vários parâmetros, esses parâmetros trabalham juntos para dizer ao seu aplicativo qual progresso foi feito para qual transação e conexão.

Quando você cria um CInternetSession objeto, você pode especificar um parâmetro dwContext para o construtor. CInternetSession não usa o ID de contexto; em vez disso, ele passa a ID de contexto para quaisquer objetos derivados de InternetConnection que não obtenham explicitamente uma ID de contexto própria. Por sua vez, esses CInternetConnection objetos passarão o ID de contexto para CInternetFile os objetos criados se você não especificar explicitamente um ID de contexto diferente. Se, por outro lado, você especificar um ID de contexto específico próprio, o objeto e qualquer trabalho que ele fizer será associado a esse ID de contexto. Você pode usar os 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 conecta 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ê usasse valores padrão para os parâmetros dwContext , não seria capaz de distinguir entre as OnStatusCallback invocações que indicam o progresso para a conexão FTP e as invocações que indicam o progresso para a conexão HTTP. Se você especificar um ID dwContext , que poderá ser testado posteriormente no OnStatusCallback, saberá qual operação gerou o retorno de chamada.

Ver também

MFC Noções básicas de programação para Internet
Extensões de Internet Win32 (WinInet)