Concetti di base su WinInet
È possibile usare WinInet per aggiungere il supporto FTP per scaricare e caricare file dall'interno dell'applicazione. È possibile eseguire l'override di OnStatusCallback e usare il parametro dwContext per fornire informazioni sullo stato di avanzamento agli utenti durante la ricerca e il download dei file.
Questo articolo contiene gli argomenti seguenti:
Gli estratti di codice seguenti illustrano come creare un semplice browser, scaricare una pagina Web, ftp un file e cercare un file gopher. Non sono concepiti come esempi completi e non tutti contengono la gestione delle eccezioni.
Per altre informazioni su WinInet, vedere Estensioni Internet Win32 (WinInet).For additional information on WinInet, see Win32 Internet Extensions (WinInet).
Creare un browser molto semplice
#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();
}
Scaricare una pagina Web
//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 un file
#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();
}
Recuperare una directory 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();
}
Usare OnStatusCallback
Quando si usano le classi WinInet, è possibile usare il membro OnStatusCallback dell'oggetto CInternetSession dell'applicazione per recuperare le informazioni sullo stato. Se si deriva il proprio CInternetSession
oggetto, eseguire l'override di e abilitare OnStatusCallback
i callback di stato, MFC chiamerà la OnStatusCallback
funzione con informazioni sullo stato di avanzamento di tutte le attività in tale sessione Internet.
Poiché una singola sessione potrebbe supportare diverse connessioni (che, nel corso della durata, potrebbero eseguire molte operazioni distinte diverse), OnStatusCallback
richiede un meccanismo per identificare ogni modifica dello stato con una determinata connessione o transazione. Tale meccanismo viene fornito dal parametro ID di contesto assegnato a molte delle funzioni membro nelle classi di supporto di WinInet. Questo parametro è sempre di tipo DWORD ed è sempre denominato dwContext.
Il contesto assegnato a un oggetto Internet specifico viene utilizzato solo per identificare l'attività causata dall'oggetto nel OnStatusCallback
membro dell'oggetto CInternetSession
. La chiamata a OnStatusCallback
riceve diversi parametri. Questi parametri interagiscono per indicare all'applicazione lo stato di avanzamento per quale transazione e connessione.
Quando si crea un CInternetSession
oggetto, è possibile specificare un parametro dwContext per il costruttore. CInternetSession
se stesso non usa l'ID contesto; passa invece l'ID contesto a qualsiasi oggetto derivato da Internet Connessione ion che non ottiene in modo esplicito un ID di contesto personalizzato. A sua volta, questi CInternetConnection
oggetti passeranno l'ID contesto agli CInternetFile
oggetti creati se non si specifica in modo esplicito un ID contesto diverso. Se, d'altra parte, si specifica un ID contesto specifico di propria proprietà, l'oggetto e qualsiasi operazione eseguita verrà associato a tale ID contesto. È possibile usare gli ID contesto per identificare le informazioni sullo stato fornite all'utente nella OnStatusCallback
funzione.
Visualizzare le informazioni sullo stato di avanzamento durante il trasferimento dei file
Ad esempio, se si scrive un'applicazione che crea una connessione con un server FTP per leggere un file e si connette anche a un server HTTP per ottenere una pagina Web, si avrà un CInternetSession
oggetto, due CInternetConnection
oggetti (uno sarebbe un CFtpSession
e l'altro sarebbe un CHttpSession
) e due CInternetFile
oggetti (uno per ogni connessione). Se sono stati usati valori predefiniti per i parametri dwContext , non sarà possibile distinguere tra le OnStatusCallback
chiamate che indicano lo stato di avanzamento per la connessione FTP e le chiamate che indicano lo stato di avanzamento per la connessione HTTP. Se si specifica un ID dwContext , che sarà possibile testare in un secondo momento in OnStatusCallback
, si saprà quale operazione ha generato il callback.
Vedi anche
Nozioni di base sulla programmazione Internet MFC
Estensioni Internet Win32 (WinInet)