WinInet の基礎
WinInet を使用すると、アプリケーション内からファイルをダウンロードまたはアップロードするための FTP サポートを追加できます。 ファイルの検索およびダウンロードの進行状況をユーザーに提供するには、OnStatusCallback をオーバーライドして、dwContext パラメーターを使用します。
ここでは、以下の項目について説明します。
単純なブラウザーの作成
Web ページのダウンロード
FTP によるファイル操作
Gopher フォルダーの検索
ファイル転送の進行状況の表示
以下の各コードは、単純なブラウザーの作成例、Web ページのダウンロード例、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();
}
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 を使用しませんが、独自のコンテキスト ID を明示的に取得しない InternetConnection の派生オブジェクトに、コンテキスト ID を渡します。 別のコンテキスト ID を明示的に指定しない限り、CInternetConnection オブジェクトに渡されたコンテキスト ID は、このオブジェクトが作成する CInternetFile オブジェクトに渡されます。 一方、別のコンテキスト ID を独自に指定した場合、このオブジェクトとそれが行う作業は、指定したコンテキスト ID と関連付けられます。 OnStatusCallback 関数で提供されるステータス情報は、そのコンテキスト ID で識別できます。
ファイル転送の進行状況の表示
FTP サーバーと接続してファイルを読み取り、HTTP サーバーと接続して Web ページを取得するアプリケーションを作成する場合は、1 つの CInternetSession オブジェクト、2 つの CInternetConnection オブジェクト (CFtpSession と CHttpSession)、および 2 つの CInternetFile オブジェクト (接続ごとに 1 つ) を使用します。 dwContextパラメーターに既定値を使用すると、OnStatusCallback が提供するステータス状況が、FTP 接続の進行状況であるか、HTTP 接続の進行状況であるかを区別できません。 dwContext ID を指定すると、この後で OnStatusCallback で識別できるため、コールバックを生成した操作を特定できます。