共用方式為


WinInet 基本概念

您可以使用 WinInet 加入 FTP 的支援,如果要下載並上載您的應用程式中的檔案。 您可以覆寫 OnStatusCallback ,並使用dwContext參數,以提供給使用者的進度資訊,當您搜尋和下載檔案。

本文包含下列主題:

  • 建立非常簡單的瀏覽器

  • 下載網頁

  • FTP 檔案

  • 擷取 Gopher 目錄

  • 傳輸檔案時顯示進度資訊

下面程式碼摘錄將示範如何建立簡單的瀏覽器、 下載網頁,而 FTP 檔案,並搜尋 gopher 檔案。 它們不一定會做為完整的範例,並非所有儲存例外處理。

如需有關 WinInet 的詳細資訊,請參閱 Win32 網際網路延伸 (WinInet)

建立非常簡單的瀏覽器

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

下載網頁

//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 檔案

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

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

使用 OnStatusCallback

當使用 WinInet 類別,您可以使用 OnStatusCallback 成員的應用程式的 CInternetSession 物件來擷取狀態資訊。 如果您衍生您自己CInternetSession物件,會覆寫OnStatusCallback,並啟用狀態回呼,MFC 會呼叫您OnStatusCallback關於所有活動的進度資訊在網際網路工作階段中使用的函式。

因為單一工作階段可能支援數個連結 (透過他們的存留期中可能執行許多不同的作業), OnStatusCallback需要一個機制,來找出每個狀態變更的特定連結或異動。 此機制會提供內容 ID 參數指定給數個在 WinInet 的支援類別的成員函式。 這個參數的型別永遠是DWORD ,一律為dwContext。

指派給特定的 [網際網路] 物件的內容只用來識別物件所造成的活動OnStatusCallback成員的CInternetSession物件。 若要在呼叫OnStatusCallback會收到數個參數。 這些參數一起工作,以告訴您的應用程式已進行哪些交易和連接的何種進度。

當您建立CInternetSession物件,您可以指定dwContext參數的建構函式。 CInternetSession本身並沒有使用的內文識別碼中 ; 相反地,它會傳遞至任何的內容 ID InternetConnection-衍生不明確地取得其本身的內容 ID 的物件。 在開啟時,那些CInternetConnection物件會傳遞及內文識別碼以CInternetFile物件在建立如果您沒有明確地指定一個不同的內容 id。 如果相反地,指定您自己的特定內容識別碼、 物件和任何存在的工作會與該內容識別碼建立關聯 您可以使用的內容 Id 來識別哪些狀態資訊提供您在您OnStatusCallback函式。

傳輸檔案時顯示進度資訊

比方說,如果您撰寫的應用程式,會建立與 FTP 伺服器讀取檔案的連線,並也連接至 HTTP 伺服器取得網頁時,您必須CInternetSession物件,兩個CInternetConnection物件 (其中之一就是 CFtpSession ,其他則是 CHttpSession),以及兩個CInternetFile (一個用於每個連線) 的物件。 如果您使用的預設值dwContext參數,您就無法區分OnStatusCallback指出進度的 FTP 連接,並指出進度的 HTTP 連線的引動過程的引動過程。 如果您指定dwContext識別碼,您可以稍後再測試在OnStatusCallback,您就知道哪一個作業會產生回呼。

請參閱

概念

MFC 網際網路程式設計基本概念

Win32 網際網路延伸 (WinInet)