WinInet 基本概念
您可以使用 WinInet 新增 FTP 支援,以從應用程式內下載和上傳檔案。 您可以覆寫 OnStatusCallback ,並使用 dwCoNtext 參數,在搜尋和下載檔案時為使用者提供進度資訊。
本文包含下列主題:
下列程式碼摘錄示範如何建立簡單的瀏覽器、下載網頁、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 類別時,您可以使用 應用程式的 CInternetSession 物件的 OnStatusCallback 成員來擷取狀態資訊。 如果您衍生自己的 CInternetSession
物件、覆寫 OnStatusCallback
和啟用狀態回呼,MFC 會呼叫函 OnStatusCallback
式,其中包含該網際網路會話中所有活動的進度資訊。
因為單一會話可能支援數個連線(其存留期間可能會執行許多不同的作業), OnStatusCallback
因此需要一個機制,以識別特定連線或交易的每個狀態變更。 該機制是由提供給 WinInet 支援類別中許多成員函式的內容識別碼參數所提供。 此參數一律為 DWORD 類型 ,且一律命名為 dwCoNtext 。
指派給特定網際網路物件的內容只會用來識別物件成員中 OnStatusCallback
CInternetSession
物件所造成的活動。 對 的呼叫 OnStatusCallback
會接收數個參數;這些參數會一起運作,以告知您的應用程式已針對哪些交易和連線進行哪些進度。
當您建立 CInternetSession
物件時,您可以將 dwCoNtext 參數指定 給建構函式。 CInternetSession
本身不會使用內容識別碼;相反地,它會將內容識別碼傳遞給任何 網際網路連線衍生 的物件,這些物件不會明確取得自己的內容識別碼。 接著,如果您未明確指定不同的內容識別碼,這些 CInternetConnection
物件會將內容識別碼連同它們建立的物件一起 CInternetFile
傳遞。 另一方面,如果您指定自己的特定內容識別碼,物件和它所做的任何工作都會與該內容識別碼相關聯。 您可以使用內容識別碼來識別函式中 OnStatusCallback
提供給您的狀態資訊。
傳輸檔案時顯示進度資訊
例如,如果您撰寫的應用程式會建立與 FTP 伺服器的連線以讀取檔案,並聯機到 HTTP 伺服器以取得網頁,則您會有一個 CInternetSession
物件、兩 CInternetConnection
個物件(一 CFtpSession
個是 ,另一個是 CHttpSession
),以及兩 CInternetFile
個物件(一個用於每個連接)。 如果您使用 dwCoNtext 參數的預設值 ,您將無法區分 OnStatusCallback
指出 FTP 連線進度的調用,以及指出 HTTP 連線進度的調用。 如果您指定 dwCoNtext 識別碼,稍後可以在 中 OnStatusCallback
進行測試,您將知道哪個作業產生回呼。