最新要闻
- 孙海洋夫妇餐饮公司被列经营异常:本人回应
- 今日报丨香港男子深圳上班每天通勤4小时:月薪3万 每天通勤费用80元
- 当前观察:大获成功!《最后生还者》成史上收视率最高的游戏改编剧
- 爆款椰子鞋停售后:阿迪在中国凉凉了
- 1.3kg下颜值、性能、屏幕全给你!华硕灵耀14 2023评测:续航惊人
- 观热点:长城汽车发布Hi4全新新能源技术:4驱享受 2驱能耗
- 全球关注:杠上比亚迪秦PLUS DM-i 新款日产轩逸上市:9.98万起
- 8GB、16GB显存的性能差多少?实测多达172%!
- AMD最强核显跑分上来了!但是还打不过GTX 1650 Ti
- 全球最新:买丰田bZ4X电动车 送一辆威驰轿车?4S店回应:活动属实
- RTX 30公版显卡突然集体消失!刚刚降价40%
- 微头条丨公司规定不接董事长电话1次罚10000元 员工:试岗1天就走了
- 【全球快播报】校友承诺捐赠1100万元却不兑现被告 学校:他具备履约能力
- 紧跟微信步伐:支付宝掌纹支付设备外观专利获授权
- 【天天快播报】搅局中端市场!一加Ace2V评测:将16G满血内存进行到底
- 通讯!破壁机虚标功率后 疯狂小杨哥带货又翻车:面霜因虚假宣传被罚
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
对C++做爬虫的代码进行简单分析
有这样一段代码
#include #include #include #include#pragma comment(lib, "urlmon.lib")int main() {TCHAR url[] = TEXT("https://img.paulzzh.tech/touhou/random?site=all&size=all");//一个很正常向的东方project图片APITCHAR filePath[] = _T("祖传色图.jpg");HRESULT res = URLDownloadToFile(NULL, url, filePath, 0, NULL);if (res == S_OK) {printf("色图Ok,单击任意键以退出喵\n");system("pause");}else if (res == E_OUTOFMEMORY) {printf("你的电脑内存不足喵\n");system("pause");}else if (res == INET_E_DOWNLOAD_FAILURE) {printf("色图服务器挂了喵\n");system("pause");}else {printf("Other error: %d\n", res);system("pause");}return 0;}
这段代码使用了 URLDownloadToFile 函数从指定 url 下载文件到本地电脑,具体来说:
(相关资料图)
1.导入了 stdio.h、 tchar.h、 windows.h 和 urlmon.h 头文件,其中 urlmon.h 声明了 URLDownloadToFile 函数,通过 #pragma comment(lib, "urlmon.lib") 链接库文件。
2.定义了一个 TCHAR 类型的 url 指针变量,用于存储下载图片的 url。
3.定义了一个 TCHAR 类型的 filePath 指针变量,用于指定下载后保存的文件路径。
4.调用 URLDownloadToFile 函数,它的四个参数分别是:
- 用于控制 url 连接的 LPUNKNOWN 指针,这里传入 NULL。
- 要下载的文件 url,即上一步定义的 url 变量。
- 要保存到本地的文件路径,即上一步定义的 filePath 变量。
- 用于显示下载进度和其他信息的 DWORD 类型指针,这里传入 NULL。5.根据函数返回值判断下载是否成功,返回值有几种情况,分别对应不同的错误情况,这里设置了三种情况的处理方式:
- S_OK 表示下载成功,输出 "色图Ok,单击任意键以退出喵"。
- E_OUTOFMEMORY 表示内存不足,输出 "你的电脑内存不足喵"。
- INET_E_DOWNLOAD_FAILURE 表示下载失败,输出 "色图服务器挂了喵"。
- 其他情况输出 "Other error: " 后接错误值。6.返回 0,程序结束。总的来说,这段代码的作用是从指定 url 下载指定图片,并处理下载过程中可能遇到的错误情况。
Q:
#include#pragma comment(lib, "urlmon.lib")
A:这两行代码的作用是使用 urlmon.h 头文件中定义的函数,并将 urlmon.lib 库文件链接到程序中。
#include
:该头文件包含了许多与网络相关的函数和常量,例如常用的 URLDownloadToFile 函数,用于从互联网上下载文件,使得在 C/C++ 语言中处理网络操作更加方便。
#pragma comment(lib, "urlmon.lib")
:这行代码告诉链接器,在链接时将 urlmon.lib 库文件链接到可执行文件中,使得程序在运行时可以正确调用 urlmon.h 头文件所定义的 API 函数。可以看作是编译器通过指定链接器选项,告诉链接器在本程序中加入某种库文件的一种简便方法,避免了手动在编译器选项中设置链接器参数。
一般地,只要是要使用某一个库文件(比如链接器库文件),就需要使用 #pragma comment 语句将该库文件链接到程序中,使得程序在运行时可以正确调用引入库的 API 函数或数据。
另外,需要注意的是,在使用 #pragma comment 语句指示链接器链接库文件时,要保证库文件已经正确安装在包含该头文件的开发环境中。否则在编译或链接时可能会出现错误。
Q:代码中的TCHAR是干什么的
A:TCHAR 是在 Windows 平台下为处理 Unicode 和 ANSI 字符集转换而定义的一个宏,具体是根据编译时定义的 _UNICODE 预处理宏来决定其实际指向的类型,是 wchar_t 类型或 char 类型的两者之一,方便编程者在不同编译环境下编写跨平台的代码。
在 Windows 系统中,通常情况下字符集会有 ANSI(A)和 Unicode(W)两套实现,对应着带字符串后缀的函数和宏。例如:strcmp 和 strstr 是 ANSI 字符集下的字符串处理函数,而 wcscmp 和 wcsstr 则是 Unicode 字符集下的字符串处理函数,通过宏变量 TCHAR 的定义,可以根据编译器的预处理指令选择使用相应的字符集。
在这个代码中,TCHAR 用于定义字符串类型,使得可以根据编译器预处理器指令决定是使用 Unicode 字符集还是 ANSI 字符集。在该代码中,通过 TEXT 宏,使用了 TCHAR 类型的变量 url 和 filePath,分别存储了下载文件的 URL 地址和文件保存的路径,后续调用 URLDownloadToFile 函数时作为函数参数传入,以完成从指定 URL 下载文件并将其保存到本地电脑的目的。
Q:TCHAR filePath[] = _T("祖传色图.jpg"); 这个_T是什么意思
A:_T 是 Visual Studio 中的一个宏,它可以让同一个代码在不同的编译器下正确地处理字符串, 它实际上就是根据不同的编译器预处理器指令来决定是使用 Unicode 字符串还是 ANSI 字符串。在 Unicode 编译器下, _T 宏会将字符串常量添加一个 L 前缀,表示使用的是 Unicode 格式的字符串,否则不会添加 L 前缀,表示使用的是 ANSI 格式的字符串。
在本代码中,TCHAR 也是一个由编译器预处理器决定的宏,如果在代码头文件中定义了 _UNICODE 宏,它就会被预处理为 wchar_t 类型,表示使用的是 Unicode 字符集;如果没有定义 _UNICODE 宏,则 TCHAR 会被预处理为 char 类型,表示使用的是 ANSI 字符集。
综合来看,_T 宏为了保证代码可以在 Unicode 和 ANSI 编译器下都可以工作。在这个代码中,TCHAR filePath[] = _T("祖传色图.jpg"); 可以根据编译器预处理器的设置,自动将字符串常量 祖传色图.jpg 转换为适合的格式,并赋值给 filePath 变量。如果预处理器指定使用 Unicode 编译器,则 TCHAR 宏会被预处理为 wchar_t 类型,则 filePath 也会被定义为 wchar_t 类型的数组,并接收 Unicode 字符串;如果预处理器指定使用 ANSI 编译器,则 TCHAR 宏不起作用,filePath 也会被定义为 char 类型的数组,并接收 ANSI 字符串。
Q:那这代码中,我不用TCHAR行不行
A:使用 TCHAR 并不是必须的,你可以使用 char 或者 wchar_t 来代替 TCHAR,只需要保证字符集的一致性即可。比如,在该代码中,你可以将声明 TCHAR url[] 和 TCHAR filePath[] 的语句改写如下:
char* url = "https://img.paulzzh.tech/touhou/random?site=all&size=all";char* filePath = "祖传色图.jpg";
或者
wchar_t* url = L"https://img.paulzzh.tech/touhou/random?site=all&size=all";wchar_t* filePath = L"祖传色图.jpg";
这样就不需要使用 TCHAR 宏和 _T 宏了,而是直接使用 char 或者 wchar_t 类型来定义变量了。但是需要注意的是,如果你的程序需要在不同编译器之间进行兼容,建议使用 TCHAR 和 _T 这种跨平台兼容的方式实现。
Q:那HRESULT又是什么意思呢
A:HRESULT 是指 Windows 操作系统中的错误代码规范(Error Codes),它是由 32 位值构成,以表示返回结果的一种数据类型。HRESULT 具体用于描述函数或方法调用的状态和结果,同时包含了三个部分的信息:位 0-10 表示错误 Facilty;位 11-15 表示错误的级别 Severity;位 16-31 表示具体错误代码 Code。
在该代码中,HRESULT 类型的变量 res 用于存储函数 URLDownloadToFile 的返回值(函数的返回值类型为 HRESULT),以根据不同的返回值来表明不同的下载状态。具体来说:
如果函数返回值 res 等于 S_OK,表示下载成功;如果函数返回值 res 等于 E_OUTOFMEMORY,表示内存不足;如果函数返回值 res 等于 INET_E_DOWNLOAD_FAILURE,表示下载文件失败;如果函数返回值不是以上三种情况,则表示发生了其他未知错误,此时会调用 printf 函数,输出其他错误码的信息。一般情况下,在 Windows 编程中,函数的返回值类型为 HRESULT,并且根据返回值来进行错误码处理非常常见,使用 HRESULT 可以方便地表达函数调用的状态和结果,帮助程序员在开发和调试时快速定位问题。
关键词:
对C++做爬虫的代码进行简单分析
世界热推荐:2.HelloSpring
孙海洋夫妇餐饮公司被列经营异常:本人回应
今日报丨香港男子深圳上班每天通勤4小时:月薪3万 每天通勤费用80元
【全球独家】63.C++类型转换
世界今亮点!python可变长参数
当前观察:大获成功!《最后生还者》成史上收视率最高的游戏改编剧
爆款椰子鞋停售后:阿迪在中国凉凉了
1.3kg下颜值、性能、屏幕全给你!华硕灵耀14 2023评测:续航惊人
观热点:长城汽车发布Hi4全新新能源技术:4驱享受 2驱能耗
全球关注:杠上比亚迪秦PLUS DM-i 新款日产轩逸上市:9.98万起
8GB、16GB显存的性能差多少?实测多达172%!
明解数据库------数据库存储演变史
AMD最强核显跑分上来了!但是还打不过GTX 1650 Ti
全球最新:买丰田bZ4X电动车 送一辆威驰轿车?4S店回应:活动属实
RTX 30公版显卡突然集体消失!刚刚降价40%
微头条丨公司规定不接董事长电话1次罚10000元 员工:试岗1天就走了
【全球快播报】校友承诺捐赠1100万元却不兑现被告 学校:他具备履约能力
紧跟微信步伐:支付宝掌纹支付设备外观专利获授权
【天天快播报】搅局中端市场!一加Ace2V评测:将16G满血内存进行到底
通讯!破壁机虚标功率后 疯狂小杨哥带货又翻车:面霜因虚假宣传被罚
《王者荣耀》出海“首战告捷”:登顶巴西免费游戏榜
环球报道:记录--vue3+setup+ts 知识总结
【世界速看料】程序员养发神器:拒绝加班熬夜,告别秃头!
【世界聚看点】【希尔排序ShellSort算法详解】Java/Go/Python/JS/C不同语言实现
环球微头条丨【分享贴】项目中为啥总是项目经理一人干着急?
使用PostgreSQL而不是MySQL存储中型数据有什么好处?
3000块多品牌SSD质量大PK:整体比机械硬盘可靠
玩家购入二手Switch主机:可是被卖家坑惨了
航班晚点1小时 机长提速提前20分钟到达帮助乘客换机?山航回应
每人1600元!北京发放首批“京彩·绿色”消费券:买手机PC都能用
当前热文:涉及121万辆!我国2022年新能源汽车召回量创历史新高:电池、电机缺陷多
环球最资讯丨暴风的恋人百度云_暴风的恋人
有监督学习——线性回归
禁用XXE处理漫谈
腾讯-广点通转化归因
来真的!贾跃亭:3月30日生产FF91 百万豪车来了
【天天新视野】30个汽车品牌降价 成都发放消费券:满40万可减8000元
【世界独家】华硕发布TUF Gaming M3 Gen II鼠标:仅重59g、IP56防尘防水
全球今亮点!过期1天的食物还能吃吗?
日系中的另类!国产马自达CX-50内饰发布:原汁原味引入海外版
加速资源整合,星纪魅族围绕手机、XR、前瞻技术拓展智能生态
Prompt-Engineering-Guide 学习摘要2
今日关注:电动汽车综合检测
观焦点:这几个群,程序员可千万不要进!
每日快讯!12万元买宝马“3系”?宝马中国回应降价传闻:指导价没变
当前快讯:玩家不满《魔戒:咕噜》新宣传片:他没有主角光环!
环球热讯:小米搞出“新花样”:可层叠摄像模组专利获授权
焦点快报!没有秘密了!AI或能够读取大脑重现梦境
今日快看!新老代表接力提建议将牡丹定为国花:100多个国家都有国花了
【天天报资讯】山西李家大院哪些人可以享受半价票优惠
环球新资讯:【机器学习】1. 广义线性模型
【世界新视野】密码学报如何正确Latex投稿?
环球今亮点!快 40 岁,刚被裁。。
金三银四每天一个.NET基础知识巩固(一)
今日要闻!从“13 天”到“0 天”延时,揭秘火山引擎 DataLeap SLA 保障最佳实践
世界热消息:谷歌报复性砸出5620亿参数大模型:比ChatGPT更恐怖 学术圈已刷屏
【环球播资讯】2月国产游戏出海成绩出炉:《原神》获收入和增长双料冠军
Nginx http 文件服务器 中文名称文件乱码以及不能访问下载问题 (解决全过程)
有关马的歇后语有哪些?有关马的古诗有哪些?
工科理科化现象亟待扭转!曹德旺等科学家企业喊话让学生去工厂一线真问题
【世界时快讯】委员喊话农村淘汰、封杀老头乐 网友吵翻:揭秘观点背后让人唏嘘?
隐婚男女的结局是什么?隐婚男女演员介绍
小学二年级班主任工作计划有哪些?小学二年级家长会发言稿
消防逃生的注意事项有哪些?消防逃生演练总结
旅游可持续发展的实质是什么?旅游可持续发展论文模板
英语六级考试时间安排分配是什么?英语六级考试题型简介
世界热头条丨虼蚤的读音是什么_虼蚤
描写景色的词语集锦有哪些?描写景色的段落摘抄
梁祯元为什么叫南韩贾宝玉?梁祯元为什么是队长?
中国相术十二宫都有哪些?相术十二宫实用顺口溜
田宅宫在脸上的什么位置?田宅宫代表什么?
Linux 上的开源视频字幕应用–Live Captions
全球信息:Win10专业版激活方法
【环球播资讯】kafka常用指令
剑指Notion:微软协作平台Loop即将进入公开预览阶段
当前滚动:又来一个“保时捷” 江汽EV3申报:国内首搭载46系列大圆柱电芯
160g超满足:嘉兴特产蛋黄大肉粽2.9元/只大促
环球播报:从“看不起”到“跟不上”:200多名理想汽车车主分享用车体验
热头条丨《街霸6》新解说员宣传片:日本少女冠军人美声甜!
新消息丨国内“投教第一股”九方财富登陆港股,业绩亮眼,市值逼近80亿
面向状态机编程:复杂业务逻辑应对之道
多光源渲染方案 - Many Lights Sampling
世界微动态丨在java中String类为什么要设计成final?Java面试常见问题
报道:LoadRunner——脚本优化(二)
马斯克要自建“乌托邦小镇”:员工全部搬进去 自己当“镇长”
拒绝投影行业亮度虚标!Vidda官宣三色激光全家桶新品
环球最资讯丨新一轮国内油价将于17日迎来调整:有再度搁浅可能
【环球聚看点】彻底解决“刹车争议”!电商平台上线特斯拉脚部专用记录仪:全程摄像
当前播报:简单到复杂:C#拷贝文件的3种方法
环球热门:对LSTM应用于图像的初步理解
【数论与组合数学 1】数论简介、素数、算数基本定理
JS回调地狱
天天视讯!GTX 1050 Ti就能跑!顽皮狗公布《最后生还者:Part 1》PC版配置要求
世界看点:自称12年驾龄 特斯拉Model X车主在线维权:踩刹车没反应加速撞柱子
天天观察:苹果古典音乐软件已上架:Apple Music会员免费用!中国市场随后推出
当前资讯!明基推出首款48寸OLED电竞显示器:4K 120Hz、90W反向供电
《生化危机4:重制版》PS5版疑似已偷跑 小心剧透啊
世界百事通!illustrator学习心得体会(illustrator序列号)
工厂模式进阶用法,如何动态选择对象?