Windows Internet编程基础--WinInet

简介: 假如对 dwContext 参数使用了默认值,将不能区分指示 FTP 连接进度的 OnStatusCallback 调用和指示 HTTP 连接进度的调用。如果指定以后可在 OnStatusCallback 中测试的 dwContext ID,您将知道是哪个操作生成的回调
可以使用 WinInet 添加 FTP 支持以从应用程序内下载文件和上载文件。可以重写 OnStatusCallback 并使用 dwContext 参数在搜索和下载文件时向用户提供进度信息。
  
  本文包含以下主题: 
  
  创建一个非常简单的浏览器 
  下载 Web 页 
  FTP 文件 
  检索 Gopher 目录 
  传输文件时显示进度信息 

  以下摘录的代码说明如何创建一个简单的浏览器、下载 Web 页、FTP 文件和搜索 gopher 文件。它们并不代表完整的示例,并且不都包含异常处理功能。
  
   创建一个非常简单的浏览器
  #include <afxinet.h>
   // assumes URL names have been initialized
  CInternetSession session("My Session");
  CStdioFile* pFile = NULL;
   // use a URL and display a Web page
   while (lpszURL = DisplayPage( ))
   {
     pFile = session.OpenURL(lpszURL);
     while (pFile->Read(szBuff,1024) > 0)
     {
        //read file
     }

     delete pFile;
  }

  session.Close();
   下载 Web 页
   // this code excerpt also demonstrates try/catch exception handling
  #include <afxinet.h>
   // assumes server, port, and URL names have been initialized
  CInternetSession session("My Session");
  CHttpConnection* pServer = NULL;
  CHttpFile* pFile = NULL;
   try
   {
     CString strServerName;
     INTERNET_PORT nPort;
  
     pServer = session.GetHttpConnection(strServerName, nPort);
     pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);
     pFile->AddRequestHeaders(szHeaders);
     pFile->SendRequest();
     pFile->QueryInfoStatusCode(dwRet);
  
     if (dwRet == HTTP_STATUS_OK)
     {
         UINT nRead = pFile->Read(szBuff, 1023);
         while (nRead > 0)
         {
             //read file
         }

     }

     delete pFile;
     delete pServer;
  }

   catch (CInternetException* pEx)
   {
     //catch errors from WinInet
  }

  session.Close();
  FTP 文件
  #include <afxinet.h>
   // assumes server and file names have been initialized
  CInternetSession session("My FTP Session");
  CFtpConnection* pConn = NULL;
  
  pConn = session.GetFtpConnection(lpszServerName);
   // get the file
   if (!pConn->GetFile(pstrRemoteFile, pstrLocalFile))
      // display an error
  delete pConn;
  session.Close();
  检索 Gopher 目录
  #include <afxinet.h>
   // assumes file name has been initialized
  CInternetSession session("My Gopher Session");
  CGopherConnection* pConn = NULL;
  CGopherFileFind* pFile;
  
  pConn = session.GetGopherConnection("gopher.yoursite.com");
  pFile =  new CGopherFileFind(pConn);
  BOOL bFound = pFile->FindFile(lpszFileToFind);
   while (bFound)
   {
     bFound = pFile->FindNextFile();
     //retrieve attributes of found file
  }

  delete pFile;
  delete pConn;
  session.Close();
   使用 OnStatusCallback
  使用 WinInet 类时,可以使用应用程序的 CInternetSession 对象的 OnStatusCallback 成员来检索状态信息。如果您派生自己的 CInternetSession 对象、重写 OnStatusCallback 并启用状态回调,MFC 将调用 OnStatusCallback 函数并提供那个 Internet 会话中所有活动的进度信息。
  
  由于单个会话可能会支持若干个连接(这些连接在它们的生存期内可能执行许多不同的独特操作),因此 OnStatusCallback 需要一个机制用特定的连接或事务来标识每个状态更改。该机制由分配给 WinInet 支持类中的许多成员函数的上下文 ID 参数提供。该参数的类型总是 DWORD 并且总是命名为 dwContext。
  
  分配给具体某个 Internet 对象的上下文只用于标识此对象在 CInternetSession 对象的 OnStatusCallback 成员中导致的活动。对 OnStatusCallback 的调用将接收几个参数;这些参数共同工作以通知应用程序哪个事务和连接的进度是多少。
  
  当创建 CInternetSession 对象时,可以指定构造函数的 dwContext 参数。CInternetSession 本身不使用上下文 ID,而是将上下文 ID 传递给 InternetConnection 派生的任何对象,这些对象不显式获得它们自己的上下文 ID。反过来,如果您不显式指定不同的上下文 ID,则那些 CInternetConnection 对象将上下文 ID 继续传递给它们创建的 CInternetFile 对象。另一方面,如果您确实指定了自己的特定上下文 ID,对象和它所做的任何工作将与那个上下文 ID 关联。可以使用上下文 ID 来标识 OnStatusCallback 函数中为您提供的状态信息。
  
   传输文件时显示进度信息
  例如,如果编写一个应用程序来创建两个连接,一个连到 FTP 服务器以读取文件,一个连到 HTTP 服务器以获取 Web 页,那么,您将有一个 CInternetSession 对象、两个 CInternetConnection 对象(一个是 CFtpSession,另一个是 CHttpSession)和两个 CInternetFile 对象(分别用于两个连接)。假如对 dwContext 参数使用了默认值,将不能区分指示 FTP 连接进度的 OnStatusCallback 调用和指示 HTTP 连接进度的调用。如果指定以后可在 OnStatusCallback 中测试的 dwContext ID,您将知道是哪个操作生成的回调
目录
相关文章
|
消息中间件 C++ Windows
02 MFC - Windows 编程模型
02 MFC - Windows 编程模型
75 0
|
4月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
4月前
|
Windows
[原创]用MASM32编程获取windows类型
[原创]用MASM32编程获取windows类型
|
4月前
|
JavaScript 前端开发 API
MASM32编程通过WMI获取Windows计划任务
MASM32编程通过WMI获取Windows计划任务
|
4月前
|
API Windows
MASM32编程获取Windows当前桌面主题名
MASM32编程获取Windows当前桌面主题名
|
5月前
|
编译器 开发工具 C语言
解锁QtCreator跨界神技!Windows下轻松驾驭OpenCV动态库,让你的跨平台开发如虎添翼,秒变视觉编程大师!
【8月更文挑战第4天】QtCreator是一款强大的跨平台IDE,便于创建多平台应用。本教程教你如何在Windows环境下集成OpenCV库至Qt项目。首先,下载匹配MinGW的OpenCV预编译版并解压。接着,在QtCreator中新建或打开项目,并在.pro文件中添加OpenCV的头文件和库文件路径。确保编译器设置正确。随后编写测试代码,例如加载和显示图片,并进行编译运行。完成这些步骤后,你就能在QtCreator中利用OpenCV进行图像处理开发了。
275 6
|
5月前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
380 0
|
7月前
|
Java C++
jni编程(windows+JDK11+clion)
jni编程(windows+JDK11+clion)
111 1
|
C++ Windows
[笔记]Windows核心编程《番外篇》几种常见的执行命令行方法
[笔记]Windows核心编程《番外篇》几种常见的执行命令行方法
121 0
|
8月前
|
API C++ Windows
windows编程入门_链接错误的配置
windows编程入门_链接错误的配置
63 0