Concetti di base su WinInet

È possibile usare WinInet per aggiungere il supporto FTP per scaricare e caricare file dall'interno dell'applicazione. È possibile eseguire l'override di OnStatusCallback e usare il parametro dwContext per fornire informazioni sullo stato di avanzamento agli utenti durante la ricerca e il download dei file.

Questo articolo contiene gli argomenti seguenti:

Gli estratti di codice seguenti illustrano come creare un semplice browser, scaricare una pagina Web, ftp un file e cercare un file gopher. Non sono concepiti come esempi completi e non tutti contengono la gestione delle eccezioni.

Per altre informazioni su WinInet, vedere Estensioni Internet Win32 (WinInet).For additional information on WinInet, see Win32 Internet Extensions (WinInet).

Creare un browser molto semplice

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

Scaricare una pagina 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 un 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();
}

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

Usare OnStatusCallback

Quando si usano le classi WinInet, è possibile usare il membro OnStatusCallback dell'oggetto CInternetSession dell'applicazione per recuperare le informazioni sullo stato. Se si deriva il proprio CInternetSession oggetto, eseguire l'override di e abilitare OnStatusCallbacki callback di stato, MFC chiamerà la OnStatusCallback funzione con informazioni sullo stato di avanzamento di tutte le attività in tale sessione Internet.

Poiché una singola sessione potrebbe supportare diverse connessioni (che, nel corso della durata, potrebbero eseguire molte operazioni distinte diverse), OnStatusCallback richiede un meccanismo per identificare ogni modifica dello stato con una determinata connessione o transazione. Tale meccanismo viene fornito dal parametro ID di contesto assegnato a molte delle funzioni membro nelle classi di supporto di WinInet. Questo parametro è sempre di tipo DWORD ed è sempre denominato dwContext.

Il contesto assegnato a un oggetto Internet specifico viene utilizzato solo per identificare l'attività causata dall'oggetto nel OnStatusCallback membro dell'oggetto CInternetSession . La chiamata a OnStatusCallback riceve diversi parametri. Questi parametri interagiscono per indicare all'applicazione lo stato di avanzamento per quale transazione e connessione.

Quando si crea un CInternetSession oggetto, è possibile specificare un parametro dwContext per il costruttore. CInternetSessionse stesso non usa l'ID contesto; passa invece l'ID contesto a qualsiasi oggetto derivato da Internet Connessione ion che non ottiene in modo esplicito un ID di contesto personalizzato. A sua volta, questi CInternetConnection oggetti passeranno l'ID contesto agli CInternetFile oggetti creati se non si specifica in modo esplicito un ID contesto diverso. Se, d'altra parte, si specifica un ID contesto specifico di propria proprietà, l'oggetto e qualsiasi operazione eseguita verrà associato a tale ID contesto. È possibile usare gli ID contesto per identificare le informazioni sullo stato fornite all'utente nella OnStatusCallback funzione.

Visualizzare le informazioni sullo stato di avanzamento durante il trasferimento dei file

Ad esempio, se si scrive un'applicazione che crea una connessione con un server FTP per leggere un file e si connette anche a un server HTTP per ottenere una pagina Web, si avrà un CInternetSession oggetto, due CInternetConnection oggetti (uno sarebbe un CFtpSession e l'altro sarebbe un CHttpSession) e due CInternetFile oggetti (uno per ogni connessione). Se sono stati usati valori predefiniti per i parametri dwContext , non sarà possibile distinguere tra le OnStatusCallback chiamate che indicano lo stato di avanzamento per la connessione FTP e le chiamate che indicano lo stato di avanzamento per la connessione HTTP. Se si specifica un ID dwContext , che sarà possibile testare in un secondo momento in OnStatusCallback, si saprà quale operazione ha generato il callback.

Vedi anche

Nozioni di base sulla programmazione Internet MFC
Estensioni Internet Win32 (WinInet)