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,您就知道哪一個作業會產生回呼。