开发者社区> 杨粼波> 正文

Windows Internet编程基础--WinInet

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

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

InBlock.gif     delete pFile;
ExpandedBlockEnd.gif  }

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

ExpandedSubBlockEnd.gif     }

InBlock.gif     delete pFile;
InBlock.gif     delete pServer;
ExpandedBlockEnd.gif  }

None.gif  catch (CInternetException* pEx)
ExpandedBlockStart.gif  {
InBlock.gif     //catch errors from WinInet
ExpandedBlockEnd.gif
  }

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

None.gif  delete pFile;
None.gif  delete pConn;
None.gif  session.Close();
None.gif
  使用 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,您将知道是哪个操作生成的回调

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
.NET数据库编程求索之路--7.使用ADO.NET实现(工厂模式-实现多数据库切换)(4)
7.使用ADO.NET实现(工厂模式-实现多数据库切换)(4) 7.7 业务逻辑层HomeShop.BLL OrderBiz.cs View Code  1 using System; 2 using System.
786 0
Java基础-14总结正则表达式,Pattern,Mactcher,Math,BigInteger,BigDeximal,System等
你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 学正则表达式之前qq号问题: package cn.itcast_01;
2026 0
面向概念的编程
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/1921224 面向概念...
660 0
win32串口编程
翻译自:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WIN32COM.v10.en/dnfiles/html/msdn_serial.htm 老外写的文章,虽比较全面,但很啰嗦,不如看各个函数的文档来得快。
949 0
VB编程:取整函数Int、CInt、Fix区别
VB编程:取整函数Int、CInt、Fix区别
65 0
.NET数据库编程求索之路--9.使用EF实现
9.使用EF实现   源码下载: /Files/SummerRain/NetDbDevRoad/9使用EF实现1自动ORM简单三层.rar /Files/SummerRain/NetDbDevRoad/9使用EF实现2自动纯POCO代理简单三层.
662 0
Apache Flink 零基础入门(五):流处理核心组件 Time&Window 深度解析
为什么要有 Window; Window 中的三个核心组件:WindowAssigner、Trigger 和 Evictor;Window 中怎么处理乱序数据,乱序数据是否允许延迟,以及怎么处理迟到的数据;最后我们梳理了整个 Window 的数据流程,以及 Window 中怎么保证 Exactly
3448 0
.NET数据库编程求索之路--10.使用EF实现(划分输入验证层)
10.使用EF实现(划分输入验证层) 注:使用partial类来实现输入验证逻辑的分层。   源码下载: /Files/SummerRain/NetDbDevRoad/a使用EF实现4划分输入验证层.
589 0
Eclipse安装图形JFrame,Jswing编程界面
打开eclipse,选择help--->install new software 来源http://www.cnblogs.com/xiaobo-Linux/p/7954274.html 打开网址 http://www.eclipse.org/windowbuilder/ 点击download 在相对应eclipse版本,link右键复制链接,然后复制到这里   然后下一步安装即可。
1462 0
Windows Phone 8初学者开发—第5部分:布局和事件基础
原文 Windows Phone 8初学者开发—第5部分:布局和事件基础 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Part-5-Basics-of-Layout-and-Events 系列地址:http://channel9.
717 0
+关注
杨粼波
网游的老兵
1152
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载