Dela via


Grunderna i WinInet

Du kan använda WinInet för att lägga till FTP-stöd för att ladda ned och ladda upp filer från ditt program. Du kan åsidosätta OnStatusCallback och använda parametern dwContext för att ge förloppsinformation till användare när du söker efter och laddar ned filer.

Den här artikeln innehåller följande avsnitt:

Kodutdragen nedan visar hur du skapar en enkel webbläsare, laddar ned en webbsida, FTP en fil och söker efter en gopher-fil. De är inte avsedda som fullständiga exempel och innehåller inte alla undantagshantering.

Mer information om WinInet finns i Win32 Internet Extensions (WinInet).

Skapa en mycket enkel webbläsare

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

Ladda ned en webbsida

//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 en fil

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

Hämta en Gopher-katalog

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

Använd OnStatusCallback

När du använder WinInet-klasserna kan du använda OnStatusCallback-medlemmen i programmets CInternetSession-objekt för att hämta statusinformation. Om du härleder ditt eget CInternetSession objekt, åsidosätter OnStatusCallbackoch aktiverar statusåteranrop anropar MFC funktionen OnStatusCallback med förloppsinformation om all aktivitet i den Internetsessionen.

Eftersom en enskild session kan ha stöd för flera anslutningar (som under sin livstid kan utföra många olika distinkta åtgärder) OnStatusCallback behöver en mekanism för att identifiera varje statusändring med en viss anslutning eller transaktion. Den mekanismen tillhandahålls av kontext-ID-parametern som ges till många av medlemsfunktionerna i WinInet-supportklasserna. Den här parametern är alltid av typen DWORD och heter alltid dwContext.

Kontexten som tilldelas ett visst Internetobjekt används endast för att identifiera aktiviteten som objektet orsakar i OnStatusCallback objektets CInternetSession medlem. Anropet till OnStatusCallback tar emot flera parametrar. Dessa parametrar fungerar tillsammans för att berätta för ditt program vilka framsteg som har gjorts för vilken transaktion och anslutning.

När du skapar ett CInternetSession objekt kan du ange en dwContext-parameter till konstruktorn. CInternetSession i sig använder inte kontext-ID:t. I stället skickas kontext-ID:t vidare till alla InternetConnection-härledda objekt som inte uttryckligen får ett eget kontext-ID. Dessa objekt skickar i sin tur CInternetConnection kontext-ID:t till CInternetFile objekt som de skapar om du inte uttryckligen anger ett annat kontext-ID. Om du å andra sidan anger ett eget kontext-ID kommer objektet och allt arbete det utför att associeras med det kontext-ID:t. Du kan använda kontext-ID:t för att identifiera vilken statusinformation som ges till dig i din OnStatusCallback funktion.

Visa förloppsinformation vid överföring av filer

Om du till exempel skriver ett program som skapar en anslutning till en FTP-server för att läsa en fil och även ansluter till en HTTP-server för att hämta en webbsida, har du ett CInternetSession objekt, två CInternetConnection objekt (det ena skulle vara ett CFtpSession och det andra är ett CHttpSession) och två CInternetFile objekt (ett för varje anslutning). Om du använde standardvärden för dwContext-parametrarna skulle du inte kunna skilja mellan de OnStatusCallback anrop som anger förloppet för FTP-anslutningen och de anrop som indikerar förloppet för HTTP-anslutningen. Om du anger ett dwContext-ID , som du senare kan testa för i OnStatusCallback, vet du vilken åtgärd som genererade återanropet.

Se även

Grunderna i MFC Internet Programming
Win32 Internet Extensions (WinInet)