次の方法で共有


WinInet の基本

WinInet を使用すると、FTP サポートを追加して、アプリケーション内からファイルをダウンロードおよびアップロードできます。 OnStatusCallback をオーバーライドし、dwContext パラメーターを使用して、ファイルを検索およびダウンロードするときに進行状況情報をユーザーに提供できます。

この記事では、次のトピックを取り上げます。

次のコードの抜粋は、単純なブラウザーの作成、Web ページのダウンロード、ファイルの FTP、および gopher ファイルの検索を行う方法を示しています。 これらは完全な例ではなく、すべての例外処理が含まれているわけではありません。

WinInet の詳細については、「 Win32 Internet Extensions (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 関数を呼び出します。

1 つのセッションで複数の接続がサポートされる場合があるため (有効期間中、さまざまな操作を実行する場合があります)、 OnStatusCallback 特定の接続またはトランザクションで各状態の変化を識別するメカニズムが必要です。 このメカニズムは、WinInet サポート クラスの多くのメンバー関数に渡されるコンテキスト ID パラメーターによって提供されます。 このパラメーターは常に DWORD 型であり、常に dwContext という名前です。

特定のインターネット オブジェクトに割り当てられたコンテキストは、オブジェクトがOnStatusCallback オブジェクトのCInternetSession メンバーで発生するアクティビティを識別するためにのみ使用されます。 OnStatusCallbackの呼び出しはいくつかのパラメーターを受け取ります。これらのパラメーターは連携して、どのトランザクションと接続に対してどのような進行状況が行われたかをアプリケーションに通知します。

CInternetSession オブジェクトを作成するときに、コンストラクターに dwContext パラメーターを指定できます。 CInternetSession それ自体はコンテキスト ID を使用しません。代わりに、独自のコンテキスト ID を明示的に取得しない InternetConnection 派生オブジェクトにコンテキスト ID を渡します。 さらに、これらの CInternetConnection オブジェクトは、別のコンテキスト ID を明示的に指定しない場合に、作成 CInternetFile オブジェクトにコンテキスト ID を渡します。 一方、独自の特定のコンテキスト ID を指定した場合、オブジェクトとその処理は、そのコンテキスト ID に関連付けられます。 コンテキスト ID を使用して、 OnStatusCallback 関数で提供されている状態情報を識別できます。

ファイルの転送中に進行状況情報を表示する

たとえば、FTP サーバーとの接続を作成してファイルを読み取り、HTTP サーバーにも接続して Web ページを取得するアプリケーションを作成すると、 CInternetSession オブジェクト、2 つの CInternetConnection オブジェクト (1 つは CFtpSession 、もう 1 つは CHttpSession)、2 つの CInternetFile オブジェクト (接続ごとに 1 つ) が作成されます。 dwContext パラメーターに既定値を使用した場合、FTP 接続の進行状況を示すOnStatusCallback呼び出しと、HTTP 接続の進行状況を示す呼び出しを区別することはできません。 後で でテストできる OnStatusCallback ID を指定すると、コールバックを生成した操作がわかります。

こちらも参照ください

MFC インターネット プログラミングの基本
Win32 インターネット拡張機能 (WinInet)