天天看點

Windows Internet程式設計基礎--WinInet

可以使用 WinInet 添加 FTP 支援以從應用程式内下載下傳檔案和上載檔案。可以重寫 OnStatusCallback 并使用 dwContext 參數在搜尋和下載下傳檔案時向使用者提供進度資訊。

  本文包含以下主題: 

  建立一個非常簡單的浏覽器 

  下載下傳 Web 頁 

  FTP 檔案 

  檢索 Gopher 目錄 

  傳輸檔案時顯示進度資訊 

  以下摘錄的代碼說明如何建立一個簡單的浏覽器、下載下傳 Web 頁、FTP 檔案和搜尋 gopher 檔案。它們并不代表完整的示例,并且不都包含異常處理功能。

  建立一個非常簡單的浏覽器

Windows Internet程式設計基礎--WinInet

  #include <afxinet.h>

Windows Internet程式設計基礎--WinInet

  //assumes URL names have been initialized

Windows Internet程式設計基礎--WinInet

  CInternetSession session("My Session");

Windows Internet程式設計基礎--WinInet

  CStdioFile* pFile = NULL;

Windows Internet程式設計基礎--WinInet

  //use a URL and display a Web page

Windows Internet程式設計基礎--WinInet

  while (lpszURL = DisplayPage(

Windows Internet程式設計基礎--WinInet

))

Windows Internet程式設計基礎--WinInet

  {

Windows Internet程式設計基礎--WinInet

     pFile = session.OpenURL(lpszURL);

Windows Internet程式設計基礎--WinInet

     while (pFile->Read(szBuff,1024) > 0)

Windows Internet程式設計基礎--WinInet

     {

Windows Internet程式設計基礎--WinInet

        //read file

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

     }

Windows Internet程式設計基礎--WinInet

     delete pFile;

Windows Internet程式設計基礎--WinInet

  }

Windows Internet程式設計基礎--WinInet

  session.Close();

Windows Internet程式設計基礎--WinInet

  下載下傳 Web 頁

Windows Internet程式設計基礎--WinInet

  //this code excerpt also demonstrates try/catch exception handling

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

  //assumes server, port, and URL names have been initialized

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

  CHttpConnection* pServer = NULL;

Windows Internet程式設計基礎--WinInet

  CHttpFile* pFile = NULL;

Windows Internet程式設計基礎--WinInet

  try

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

     CString strServerName;

Windows Internet程式設計基礎--WinInet

     INTERNET_PORT nPort;

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

     pServer = session.GetHttpConnection(strServerName, nPort);

Windows Internet程式設計基礎--WinInet

     pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);

Windows Internet程式設計基礎--WinInet

     pFile->AddRequestHeaders(szHeaders);

Windows Internet程式設計基礎--WinInet

     pFile->SendRequest();

Windows Internet程式設計基礎--WinInet

     pFile->QueryInfoStatusCode(dwRet);

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

     if (dwRet == HTTP_STATUS_OK)

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

         UINT nRead = pFile->Read(szBuff, 1023);

Windows Internet程式設計基礎--WinInet

         while (nRead > 0)

Windows Internet程式設計基礎--WinInet

         {

Windows Internet程式設計基礎--WinInet

             //read file

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

         }

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

     delete pServer;

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

  catch (CInternetException* pEx)

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

     //catch errors from WinInet

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

  FTP 檔案

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

  //assumes server and file names have been initialized

Windows Internet程式設計基礎--WinInet

  CInternetSession session("My FTP Session");

Windows Internet程式設計基礎--WinInet

  CFtpConnection* pConn = NULL;

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

  pConn = session.GetFtpConnection(lpszServerName);

Windows Internet程式設計基礎--WinInet

  //get the file

Windows Internet程式設計基礎--WinInet

  if (!pConn->GetFile(pstrRemoteFile, pstrLocalFile))

Windows Internet程式設計基礎--WinInet

     //display an error

Windows Internet程式設計基礎--WinInet

  delete pConn;

Windows Internet程式設計基礎--WinInet

  檢索 Gopher 目錄

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

  //assumes file name has been initialized

Windows Internet程式設計基礎--WinInet

  CInternetSession session("My Gopher Session");

Windows Internet程式設計基礎--WinInet

  CGopherConnection* pConn = NULL;

Windows Internet程式設計基礎--WinInet

  CGopherFileFind* pFile;

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

  pConn = session.GetGopherConnection("gopher.yoursite.com");

Windows Internet程式設計基礎--WinInet

  pFile = new CGopherFileFind(pConn);

Windows Internet程式設計基礎--WinInet

  BOOL bFound = pFile->FindFile(lpszFileToFind);

Windows Internet程式設計基礎--WinInet

  while (bFound)

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

     bFound = pFile->FindNextFile();

Windows Internet程式設計基礎--WinInet

     //retrieve attributes of found file

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

  delete pFile;

Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet
Windows Internet程式設計基礎--WinInet

  使用 OnStatusCallback

  使用 WinInet 類時,可以使用應用程式的 CInternetSession 對象的 OnStatusCallback 成員來檢索狀态資訊。如果您派生自己的 CInternetSession 對象、重寫 OnStatusCallback 并啟用狀态回調,MFC 将調用 OnStatusCallback 函數并提供那個 Internet 會話中所有活動的進度資訊。

  由于單個會話可能會支援若幹個連接配接(這些連接配接在它們的生存期内可能執行許多不同的獨特操作),是以 OnStatusCallback 需要一個機制用特定的連接配接或事務來辨別每個狀态更改。該機制由配置設定給 WinInet 支援類中的許多成員函數的上下文 ID 參數提供。該參數的類型總是 DWORD 并且總是命名為 dwContext。

  配置設定給具體某個 Internet 對象的上下文隻用于辨別此對象在 CInternetSession 對象的 OnStatusCallback 成員中導緻的活動。對 OnStatusCallback 的調用将接收幾個參數;這些參數共同工作以通知應用程式哪個事務和連接配接的進度是多少。

  當建立 CInternetSession 對象時,可以指定構造函數的 dwContext 參數。CInternetSession 本身不使用上下文 ID,而是将上下文 ID 傳遞給 InternetConnection 派生的任何對象,這些對象不顯式獲得它們自己的上下文 ID。反過來,如果您不顯式指定不同的上下文 ID,則那些 CInternetConnection 對象将上下文 ID 繼續傳遞給它們建立的 CInternetFile 對象。另一方面,如果您确實指定了自己的特定上下文 ID,對象和它所做的任何工作将與那個上下文 ID 關聯。可以使用上下文 ID 來辨別 OnStatusCallback 函數中為您提供的狀态資訊。

  傳輸檔案時顯示進度資訊

  例如,如果編寫一個應用程式來建立兩個連接配接,一個連到 FTP 伺服器以讀取檔案,一個連到 HTTP 伺服器以擷取 Web 頁,那麼,您将有一個 CInternetSession 對象、兩個 CInternetConnection 對象(一個是 CFtpSession,另一個是 CHttpSession)和兩個 CInternetFile 對象(分别用于兩個連接配接)。假如對 dwContext 參數使用了預設值,将不能區分訓示 FTP 連接配接進度的 OnStatusCallback 調用和訓示 HTTP 連接配接進度的調用。如果指定以後可在 OnStatusCallback 中測試的 dwContext ID,您将知道是哪個操作生成的回調

繼續閱讀