Windows Internet編程基礎--WinInet
??可以使用 WinInet 添加 FTP 支持以從應用程序內下載文件和上載文件??梢灾貙?OnStatusCallback 并使用 dwContext 參數在搜索和下載文件時向用戶提供進度信息。?
? 本文包含以下主題:
?
? 創建一個非常簡單的瀏覽器
? 下載 Web 頁
? FTP 文件
? 檢索 Gopher 目錄
? 傳輸文件時顯示進度信息?
? 以下摘錄的代碼說明如何創建一個簡單的瀏覽器、下載 Web 頁、FTP 文件和搜索 gopher 文件。它們并不代表完整的示例,并且不都包含異常處理功能。
?
? 創建一個非常簡單的瀏覽器
??#include?<afxinet.h>
??//assumes?URL?names?have?been?initialized
??CInternetSession?session("My?Session");
??CStdioFile*?pFile?=?NULL;
??//use?a?URL?and?display?a?Web?page
??while?(lpszURL?=?DisplayPage(
))
??
{
?????pFile?=?session.OpenURL(lpszURL);
?????while?(pFile->Read(szBuff,1024)?>?0)
?????
{
????????//read?file
?????}
?????delete?pFile;
??}
??session.Close();
??//this?code?excerpt?also?demonstrates?try/catch?exception?handling
??#include?<afxinet.h>
??//assumes?server,?port,?and?URL?names?have?been?initialized
??CInternetSession?session("My?Session");
??CHttpConnection*?pServer?=?NULL;
??CHttpFile*?pFile?=?NULL;
??try
??
{
?????CString?strServerName;
?????INTERNET_PORT?nPort;
??
?????pServer?=?session.GetHttpConnection(strServerName,?nPort);
?????pFile?=?pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,?strObject);
?????pFile->AddRequestHeaders(szHeaders);
?????pFile->SendRequest();
?????pFile->QueryInfoStatusCode(dwRet);
??
?????if?(dwRet?==?HTTP_STATUS_OK)
?????
{
?????????UINT?nRead?=?pFile->Read(szBuff,?1023);
?????????while?(nRead?>?0)
?????????
{
?????????????//read?file
?????????}
?????}
?????delete?pFile;
?????delete?pServer;
??}
??catch?(CInternetException*?pEx)
??
{
?????//catch?errors?from?WinInet
??}
??session.Close();
??#include?<afxinet.h>
??//assumes?server?and?file?names?have?been?initialized
??CInternetSession?session("My?FTP?Session");
??CFtpConnection*?pConn?=?NULL;
??
??pConn?=?session.GetFtpConnection(lpszServerName);
??//get?the?file
??if?(!pConn->GetFile(pstrRemoteFile,?pstrLocalFile))
?????//display?an?error
??delete?pConn;
??session.Close();
??#include?<afxinet.h>
??//assumes?file?name?has?been?initialized
??CInternetSession?session("My?Gopher?Session");
??CGopherConnection*?pConn?=?NULL;
??CGopherFileFind*?pFile;
??
??pConn?=?session.GetGopherConnection("gopher.yoursite.com");
??pFile?=?new?CGopherFileFind(pConn);
??BOOL?bFound?=?pFile->FindFile(lpszFileToFind);
??while?(bFound)
??
{
?????bFound?=?pFile->FindNextFile();
?????//retrieve?attributes?of?found?file
??}
??delete?pFile;
??delete?pConn;
??session.Close();
? 使用 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,您將知道是哪個操作生成的回調
posted on 2006-04-14 21:14 楊粼波 閱讀(943) 評論(0) 編輯 收藏 引用 所屬分類: 文章收藏

