urlmon.dll网络操作API——URL语言函数 即时焦点
URLDownloadToFile是urlmon.dll提供的网络操作API,可以用于从指定的URL下载文件到本地,在C++中通过类很容易实现下载进度的获取,今天需要在C语言中使用到这个函数,这里记录一下使用方法。该函数的定义如下所示。
(相关资料图)
HRESULT URLDownloadToFile(
LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
_Reserved_ DWORD dwReserved,
LPBINDSTATUSCALLBACK lpfnCB
);
参数pCaller跟ActiveX和COM有关,如有兴趣参考
参数szURL为下载地址,地址的协议必须要是IE浏览器所支持的
参数szFileName为文件最终的保存路径,例如C:/a.txt
参数dwReserved保留,始终为0
参数lpfnCB是一个IBindStatusCallback指针。
在urlmon.h头文件的定义中,C语言风格的接口定义如下:
typedef struct IBindStatusCallbackVtbl
{
BEGIN_INTERFACE
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
__RPC__in IBindStatusCallback * This,
/* [in] */ __RPC__in REFIID riid,
/* [annotation][iid_is][out] */
_COM_Outptr_ void **ppvObject);
ULONG ( STDMETHODCALLTYPE *AddRef )(
__RPC__in IBindStatusCallback * This);
ULONG ( STDMETHODCALLTYPE *Release )(
__RPC__in IBindStatusCallback * This);
HRESULT ( STDMETHODCALLTYPE *OnStartBinding )(
__RPC__in IBindStatusCallback * This,
/* [in] */ DWORD dwReserved,
/* [in] */ __RPC__in_opt IBinding *pib);
HRESULT ( STDMETHODCALLTYPE *GetPriority )(
__RPC__in IBindStatusCallback * This,
/* [out] */ __RPC__out LONG *pnPriority);
HRESULT ( STDMETHODCALLTYPE *OnLowResource )(
__RPC__in IBindStatusCallback * This,
/* [in] */ DWORD reserved);
HRESULT ( STDMETHODCALLTYPE *OnProgress )(
__RPC__in IBindStatusCallback * This,
/* [in] */ ULONG ulProgress,
/* [in] */ ULONG ulProgressMax,
/* [in] */ ULONG ulStatusCode,
/* [unique][in] */ __RPC__in_opt LPCWSTR szStatusText);
HRESULT ( STDMETHODCALLTYPE *OnStopBinding )(
__RPC__in IBindStatusCallback * This,
/* [in] */ HRESULT hresult,
/* [unique][in] */ __RPC__in_opt LPCWSTR szError);
/* [local] */ HRESULT ( STDMETHODCALLTYPE *GetBindInfo )(
IBindStatusCallback * This,
/* [out] */ DWORD *grfBINDF,
/* [unique][out][in] */ BINDINFO *pbindinfo);
/* [local] */ HRESULT ( STDMETHODCALLTYPE *OnDataAvailable )(
IBindStatusCallback * This,
/* [in] */ DWORD grfBSCF,
/* [in] */ DWORD dwSize,
/* [in] */ FORMATETC *pformatetc,
/* [in] */ STGMEDIUM *pstgmed);
HRESULT ( STDMETHODCALLTYPE *OnObjectAvailable )(
__RPC__in IBindStatusCallback * This,
/* [in] */ __RPC__in REFIID riid,
/* [iid_is][in] */ __RPC__in_opt IUnknown *punk);
END_INTERFACE
} IBindStatusCallbackVtbl;
interface IBindStatusCallback
{
CONST_VTBL struct IBindStatusCallbackVtbl *lpVtbl;
};
这里的interface在C语言中的定义为struct, IBindStatusCallback回调实际上就是一个结构体,结构体只有一个字段IBindStatusCallbackVtbl *指针,你需要做的就是对这个结构体内的IBindStatusCallbackVtbl 指针进行实例化。IBindStatusCallbackVtbl 结构中包含了一系列的函数指针,也就是用于URLDownloadToFile下载时的回调函数。若要实现下载进度的获取,只需要在OnProgress回调中处理即可。
控制台示例代码
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#pragma comment(lib,"urlmon")
HRESULT (STDMETHODCALLTYPE QueryInterface)(
IBindStatusCallback* This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void** ppvObject)
{
return E_NOTIMPL;
}
ULONG (STDMETHODCALLTYPE AddRef)(
IBindStatusCallback* This)
{
return E_NOTIMPL;
}
ULONG (STDMETHODCALLTYPE Release)(
IBindStatusCallback* This)
{
return E_NOTIMPL;
}
HRESULT (STDMETHODCALLTYPE OnStartBinding)(
IBindStatusCallback* This,
/* [in] */ DWORD dwReserved,
/* [in] */ IBinding* pib)
{
return E_NOTIMPL;
}
HRESULT (STDMETHODCALLTYPE GetPriority)(
IBindStatusCallback* This,
/* [out] */ LONG* pnPriority)
{
return E_NOTIMPL;
}
HRESULT (STDMETHODCALLTYPE OnLowResource)(
IBindStatusCallback* This,
/* [in] */ DWORD reserved)
{
return E_NOTIMPL;
}
HRESULT (STDMETHODCALLTYPE OnProgress)(
IBindStatusCallback* This,
/* [in] */ ULONG ulProgress,
/* [in] */ ULONG ulProgressMax,
/* [in] */ ULONG ulStatusCode,
/* [in] */ LPCWSTR szStatusText)
{
if (ulProgress == 0) {
return S_OK;
}
printf("%d / %d bytes , %.2f%%\n",
ulProgress, ulProgressMax,100*(double)ulProgress/(double)ulProgressMax);
return S_OK;
}
HRESULT (STDMETHODCALLTYPE OnStopBinding)(
IBindStatusCallback* This,
/* [in] */ HRESULT hresult,
/* [unique][in] */ LPCWSTR szError)
{
return E_NOTIMPL;
}
HRESULT (STDMETHODCALLTYPE GetBindInfo)(
IBindStatusCallback* This,
/* [out] */ DWORD* grfBINDF,
/* [unique][out][in] */ BINDINFO* pbindinfo)
{
return E_NOTIMPL;
}
HRESULT (STDMETHODCALLTYPE OnDataAvailable)(
IBindStatusCallback* This,
/* [in] */ DWORD grfBSCF,
/* [in] */ DWORD dwSize,
/* [in] */ FORMATETC* pformatetc,
/* [in] */ STGMEDIUM* pstgmed)
{
return E_NOTIMPL;
}
HRESULT (STDMETHODCALLTYPE OnObjectAvailable)(
IBindStatusCallback* This,
/* [in] */ REFIID riid,
/* [iid_is][in] */ IUnknown* punk)
{
return E_NOTIMPL;
}
int main(int argc,char * argv[]) {
char path[MAX_PATH];
char downloadURL[] ="https://down.qq.com/qqweb/PCQQ/PCQQ_EXE/PCQQ2020.exe";
IBindStatusCallback callBack;
IBindStatusCallbackVtbl vtbl;
vtbl.QueryInterface = QueryInterface;
vtbl.AddRef = AddRef;
vtbl.Release = Release;
vtbl.OnStartBinding = OnStartBinding;
vtbl.GetPriority = GetPriority;
vtbl.OnLowResource = OnLowResource;
vtbl.OnProgress = OnProgress;//进度回调操作
vtbl.OnStopBinding = OnStopBinding;
vtbl.GetBindInfo = GetBindInfo;
vtbl.OnDataAvailable = OnDataAvailable;
vtbl.OnObjectAvailable = OnObjectAvailable;
callBack.lpVtbl = &vtbl;
GetTempPath(sizeof(path),path);
strcat(path, "tmpqq.exe");
printf("保存位置: %s\n", path);
URLDownloadToFile(NULL,downloadURL, path,0,&callBack);
return 0;
}
扫码领个红包作为打赏吧~~
(余额宝支付时可抵现)
赏
喜欢 (2)or分享 (0)
标签:
相关推荐:
最新新闻:
- 日常运维笔记之Apache的工作模式及使用方法
- 【全球播资讯】手机忘记手势密码怎么办?教你一招
- MySQL怎么下载安装?MySQL如何卸载干净?
- ldquo 职称 rdquo 用英文怎么写
- 清房协租赁住房发展趋势研讨 暨金地产业园区及租赁住宅参观活动|天天热点
- urlmon.dll网络操作API——URL语言函数 即时焦点
- python爬虫中的session和cookie如何破解?方法步骤
- 微软将以690亿美元收购动视暴雪:有望于本周获批
- 2023第一季度中国智能门锁TOP10出炉:小米市场占有量第一 天天百事通
- 吸毒者的照片真实照片_吸毒者的恐怖图片
- 逼近GTX 1060!AMD Radeon 780M核显实测来了 全球速看
- 【干货】什么是ETF期权?到底如何交易?
- 天天简讯:VR是什么东西?虚拟现实为什么再次收到人们的关注?
- 亮点十足质价比高 华为超联接笔记本MateBook D 14开售 世界通讯
- 赋能教育数字化转型,华为终端商用携六大智慧解决方案亮相教育装备展 关注
- 海尔AWE惊喜不断这次又有哪些亮点?_世界微速讯
- 香港的麻辣教师(麻辣老师)
- 六横登高架设作业安全培训考证忙 没有登高架设作业证书别想上岗挣钱
- 焦点精选!旅行丨去过云南泼水节,上战场都不怕了!
- 抓班子带队伍方面存在问题具体整改措施整改时限_抓班子带队伍方面存在的问题
- Mysteel:18省份合计公布182个钢铁项目-环球今头条
- 米哈游重拳出击:海外《原神》泄密论坛遭侵权警告 短讯
- 恐怖悬疑游戏《爱冒险的阿曼达》上线Steam 目前好评
- 环球快资讯:中金湖北科投光谷产业园封闭式基础设施证券投资基金获通过
- 讯息:办理房产证大概需要多少钱
- 警惕!295家假冒国企名单公布
- 特殊二维码图片疯传全网:可导致微信闪退|全球热消息
- 5月1日苍南到临海自驾游什么路线最便捷(苍南开车到台州多久时间)
- 范伟黑社会电影有哪些 范伟个人资料简介_世界报道
- 博主惊呼小米13 Ultra四摄高度统一:简直就像1颗镜头拍的
- 长虹美菱(000521):该股换手率大于8%(04-26)
- 阿里旗下菜菜超市公司增资至1.11亿
- 香港嘉年华开幕点燃Web3.0之火,微美全息(WIMI.US)把握黄金起点开拓新篇章|全球快讯
- 金至尊铂金多少钱一克(2023年04月26日)参考价格 每日看点
- iPhone 15 Pro Max仍用14同款主摄,超大底要等到iPhone 16
- 这些增量资金或驰援股市!_全球短讯
- 首销正式开启,华为nova11系列X Manner联名打造时尚新玩法
- 当前速看:2023年Q1中国智能手机市场销量下跌5.4%,OPPO位列安卓第一
- 碾压张本美和!国乒15岁神童三连冠,比孙颖莎小8岁,马琳新王牌
- 海尔知识产权布局“有道”:高价值专利助力高质量发展|新消息
- 【报资讯】韩国校园爱情电视剧排行榜(韩国校园爱情电视剧)
- 户外储能成新蓝海,主力消费市场在海外|新消费观察 焦点要闻
- 在华市占率降至1.6%,韩系还有救吗?
- 《守望先锋2》上线社区制作地图“爪兰蒂斯” 限时游玩_环球精选
- 时讯:嘉曼服饰:公司2023年一季报中的1,504,550,248.68元交易性金融资产为银行理财产品及结构性存款
- 能带上飞机 40000mAh移动电源首发899元:300W输出
- 填补广西半导体制造领域的空白!广西首个集成电路晶圆级封测制造项目竣工投产-今日播报
- 品味书香写一段话20字_品味书香一段话 最新快讯
- 汉川一季度财政总收入17.98亿元 实现首季“开门红”
- 国台办:台当局至今仍单方面限制大陆2400多项产品输入_天天速讯
- 《守望先锋2》上线社区制作地图“爪兰蒂斯” 限时游玩_环球精选
- 雅虎日本:日本婚恋市场上宅男变得抢手-世界今日讯
- 父母遇害,15岁孤女名下房产被舅舅过户给其前妻,检察院支持起诉追回
- 当前快报:首届“春城火焰蓝杯”运动会开幕
- 环球观天下!企业管理咨询有限公司经营范围包括_企业管理咨询有限公司经营范围
- 汉川一季度财政总收入17.98亿元 实现首季“开门红”
- 浩淼科技去年扣非后利润增51%:第一大产品收入毛利率齐升 向智造转型升级更进一步
- 克山县:让“信用数据”变为“真金白银”
- 老板电器2022全年归母净利15.72亿元,2023一季度归母净利3.89亿元同比增5.72%
- ChatGPT将推出企业版订阅服务|快消息
- 国家邮政局:一季度邮政行业业务收入完成3562.1亿元,同比增长9.0%_每日看点
- 2023北京八年级体育与监考机考评分标准一览 世界资讯
- 带上这份攻略,畅游五一热门小众旅游目的地——安图
- 2023年金牛座事业运6月运程详解 忙碌反倒坏事?
- 比肩魔术师!特雷-杨前10场季后赛20+10历史第5人
- 跨越速运发布五一假期时效安排
- 蜜糖欢小说结局 蜜糖欢|环球关注
- 港股概念追踪 | “五一”假期倒计时!“开心香港”一系列活动展开 香港再迎消费热潮(附概念股)|头条
- 电影市场整体逐步复苏向好 中国电影一季度净利1.8亿元
- 1台利润是安卓机10倍!iPhone翻新机全球卖爆:系统不卡 保值好
- 天天快看点丨国能新材2022年净利1268.23万同比扭亏为盈 公司业绩增长
- 天天观天下!长源电力(000966):股价成功突破年线压力位-后市看多(涨)(04-26)
- 《闪电侠》电影新海报:迈克尔·基顿版蝙蝠侠、女超人亮相! 每日看点
- 《艾尔登法环》DLC去年4月就在开发!已经做了一年了
- 美媒:美第一共和银行股价腰斩 或变卖千亿美元资产_资讯推荐
- 重拳出击:海外《原神》泄密论坛遭律师函警告
- ARPG《恸哭机巧》宣布延期 7月27日发售-新资讯
- 当前报道:《微软飞行模拟》最新世界更新 大洋洲和南极洲美景
- 传iOS17将首次开放iPhone侧载 安装第三方应用程序
- 反复躯体不适?或许患有焦虑症!-环球今日讯
- Stellantis寻求裁减约3500个美国小时工_全球观热点
- 点赞!女子怀抱婴儿落水,3名男子跳河救人_资讯
- 江苏:一季度民营企业进出口5043.3亿元 增长7.6%-焦点快报
- 全球观天下!民宿火爆、玩偶走俏……这只“萌兽”带来可观经济效益
- 国家消防救援局:部署各地全力推进火灾隐患排查整治