WinInet基础知识

可以使用 WinInet 添加 FTP 支持下载和上载文件从应用程序的内部。 ,当您搜索和下载文件,可以重写 OnStatusCallback 和使用 dwContext 参数提供进度信息。用户。

本文包含以下主题:

  • 创建一个非常简单的 web 浏览器

  • 下载网页

  • FTP 文件

  • 检索地鼠内容

  • 显示进度信息,当调用时文件

下面的代码的摘要演示如何创建一个简单的浏览器,下载网页、 FTP 文件和搜索地鼠文件。 它们不是完整示例而不是所有包含异常处理。

有关 WinInet 的更多信息,请参见 Win32 扩展 Internet (wininet)

创建一个非常简单的 web 浏览器

#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();
}

检索地鼠内容

#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 Internet 在该会话中将调用您的进度信息的 OnStatusCallback 功能有关所有事件。

由于一个会话可能支持,在其生存期,可能执行许多不同的清单的操作) 的若干连接 (, OnStatusCallback 需要结构以特定的连接或事务的每个状态更改。 上下文 ID 参数提供 framework 为许多在 WinInet 的成员函数支持类。 此参数始终是类型 DWORD 而且始终命名 dwContext。

上下文分配给特定 Internet 对象仅用于标识事件。 CInternetSession 对象的 OnStatusCallback 成员的对象原因。 为 OnStatusCallback 的调用接收多个参数;这些参数告知您的应用程序的方面取得事务和连接。

在创建 CInternetSession 对象时,可以指定 dwContext 参数传递给构造函数。 CInternetSession 不使用上下文 ID;相反,它通过上下文 ID 对所有 InternetConnection- 不显式保护它们的上下文 ID 的派生的对象。 然后,他们创建的这些 CInternetConnection 对象将通过上下文 ID 为 CInternetFile 对象,如果不显式指定不同的上下文 ID. 如果为,则另一方面,指定您的特定上下文 ID,对象,它的所有工作要与该上下文 ID. 可以使用上下文 ID 标识状态信息提供您的 OnStatusCallback 功能。

显示进度信息,当调用时文件

例如,因此,如果编写创建连接与 FTP 服务器读取文件并连接到 HTTP 服务器获得网页的应用程序,您将具有一 CInternetSession 对象,两个 CInternetConnection 对象 (一个是 CFtpSession ,另一 CHttpSession) 和两 CInternetFile 对象 (一连接)。 如果为 dwContext 参数使用了默认值,您无法区分指示 FTP 连接的进度并调用指示 HTTP 连接进度的 OnStatusCallback 调用之间。 如果指定 dwContext ID,您可以在 OnStatusCallback测试之后,您将知道哪个操作生成的回调。

请参见

概念

MFC Internet编程的基本知识

Win32扩展Internet (wininet)