WinInet の基礎
アプリケーション内からファイルをダウンロードおよびアップロードするのに FTP サポートを追加するには、 WinInet を使用できます。を検索し、ファイルをダウンロードするときに OnStatusCallback をオーバーライドし、ユーザーに進行状況に関する情報を提供するために dwContext パラメーターを使用できます。
この技術情報では、次のトピックが含まれています:
単純なブラウザーを作成します。
Web ページをダウンロードします。
FTP コンテナーに存在するファイル
Gopher のディレクトリを検索します。
ファイルをコピーするとき、進行状況に関する情報を表示します。
コード例の抜粋では、の単純なブラウザーを、 Gopher の各ファイルの Web ページを作成する方法、 FTP ファイル、および取得をダウンロードするに示します。これらはコード例全体として意図していないため、すべてが例外処理は含まれません。
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();
}
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 コンテナーに存在するファイル
#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 サポートのメンバー関数の多くに用意されているコンテキスト ID パラメーターによって提供される分類します。このパラメーターは型 DWORD 常にで、 dwContextという名前です。
特定のインターネットのオブジェクトに割り当てたコンテキストがアクティビティを識別するために CInternetSession のオブジェクトの OnStatusCallback のメンバーのオブジェクトの原因使用されます。OnStatusCallback への呼び出しは複数のパラメーターを受け取ります; これらのパラメーターは、トランザクション、および接続、進行状況が行われたかアプリケーションに通知するように連携します。
CInternetSession のオブジェクトを作成するときに、コンストラクターに dwContext パラメーターを指定できます。CInternetSession 自体はコンテキスト ID は使用できません; 代わりに、どの InternetConnection- 明示的に独自のコンテキスト ID を取得派生オブジェクトにコンテキスト ID を渡します。次に、 CInternetConnection のそれらのオブジェクトを作成する CInternetFile のオブジェクトに明示的に異なるコンテキスト ID を指定するコンテキスト ID を渡します一方、は、独自の特定のオブジェクト コンテキスト ID を指定して作業をそのコンテキスト ID に関連付けられている場合どのようなステータス情報が OnStatusCallback の関数の、指定したを識別するのにコンテキスト ID を使用できます。
ファイルをコピーするとき、進行状況に関する情報を表示します。
たとえば、ファイルを読み取るために FTP サーバーとの接続を作成し、 HTTP サーバーに Web ページを取得するに接続するアプリケーションを作成する場合 CInternetSession のオブジェクト、 CInternetConnection の 2 種類のオブジェクト (1 つが CFtpSession で他方が CHttpSessionです)、および CInternetFile の 2 種類のオブジェクト (各接続に対して 1)があります。dwContext パラメーターの既定値を使用する場合は、 HTTP 接続の進行状況を示す呼び出しとが FTP 接続の進行状況を示す OnStatusCallback の呼び出しを区別できません。、 OnStatusCallbackでのために後でテストできる dwContext の ID を指定する場合、どの操作がコールバックを生成したかを確認します。