【转】Windows Mobile下WinInet的异步使用方法

WTL在Windows CE与Mobile嵌入式开发中的实战价值 WTL(Windows Template Library)是一种基于ATL的轻量级C++ GUI框架,其核心原理是通过CRTP模板模式实现零虚函数、零运行时开销的窗口抽象,避免MFC的内存膨胀与消息映射性能损耗。在资源严苛的嵌入式场景中,WTL凭借静态链接、无DLL依赖、极小二进制体积(典型EXE仅180–240KB)和对WinCE/GWES子系统的深度适配,成为工业HMI、手持终端等长生命周期设备的关键UI方案。它支撑-20℃~60℃宽温运行、4MB堆限制、GDI句柄硬约束及实时响应(<150ms)等刚性 阅读详情

原文:http://blog.youkuaiyun.com/pknife/archive/2008/06/06/2517272.aspx

 

codeproject上有一篇老美写的关于HTTP异步的文章:http://www.codeproject.com/KB/IP/asyncwininet.aspx。

我做HTTP异步的时候,也是参考了这篇文章,受益匪浅。今天特地翻译出来,与大家共飨。

WinInet HTTP的异步方式使用

绪论

如果你曾经深入MSDN研究过WinInet API,你会注意到可使用异步方式且该方式是被推崇的。

当你决定使用该方式时,你却找不到如何使用异步的说明。网上也没有任何例子。研究了很长时间,也做了很多试验,我最终决定着手来填补一份(非官方)空缺的文档。

为什么异步方式是最好的?因为它能够正确的处理超时。而在IE5.5下WinInet缺少此功能。

如果你试图使用TerminateThread或CloseHandle函数来处理超时(这些函数在MSDN文档中有介绍),你将落入各种各样的陷阱中。

以下条件中异步测试成功:单处理器和多处理器的WinNT4系统下的IE4.01SP3, IE5.0, IE5.01, IE5.5SP1,压力环境(12小时不间断地在多处理器NT服务器下运行15个并发实例)。

原理
使用WinInet函数的异步方式,你必须按照正确的顺序:
1.使用INTERNET_FLAG_ASYNC打开任务。
2.使用InternetSetStatusCallback设置回调。
3.使用InternetOpenUrl打开连接。
4.如果InternetOpenUrl返回NULL且GetLastError的值是ERROR_IO_PENDING:
  1)等待回调函数返回INTERNET_STATUS_HANDLE_CREATED通知,保存连接句柄;
  2)等待回调函数返回INTERNET_STATUS_REQUEST_COMPLETE通知。
5.解析header里的vontent-length字段,创建一个INTERNET_BUFFERS结构:
  1)dwStructSize = sizeof(INTERNET_BUFFERS);
  2)lpvBuffer = 你申请的缓冲;
  3)dwBufferLength = 缓冲长度。
6.使用InternetReadFileEx函数,参数为IRF_ASYNC,异步读取剩余的数据。不要使用InternetReadFile,因为它是同
步的。
7.如果InternetReadFileEx返回FALSE且GetLastError的值为ERROR_IO_PENDING:等待回到函数返回INTERNET_STATUS_
REQUEST_COMPLETE 通知。
  警告:INTERNET_BUFFERS结果的成员是会被修改的(dwBufferLength和缓冲区)。
8.如果dwBufferLength不为0,移动lpvBuffer的指针dwBufferLength个长度,重复第6步。
9.使用InternetCloseHandle关闭连接,等待INTERNET_STATUS_HANDLE_CLOSING和特定的INTERNET_STATUS_REQUEST_CO
MPLETE通知。

之后,你可以开始一个新的连接过程或者关闭任务句柄。但是在关闭之前,你应该卸载回调函数。

细节
在原理中,让我们看看关键点的一些代码:

1&2:使用INTERNET_FLAG_ASYNC打开任务,设置回调
m_Session = InternetOpen(AGENT_NAME, INTERNET_OPEN_TYPE_PRECONFIG,
                          NULL, NULL, INTERNET_FLAG_ASYNC);
InternetSetStatusCallback( m_Session,
      (INTERNET_STATUS_CALLBACK)InternetCallbackFunc );

3&4:使用InternetOpenUrl打开连接,等待INTERNET_STATUS_REQUEST_COMPLETE通知
使用lParam发送一个任务表示到你的回调。我总是用this指针来传递我的class。这里假设你知道如何处理回调。
InternetOpenUrl( m_Session, uurl, NULL, 0,
      INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE |
      INTERNET_FLAG_NO_CACHE_WRITE, (LPARAM)this );

回调会收到一堆的消息。这是收到的dwInternetStatus值的顺序:
[openUrl] InternetStatus: 60 INTERNET_STATUS_HANDLE_CREATED
**此时你应该保存HINTERNET句柄,如下代码:
INTERNET_ASYNC_RESULT* res = (INTERNET_ASYNC_RESULT*)lpvStatusInformation;
m_hHttpFile = (HINTERNET)(res->dwResult);

[openUrl] InternetStatus: 10
[openUrl] InternetStatus: 11
[openUrl] InternetStatus: 20
[openUrl] InternetStatus: 21
[openUrl] InternetStatus: 30
[openUrl] InternetStatus: 31
[openUrl] InternetStatus: 40
[openUrl] InternetStatus: 41
[openUrl] InternetStatus: 100 INTERNET_STATUS_REQUEST_COMPLETE

5:解析content-length,创建INTERNET_BUFFERS结构
一旦你得到了句柄,调用HttpQueryInfo(使用HTTP_QUERY_CONTENT_LENGTH标记)得到接收数据的大小。如果HTTP头里
没有content-length参数,函数会失败。
创建INTERNET_BUFFERS结构。
INTERNET_BUFFERS ib = { sizeof(INTERNET_BUFFERS) };
ib.lpvBuffer = 你申请的缓冲
ib.dwBufferLength = 缓冲长度
dwBufferTotal供你自己使用,永远不会被WinInet该变(据我所知)。我用它来存储收到数据的总长度。

6&7&8:循环读取剩余数据
调用InternetReadFileEx(使用IRF_ASYNC标记)异步读取剩余数据。不要使用InternetReadFile,因为它是同步函数。

你必须循环调用InternetReadFileEx,直到ib.dwBufferLength为0。在每次循环前你必须调整lpvBuffer指针位置,重置ib.dwBufferLength。
BOOL bOk = InternetReadFileEx( m_hHttpFile, &ib, IRF_ASYNC, (LPARAM)this );
if(!bOk && GetLastError()==ERROR_IO_PENDING)
  等待...

while( bOk && ib.dwBufferLength!=0 )
{
  (调整ib值)
  bOk = InternetReadFileEx( m_hHttpFile, &ib, IRF_ASYNC, (LPARAM)this );
  if(!bOk && GetLastError()==ERROR_IO_PENDING)
    等待...
}

你的回调函数会收到这些消息:
[connect] InternetStatus: 40 (receiving response)
[connect] InternetStatus: 41 (response received)
[connect] InternetStatus: 50
[connect] InternetStatus: 51
还可能
[connect] InternetStatus: 100 INTERNET_STATUS_REQUEST_COMPLETE

最后一个只有在GetLastError值为ERROR_IO_PENDING才会得到。如果你用dwBufferTotal存储了数据总大小(按字节),把你的字符缓冲最后一位置置为0(如果是字符的话)。
buf[ib.dwBufferTotal] = 0;

9:关闭连接句柄
InternetCloseHandle( m_httpFile );
关闭时,回调会收到这个消息:
[connect] InternetStatus: 70 INTERNET_STATUS_HANDLE_CLOSING

大多数错误例子中,连接都会出乎意料的关闭。此时,你会收到70在100(INTERNET_STATUS_REQUEST_COMPLETE)之后。

此情形在整个过程都可能会发生。

10:关闭m_Session句柄前
你应该卸载回调:
InternetSetStatusCallback( m_Session, NULL );

以上将帮助那些使用WinInet异步方式的人。(之后是老美希望大家购买他的代码,略过...)

 

发送文本数据至远端的HTTP server 1. internet 函数的运用。 InternetOpen打开远端server, 使用HttpSendRequestEx函数发送数据 通过InternetReadFile读取文件信息。 并结合writefile 函数, 把远端server回馈的信息写在本地log中. 2.调用DLL文件: wininet.lib #pragma comment(lib,"wininet.lib") 需包含头文件: #include<wininet.h> 具体参见本例代码 立即下载

相关推荐

[TI板]MSPM0G3507——keil环境配置+烧录配置+vscode配置+空工程迁移+点灯+芯片解锁教程

本文介绍了MSPM0G3507开发环境的配置与烧录方法。主要内容包括:1)下载安装芯片支持包和SDK开发工具;2)通过串口或DAPLink两种方式实现程序烧录,详细说明了UniFlash软件的使用步骤和常见问题解决方法;3)简要提及工程迁移和LED点灯等基础操作。文章提供了完整的开发环境搭建指南,涵盖从软件安装到实际烧录的全过程,并附有相关工具下载链接和操作截图,帮助开发者快速上手MSPM0G3507开发。

qq_23220445的博客 1万+

InternetOpen InternetOpenUrl InternetReadFile 和 InternetCloseHandle

InternetOpen 函数功能 初始化应用程序对WinINet函数的使用 函数声明 INTERNETAPI_(HINTERNET) InternetOpenA( _In_opt_ LPCSTR lpszAgent, _In_ DWORD dwAccessType, _In_opt_ LPCSTR lpszProxy, _In_opt_ LPCSTR lpszProxyBypass, _In_ DWORD dwFlags ); 第一个参数 指向以null终

寻梦&之璐 4276

机器学习笔记 - 基于深度学习(HomographyNet)的图像单应性估计

论文提出了一个深度卷积神经网络来估计一对图像之间的相对单应性。我们的前馈网络有10层,以两个堆叠的灰度图像作为输入,并产生一个8自由度的单应性,可用于映射从第一个图像到第二个图像的像素。我们为HomographyNet提出了两种卷积神经网络架构一个直接估计实值单应性参数的回归网络,以及一个在量化单应性上产生分布的分类网络。我们使用4点单应性参数化,将一个图像的四个角映射到第二个图像。我们的网络使用扭曲的MS-COCO图像以端到端的方式进行训练。论文的贡献如下。........................

学以致用 知行合一 3083

WinInet使用详解

WinInet是windows平台对socket进行一层封装,用来直接处理http/ftp/Gopher协议的一套windows API。我第一次接触这个是在一个客户那里,当时因为客户都需要使用http代理才能浏览网页,所以折腾了一天,才基本掌握。而时隔没多久又忘记的差不多了,这个流程就像正则表达式一样,常学常忘,常忘常学。而网络上流传的WinInet代码实例,不是编译不通过,就是粗制滥造。因此现

左雪菲的专栏 2万+

【CANdelaStudio编辑CDD】-21.2-创建OBD诊断$03,$07,$0A和$04服务以及OBD DTC

案例背景(共11页精讲):创建OBD诊断$03,$07,$0A和$04服务;以及OBD DTC。 在《【ISO15031_OBD诊断】-3.1-$03服务Request emission-related diagnostic trouble codes理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/122157513》, 《【ISO15031_OBD诊断】-7.1-$07服务Request emission-related diagnostic trou

「汽车电子助手」的博客 1697

NX二次开发PK获取对象类型

PK_ENTITY_ask_class(),获取对象类型建议用这个函数,比较通用,包含所有对象类型,可以替代UF_MODL_ask_edge_type(),UF_MODL_ask_body_type(),UF_MODL_ask_face_type()等函数。

qq_39541524的博客 827

Windows Mobile下WinInet的异步使用方法

codeproject上有一篇老美写的关于HTTP异步的文章:http://www.codeproject.com/KB/IP/asyncwininet.aspx。我做HTTP异步的时候,也是参考了这篇文章,受益匪浅。今天特地翻译出来,与大家共飨。WinInet HTTP的异步方式使用绪论如果你曾经深入MSDN研究过WinInet API,你会注意到可使用异步方式且该方式是被推

小李匪盗的专栏 5650

80、编程学习资源与x86知识全解析

本文详细介绍了编程学习中多个领域的优秀书籍和博客资源,涵盖逆向工程、C/C++、x86/x86-64架构、ARM、汇编语言、Java、UNIX、密码学等多个方向。同时,深入解析了x86架构的核心知识,包括术语、通用寄存器、FPU寄存器、SIMD寄存器、调试寄存器以及常用指令的使用方法和操作步骤。通过本文,读者可以系统地掌握底层编程知识,并应用于逆向工程、系统开发和性能优化等领域。

tree的博客 219

使用InternetOpenUrl挂起的一个解决方案

使用InternetOpenUrl挂起的一个解决方案 在某个同事留下的网络操作代码中,如果用户试图从网络打开一个实际并不存在的URL, 走到InternetOpenUrl这步,应用程序就一命呜呼了。这个API并没有按照文档上说的那样返回一个NULL给文件HANDLE,而是完全停止响应。他尝试使用InternetSetOption来设置超时的时限,代码里这样写DWORD n = 10

Ackarlix的专栏 2077

LeetCode 面试经典 150 题回顾

最经典 150 题,掌握面试所有知识点 面试经典 150 题 : 题目分析、解题思路、复杂度分析、代码展示

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 8万+

28_Spring AI 干货笔记之 OpenAI 聊天功能

本文详细介绍了在Spring AI框架中集成OpenAI聊天模型的方法。内容涵盖API密钥配置、通过starter依赖启用自动配置、连接与模型参数的详细设置,并重点说明了运行时选项的动态覆盖机制。文章还深入讲解了多模态处理(图像与音频)、结构化输出、函数调用等高级功能,提供了示例控制器和手动配置指南,并讨论了与OpenAI兼容服务器的适配与推理模型思维链的获取。

在科技的浪潮中,我们寻找着创新的火种,在代码的海洋里,我们编织着智慧的网。腾飞开源,就是这样一个由技术精英汇聚而成的博客平台,我们致力于分享在Java、Python、IoT和人工智能等领域的最新研究成果和实战经验。 在腾飞开源的博客上,你会看到紧跟技术前 1655

Windows Mobile下WinInet的异步使用方法 (转)

codeproject上有一篇老美写的关于HTTP异步的文章:http://www.codeproject.com/KB/IP/asyncwininet.aspx。我做HTTP异步的时候,也是参考了这篇文章,受益匪浅。今天特地翻译出来,与大家共飨。WinInet HTTP的异步方式使用绪论如果你曾经深入MSDN研究过WinInet API,你会注意到可使用异步方式且该方式是被推崇的。当你决定使用该

lmingnet的专栏 506

Arduino ESP8266通过 RF433数据收发实验

Arduino ESP8266通过 RF433射频模块实现数据收发实验 写这篇文章,折腾了2天,在没有成功之前,一直在摸索和采坑当中,不要问我黑暗和黎明之间有多长。开发很多时候只问结果,不问过程的,在这里分享来之不易的结果,希望后面的人不要采坑,有成功的案例先河,后面与之相关的应用开发只需要套用模板修改即可实现。 实物搭建 RF433模块 我使用的是这个:nodemcu 本案例开发所使用到的库:RadioHead:http://www.airspayce.com/mikem/

perseverance51博客 3804

Windows Mobile下异步使用WinInet库下载数据

现在windows mobile系统虽然开始渐渐淡出人们的视线,我现在也转到android上了,可是做了这么些年windows mobile开发总觉得要留下点什么,所以开始写点这方面的博客留个纪念,其实是把以前的东西重新整理回顾一下。使用WinInet库进行网络下载时,通常使用InternetReadFile函数,但它是同步下载,所以当正在下载时网络突然断线,程序有可能会卡在这个函数当中,当然也可以设置一个超时来控制。当程序必须退出时,使用同步方式的话则必须等待函数完成或超时,而用异步方式则可以方便的控制。

hcxhy_only的专栏 737

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

windows mobile下的wininet的使用

  同步的就不说了,网上和MSDN上有代码。 对于异步的处理,贴上源代码。参考MSDN上面的代码和网上一些前辈的代码。 加上了我自己的一些理解和注释,方便后来学习者学习或直接使用。 HttpSession.h 1 #pragma once 2 3 #include <vector> 4 #include <WinInet.h>...

weixin_34344403的博客 122

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

windows mobile下的wininet的使用2(整理后)

#pragma once#include <vector>#include <WinInet.h>#include "NetDefine.h"#define T_ACCEPT_ENCODING "Accept-Encoding"#define T_CLIENTAGENT "Client-Agent"#de...

weixin_34389926的博客 105

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Windows mobile 连接管理

进行windows mobile网络应用开发,必须要了解如何建立gprs等网络连接。windows为我们提供了conn manager来完成这类功能。首先:WM5 SDK中的示例cmhelper基本包含了conn mgr的用法。默认安装的示例代码的路径是:C:/Program Files/Windows CE Tools/wce500/Windows Mobile 5.0 Pocket P

nobugtodebug的专栏 2894

WINDOWS MOBILE winnet开发心得

最近做了一下WINNET的研究,有一些心得和大家分享一下。我们先看看其相关的一些函数:1)InternetOpen;2)InternetOpenUrl;3)HttpQueryInfo;4)InternetReadFile;5)InternetCloseHandle。上面是同步的函数,在第2步和第4步,<span class="t_tag" onclick="function onclick

Python爱好者的专栏 4238
上一篇: 【转】HTTP协议头字段及分析
下一篇: 【转】深度解析VC中的消息传递机制
code09
博客等级 码龄18年 31粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值