Éléments fondamentaux relatifs à WinInet

Vous pouvez utiliser WinInet pour ajouter la prise en charge FTP pour télécharger et charger des fichiers à partir de votre application. Vous pouvez remplacer OnStatusCallback et utiliser le paramètre dwContext pour fournir des informations de progression aux utilisateurs lorsque vous recherchez et téléchargez des fichiers.

Cet article contient les rubriques suivantes :

Les extraits de code ci-dessous montrent comment créer un navigateur simple, télécharger une page Web, FTP un fichier et rechercher un fichier gopher. Ils ne sont pas destinés à des exemples complets et ne contiennent pas tous la gestion des exceptions.

Pour plus d’informations sur WinInet, consultez Win32 Internet Extensions (WinInet).

Créer un navigateur très 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();
}

Télécharger une page 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 d’un fichier

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

Récupérer un répertoire 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();
}

Utiliser OnStatusCallback

Lorsque vous utilisez les classes WinInet, vous pouvez utiliser le membre OnStatusCallback de l’objet CInternetSession de votre application pour récupérer les informations d’état. Si vous dérivez votre propre CInternetSession objet, remplacez OnStatusCallbacket activez les rappels d’état, MFC appelle votre OnStatusCallback fonction avec des informations de progression sur toutes les activités de cette session Internet.

Étant donné qu’une seule session peut prendre en charge plusieurs connexions (qui, au fil de leur durée de vie, peuvent effectuer de nombreuses opérations distinctes), OnStatusCallback nécessite un mécanisme pour identifier chaque modification d’état avec une connexion ou une transaction particulière. Ce mécanisme est fourni par le paramètre d’ID de contexte donné à de nombreuses fonctions membres dans les classes de prise en charge WinInet. Ce paramètre est toujours de type DWORD et est toujours nommé dwContext.

Le contexte affecté à un objet Internet particulier est utilisé uniquement pour identifier l’activité que l’objet provoque dans le OnStatusCallback membre de l’objet CInternetSession . L’appel à OnStatusCallback recevoir plusieurs paramètres ; ces paramètres fonctionnent ensemble pour indiquer à votre application quelle progression a été effectuée pour quelle transaction et connexion.

Lorsque vous créez un CInternetSession objet, vous pouvez spécifier un paramètre dwContext au constructeur. CInternetSessionelle-même n’utilise pas l’ID de contexte ; Au lieu de cela, il transmet l’ID de contexte à tous les objets dérivés d’Internet Connecter ion qui n’obtiennent pas explicitement un ID de contexte de leur propre. À son tour, ces CInternetConnection objets passent l’ID de contexte aux CInternetFile objets qu’ils créent si vous ne spécifiez pas explicitement d’ID de contexte différent. Si, d’autre part, vous spécifiez un ID de contexte spécifique de votre propre, l’objet et tout travail qu’il effectue sera associé à cet ID de contexte. Vous pouvez utiliser les ID de contexte pour identifier les informations d’état qui vous sont fournies dans votre OnStatusCallback fonction.

Afficher les informations de progression lors du transfert de fichiers

Par exemple, si vous écrivez une application qui crée une connexion avec un serveur FTP pour lire un fichier et se connecte également à un serveur HTTP pour obtenir une page Web, vous aurez un CInternetSession objet, deux CInternetConnection objets (l’un serait un CFtpSession et l’autre serait un CHttpSession) et deux CInternetFile objets (un pour chaque connexion). Si vous avez utilisé des valeurs par défaut pour les paramètres dwContext , vous ne pouvez pas faire la distinction entre les OnStatusCallback appels qui indiquent la progression de la connexion FTP et les appels qui indiquent la progression de la connexion HTTP. Si vous spécifiez un ID dwContext , que vous pouvez tester ultérieurement dans OnStatusCallback, vous savez quelle opération a généré le rappel.

Voir aussi

Notions de base de la programmation Internet MFC
Extension Internet Win32 (WinInet)