如何使用 WinInet 提供下载 / 限上载进度信息

WinInet带进度下载Http文件 WinInet带进度条下载Http文件 利用wininet API函数来下载web文件并操作进度条 立即下载
 

概要

是使用 WinInet 函数来下载或上载文件在 Internet 上许多开发人员要提供一个进度栏来指示完成文件传输的数量和不再将花费多少。 要做到这与以下机制。

更多信息

以获取有关下载进度通知使用 InternetSetStatusCallback 使您进行请求如何同时, 包括连接状态通知好信息。 但是, 它并不表示已完成的传输特定百分比。

要获取百分比与完成通知, 需要确定传输的大小, 然后调用 InternetReadFile 或 InternetWriteFile 与小缓冲区。 作为函数调用完成然后可计算传输的百分比。

例如, 假设您想要下载 1000 字节文件。 而不是一个呼叫到 InternetReadFile 与 1000 字节缓冲区, 您可以进行到 InternetReadFIle 10 调用与 100 字节缓冲区。 这样如 InternetReadFile 每调用完成, 您知道下载是另一个完整 10%。

以下代码阐释此过程:
#include<windows.h>
#include<wininet.h>
#include<iostream.h>

void main(int argc, char *argv[])
{
    if (argc != 3)
    {
        cout << "Usage: progress <host> <object>" << endl;
        return;
    }

    HINTERNET hSession = InternetOpen("WinInet Progress Sample",
                                      INTERNET_OPEN_TYPE_PRECONFIG,
                                      NULL,
                                      NULL,
                                      0);
    HINTERNET hConnection = InternetConnect(hSession, 
                                            argv[1],  // Server
                                            INTERNET_DEFAULT_HTTP_PORT,
                                            NULL,     // Username
                                            NULL,     // Password
                                            INTERNET_SERVICE_HTTP,
                                            0,        // Synchronous
                                            NULL);    // No Context

    HINTERNET hRequest = HttpOpenRequest(hConnection, 
                                         "GET",
                                         argv[2],
                                         NULL,    // Default HTTP Version
                                         NULL,    // No Referer
                                         (const char**)"*/*/0", // Accept
                                                                // anything
                                         0,       // Flags
                                         NULL);   // No Context
    HttpSendRequest(hRequest,
                    NULL,    // No extra headers
                    0,       // Header length
                    NULL,    // No Body
                    0);      // Body length

    DWORD dwContentLen;
    DWORD dwBufLen = sizeof(dwContentLen);
    if (HttpQueryInfo(hRequest, 
                      HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, 
                      (LPVOID)&dwContentLen,
                      &dwBufLen,
                      0))
    {
        // You have a content length so you can calculate percent complete
        char *pData = (char*)GlobalAlloc(GMEM_FIXED, dwContentLen + 1);
        DWORD dwReadSize = dwContentLen / 10;   // We will read 10% of data
                                                // with each read.

        cout << "Download Progress:" << endl;
        cout << "    0----------100%" << endl;
        cout << "     ";
        cout.flush();

        DWORD cReadCount;
        DWORD dwBytesRead;
        char *pCopyPtr = pData;
        for (cReadCount = 0; cReadCount < 10; cReadCount++)
        {
            InternetReadFile(hRequest, pCopyPtr, dwReadSize, &dwBytesRead);
            cout << "*";
            cout.flush();
            pCopyPtr = pCopyPtr + dwBytesRead;
        }
        // extra read to account for integer division round off
        InternetReadFile(hRequest,
                         pCopyPtr,
                         dwContentLen - (pCopyPtr - pData),
                         &dwBytesRead);
        // Null terminate data
        pData[dwContentLen] = 0;

        // Display
        cout << endl << "Download Complete" << endl;
        cout << pData;
    }
    else
    {
        DWORD err = GetLastError();
        // No content length...impossible to calculate % complete
        // Just read until we are done.
        char pData[100];
        DWORD dwBytesRead = 1;
        while (dwBytesRead)
        {
            InternetReadFile(hRequest, pData, 99, &dwBytesRead);
            pData[dwBytesRead] = 0;
            cout << pData;
        }
    }
}
				
有几点要使用此方法时查找出:
•开始之前必须知道数据大小。 上述代码试图通过读取 Content-Length HTTP 头使用 HttpQueryInfo 函数确定数据大小。 尽管许多 HTTP 响应包括内容长度头, 它则不需要。 除非有其他机制来获取数据大小, 将不能来计算进度如果响应中不包含内容长度标头。
•如果您正试图上载或下载来自一个 FTP 资源, 不会能够使用 FtpPutFile 或 FtpGetFile 和希望确定进度信息。 应使用 FtpOpenFile, 然后使用 InternetReadFile 和 InternetWriteFile 如上所述。
•因为提供进度信息假定必须知道数据大小, 可使用 FtpGetFileSize 来获取 FTP 资源的大小之前下载文件。 注意 FtpGetFileSize 是不总是成功中获取文件大小因多种方式 FTP 服务器返回目录列表信息。 有关使用 FTP 来获取目录列表信息, 问题请参见下列文章 Microsoft 知识库文章:
172712 (http://support.microsoft.com/kb/172712/EN-US/) INFO: 限制的 WinInet FTP 函数
利用WinInet和多线程实现下载进度实时显示 朋友们对Internet文件下载一定不陌生,如果不讲究下载细节,一个API函数URLDownloadToFile就能搞定。但如果你要下载的数据量较大,或你的软件需要在线升级,那么,还是给个进度条让用户看看,免得让人以为你的软件已经挂掉。要实现这些,首先用到的就是多线程技术,把下载线程和界面线程分开;其次,要把下载进度及时反馈给界面进度条,还要用到WinInet提供的接口。 立即下载

相关推荐

http异步InternetSetStatusCallback

http 异步发送的代码,来自微软网站.InternetSetStatusCallback

如何使用 WinInet 时提供下载上载进度信息

概要许多开发人员都使用 WinInet 函数来下载或上载文件在 Internet 上的想要提供一个进度条以指示多少文件传输已完成,但多少就越长。您可以使用以下机制来完成此。Collapse image更多信息使用 InternetSetStatusCallback 来获取下载进度的通知为您提供良好的信息请求的进展如何,包括连接状态通知。但是,它不表示一定百分比的传输已完成。若要获取的百分比相当完整...

weixin_30604651的博客 166

Arduino+L298N电机驱动模块避坑指南:从接线到PWM调速的5个常见错误

本文详细解析了使用Arduino与L298N电机驱动模块时,从电源配置、跳线帽使用到PWM调速的5个常见错误与避坑指南。重点阐述了如何正确分离逻辑与电机电源、拔掉ENA/ENB跳线帽以实现PWM调速、理解H桥接线逻辑以控制直流电机正反转,并提供优化代码与散热建议,帮助开发者稳定驱动电机。

rust6ferris的博客 564

wininet编程,下载者程序,包括获取文件大小

看了一下wininet编程,底层实现其实封装了socket套接字,连接到服务器端口80,填充TCP数据部分作为HTTP协议的报头,然后SEND出去,等待recv的数据。          直接上代码吧            // 文件下载 CONSOLE.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #includ

qq287597590的专栏 1526

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 283

微信中调起支付宝支付

微信中调用支付宝支付,首先我们知道微信是不能直接调用支付宝的,所以我们需要使用一个中间页提示用户在浏览器中打开,然后进行网页支付或打开app支付。以下为详细唤起支付宝的步骤、业务代码以及相关页面图。 如有问题欢迎评论留言,看到定回复哦^_^\(^o^)/~ 一、微信中唤起支付宝,有几个步骤: 1、中间页引导用户在浏览器中打开去唤起支付宝。 2、浏览器中打开支付宝或app中打开支付宝。 3...

han_calligrapher的博客 2万+

Windows Internet编程基础--WinInet

可以使用 WinInet 添加 FTP 支持以从应用程序内下载文件和上载文件。可以重写 OnStatusCallback 并使用 dwContext 参数在搜索和下载文件时向用户提供进度信息。 本文包含以下主题: 创建一个非常简单的浏览器 下载 Web 页 FTP 文件 检索 Gopher 目录 传输文件时显示进度信...

weixin_34216036的博客 237

[LaTeX] 调整参考文献的格式(References),包括作者名缩写,行距,字体,引用顺序等等

在此记录我对LaTeX中参考文献references的尝试,主要涵盖如题几个方面。

the Blog of 等不到天亮丶等时光 4万+

C++实现FTP断点续传

C++实现FTP断点续传 一、前言 断点续传,顾名思义就是在文件传输过程中由于网络中断或其它原因造成传输中断,这时文件只传输了一部分,在下次在传输时能够接着前面的传输进度继续进行。在网络状况不稳定,特别是Internet环境下,特别有用。目前的通用下载工具,不论是HTTP下载工具,如NetAnts、FlashGet等,还是FTP下载工具,如CuteFTP等都具备断点续传功能。 二

9521

【数字IC/FPGA】低功耗设计

低功耗设计方法功耗的类型低功耗设计方法静态低功耗技术多阈值工艺方法电源门控方法体偏置动态低功耗技术多电压域(Multi-Voltage Domain)预计算门控时钟门级优化技术毛刺的消除逻辑级优化物理级优化控制输入向量低功耗Soc系统的动态管理动态电压及频率调节技术低功耗操作系统存储器功耗控制总结 功耗的类型 CMOS电路中的功耗由两部分构成,第一部分为负载电容充放电时引起的功耗,称为动态功耗,另一部分为漏电流引起的功耗,称为静态功耗。其中动态功耗包括翻转功耗和短路功耗。翻转功耗是数字电路中信号翻转时电容充

qq_40268672的博客 3073

RK3568平台开发系列讲解:Linux wifi的调试

查询结果中state为ENABLE,表示hostapd程序启用成功。首先查看设备是否存在。

内核笔记 168

在C++Builder下实现FTP断点续传

一、前言断点续传,顾名思义就是在文件传输过程中由于网络中断或其它原因造成传输中断,这时文件只传输了一部分,在下次在传输时能够接着前面的传输进度继续进行。在网络状况不稳定,特别是Internet环境下,特别有用。目前的通用下载工具,不论是HTTP下载工具,如NetAnts、FlashGet等,还是FTP下载工具,如CuteFTP等都具备断点续传功能。二、方案选择准省级任务调度系统的文件传

命运是一只沦落在鸡窝里的鹰 4463

C#实现低通和高通滤波算法

低通滤波器允许通过低于某个截止频率的信号成分,并且抑制高于该频率的成分。而高通滤波器则允许通过高于某个截止频率的信号成分,并抑制低于该频率的成分。巴特沃斯滤波器是一种对称的滤波器,具有平坦的幅度响应和最小的群延迟。低通和高通滤波是数字信号处理中常用的滤波技术,用于滤除或增强信号中的特定频率成分。在本篇文章中,我们将使用C#编程语言来实现低通和高通滤波算法。以上就是使用C#实现低通和高通滤波算法的示例代码。你可以根据自己的需求调整截止频率和采样率,将这些代码应用于你的项目中。是滤波器的截止频率,

XisVisual_Basic的博客 1275

利用WinInet和多线程实现实时显示的下载进度条

利用WinInet和多线程实现下载进度实时显示   作者:阿珊境界   源代码下载 大家对Internet文件下载一定不陌生,如果不讲究下载细节,一个API函数URLDownloadToFile就能搞定。但如果你要下载的数据量较大,或你的软件需要在线升级,那么,还是给个进度条让用户看看,免得让人以为你的软件已经挂掉。要实现这些,首先用到的就是多线程技术,把下载线程和界面线

阿珊境界 5666

华为OD机试 - 城市聚集度(Python/JS/C/C++ 2025 A卷 200分)

华为OD机试 2025A卷题库疯狂收录中,刷题。

学Java,找哪吒 1132

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

中国招商银行的网上银行专业版

中国招商银行的网上银行专业版前些天办理了一张招行的usb加密的U盘,花费了人民币88元,昨天晚上闲的无聊,简单分析了一下,发现了一些问题,具体内容请参考:http://www.liveaa.com/categories/120-Software-internal-analyze.首先, 关于usb读取方面,主要在开始登陆的时候使用,退出的时候也要被检测一下(次要), 在使用过程中,

vptr_grid的专栏 5625

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

wininet实现ftp客户端关于传输进度的分析

作者:   来源:csdn    更新日期:2002-08-06      wi

sanshao27的专栏 1707

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 中间层驱动工作原理
下一篇: 编写断点续传和多线程下载模块
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值