WinInet-Grundlagen

Sie können WinInet verwenden, um FTP-Unterstützung zum Herunterladen und Hochladen von Dateien aus Ihrer Anwendung hinzuzufügen. Sie können OnStatusCallback außer Kraft setzen und den dwContext-Parameter verwenden, um Den Benutzern Statusinformationen bereitzustellen, während Sie nach Dateien suchen und diese herunterladen.

Dieser Artikel enthält folgende Themen:

Die folgenden Codeauszüge veranschaulichen, wie Sie einen einfachen Browser erstellen, eine Webseite herunterladen, eine DATEI FTP-Datei herunterladen und nach einer Gopher-Datei suchen. Sie sind nicht als vollständige Beispiele gedacht und enthalten nicht alle Ausnahmebehandlungen.

Weitere Informationen zu WinInet finden Sie unter Win32 Internet Extensions (WinInet).

Erstellen eines sehr einfachen Browsers

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

Herunterladen einer Webseite

//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-Datei

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

Abrufen eines Gopher-Verzeichnisses

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

OnStatusCallback verwenden

Bei Verwendung der WinInet-Klassen können Sie das OnStatusCallback-Element des CInternetSession-Objekts Ihrer Anwendung verwenden, um Statusinformationen abzurufen. Wenn Sie Ihr eigenes CInternetSession Objekt ableiten, außer Kraft setzen OnStatusCallbackund Statusrückrufe aktivieren, ruft MFC Ihre OnStatusCallback Funktion mit Statusinformationen zu allen Aktivitäten in dieser Internetsitzung auf.

Da eine einzelne Sitzung möglicherweise mehrere Verbindungen unterstützt (die während ihrer Lebensdauer viele verschiedene Vorgänge ausführen können), OnStatusCallback muss ein Mechanismus benötigt werden, um jede Statusänderung mit einer bestimmten Verbindung oder Transaktion zu identifizieren. Dieser Mechanismus wird vom Kontext-ID-Parameter bereitgestellt, der vielen Memberfunktionen in den WinInet-Unterstützungsklassen zugewiesen wird. Dieser Parameter ist immer vom Typ DWORD und wird immer dwContext genannt.

Der einem bestimmten Internetobjekt zugewiesene Kontext wird nur verwendet, um die Aktivität zu identifizieren, die das Objekt im OnStatusCallback Element des CInternetSession Objekts verursacht. Der Aufruf, der OnStatusCallback mehrere Parameter empfängt. Diese Parameter arbeiten zusammen, um Ihrer Anwendung mitzuteilen, welche Fortschritte für welche Transaktion und Verbindung vorgenommen wurden.

Wenn Sie ein CInternetSession Objekt erstellen, können Sie einen dwContext-Parameter für den Konstruktor angeben. CInternetSessionselbst verwendet nicht die Kontext-ID; Stattdessen übergibt sie die Kontext-ID an alle internet Verbinden ion-abgeleiteten Objekte, die keine eigene Kontext-ID abrufen. Diese Objekte übergeben wiederum die Kontext-ID an CInternetFile Objekte, die sie erstellen, CInternetConnection wenn Sie keine andere Kontext-ID explizit angeben. Wenn Sie dagegen eine bestimmte Kontext-ID ihres eigenen angeben, werden das Objekt und alle aufgaben, die es tut, dieser Kontext-ID zugeordnet. Sie können die Kontext-IDs verwenden, um zu identifizieren, welche Statusinformationen Ihnen in Ihrer OnStatusCallback Funktion zur Verfügung gestellt werden.

Statusinformationen beim Übertragen von Dateien anzeigen

Wenn Sie z. B. eine Anwendung schreiben, die eine Verbindung mit einem FTP-Server erstellt, um eine Datei zu lesen und eine Verbindung mit einem HTTP-Server herzustellen, um eine Webseite abzurufen, verfügen Sie über ein CInternetSession Objekt, zwei CInternetConnection Objekte (eine wäre ein CFtpSession und die andere wäre ein CHttpSession) und zwei CInternetFile Objekte (eine für jede Verbindung). Wenn Sie Standardwerte für die dwContext-Parameter verwendet haben, können Sie nicht zwischen den Aufrufen unterscheiden, die OnStatusCallback den Fortschritt für die FTP-Verbindung und die Aufrufe angeben, die den Fortschritt für die HTTP-Verbindung angeben. Wenn Sie eine dwContext-ID angeben, auf die Sie später testen OnStatusCallbackkönnen, wissen Sie, welcher Vorgang den Rückruf generiert hat.

Siehe auch

Grundlagen der MFC-Internetprogrammierung
Win32-Interneterweiterungen (WinInet)