当前位置: 首页 > news >正文

《windows核心编程》第1章 错误处理

一、错误信息的获取

1.1 C库错误信息

1、获取错误信息

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{fopen("D:\\ASC", "r");printf("%s\n", strerror(errno));getchar();return 0;
}

2、设置错误信息

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{fopen("D:\\ASC", "r");_set_errno(0);printf("%s\n", strerror(errno));getchar();return 0;
}

1.2 Windows的API

1、获取错误编号

2、设置错误编号

3、用工具获取错误代码对应的错误信息

4、错误代码各个位数的意义

二、FormatMessage函数介绍

2.1 总体概况

这是windows的API函数,函数是用来将错误编码转换成错误信息字符串的

在UNICODE编码下被定义为FormatMessageW,我们常用FormatMessageW

详细内容可见windowsAPI:FormatMessageW 函数 (winbase.h) - Win32 apps | Microsoft Learn

FormatMessageW(_In_     DWORD dwFlags,_In_opt_ LPCVOID lpSource,_In_     DWORD dwMessageId,_In_     DWORD dwLanguageId,_When_((dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) != 0, _At_((LPWSTR*)lpBuffer, _Outptr_result_z_))_When_((dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) == 0, _Out_writes_z_(nSize))LPWSTR lpBuffer,_In_     DWORD nSize,_In_opt_ va_list *Arguments);

2.2 参数1:dwFlags

DWORD dwFlags

标志1:FORMAT_MESSAGE_ALLOCATE_BUFFER

0x00000100

有这个标志表示这个函数自动分配内存,我们必须给参数lpBuffer,使用这种方式来传递一个未初始化指针变量,(LPTSTR)&lpBuffer。当这个函数返回的时候,这个指针变量就指向一段内存,这个内存中就存放着我们想要的字符串。如果要释放这段内存,就要使用函数LocalFree(这说明FormatMessage函数使用LocalAlloc函数来分配内存)

标志2:FORMAT_MESSAGE_ARGUMENT_ARRAY

0x00002000

Arguments参数是一个数组,不是va_list这种类型的参数

标志3:FORMAT_MESSAGE_FROM_HMODULE

0x00000800

这个标志说明,这个函数接收一个DLL模块,从DLL模块中查找字符串(因为有的错误号,在windows系统API里面还没定义,所以需要另外加DLL,那个里面有错误号对应的错误信息字符串)

标志4:FORMAT_MESSAGE_FROM_STRING

从一个字符串中查找消息字符串

标志5:FORMAT_MESSAGE_FROM_SYSTEM

0x00001000

从系统中,获取消息字符串,不是从某个指定的字符串或者DLL中获取消息字符串

标志6:FORMAT_MESSAGE_IGNORE_INSERTS

0x00000200

这个表示说明参数Arguments是否有用,如果设置了这个标志,那么参数Arguments就被函数忽略

2.3 参数2:lpScource

LPCVOID lpSource
 

从哪里获取消息字符串?如果是从系统获取消息字符串的画,这个参数为NULL

2.4 参数3:dwMessageId

DWORD dwMessageId,

消息索引

2.5 参数4:dwLanguageId

DWORD dwLanguageId,

消息的语言种类

2.6 参数5:lpBuffer

LPWSTR lpBuffer

接受消息的内存块指针

2.7 参数6:nsize

DWORD nSize

接受消息的内存块大小

2.8 参数7:Arguments

va_list *Arguments

消息中有些变量的值

2.9 返回值

如果函数成功,返回字符消息的字符数

如果函数失败,返回0,用GetLastError函数获取错误信息

三、制作错误编号转错误信息小工具

3.1 建立项目框架

3.2 按键处理函数

把上面的函数改成系统分配内存,改动如下

3.3 添加DLL库中错误信息

void CMFCApplication1Dlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码TCHAR* str = NULL;this->UpdateData(1);int count = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL, m_value, NULL, (LPWSTR)&str, 200, NULL);if (!count){this->SetDlgItemTextW(IDC_STATIC1, str);LocalFree(str);}else{HMODULE hmodule = LoadLibrary(TEXT("netmsg.dll"));if (hmodule){count = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,hmodule, m_value, NULL, (LPWSTR)&str, 0, NULL);if (count){this->SetDlgItemTextW(IDC_STATIC1, (LPCTSTR)LocalLock(str));LocalFree(str);}FreeLibrary(hmodule);}if (!count){this->SetDlgItemTextW(IDC_STATIC1, (LPCTSTR)L"没有找到错误代码信息");}}
}

为了好看,初始化的时候给他加入了这个代码

四、Windows函数返回值的意义

VOID:这个函数不可能失败

BOOL:FALSE失败;TRUE 成功

HANDLE:失败返回NULL,否则返回非零句柄。如果有特殊说明,则可能为特殊值例如:INVALID_HANDLE_VALUE

PVOID:返回一个内存地址,失败为NULL

LONG/DWORD:应该根据SDK说明来确定函数状况。

相关文章:

《windows核心编程》第1章 错误处理

一、错误信息的获取 1.1 C库错误信息 1、获取错误信息 #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {fopen("D:\\ASC", "r");printf("%s\n", strerror(errno));getchar();return 0; } 2、设置错…...

解剖—单链表相关OJ练习题

目录 一、移除链表元素 二、找出链表的中间节点 三、合并两个有序链表 四、反转链表 五、求链表中倒数第k个结点 六、链表分割 七、链表的回文结构 八、判断链表是否相交 九、判断链表中是否有环(一) 十、 判断链表中是否有环(二) 注&#xff1a;第六题和第七题牛…...

php对接飞书机器人

有同事接到对接飞书机器人任务&#xff0c;开发中遇到响应错误&#xff1a; {"code": 19021,"msg": "sign match fail or timestamp is not within one hour from current time" } 意思应该就是签名错误或者时间戳不在有效范围内等&#xff0c…...

中间件安全-CVE复现IISApacheTomcatNginx漏洞复现

目录 中间件安全&CVE复现&IIS&Apache&Tomcat&Nginx漏洞复现中间件-IIS安全问题中间件-Nginx安全问题漏洞复现Nginx 解析漏洞复现Nginx 文件名逻辑漏洞 中间件-Apache-RCE&目录遍历&文件解析等安全问题漏洞复现漏洞复现CVE_2021_42013 RCE代码执行&…...

@ResponseBodyAdvice @RequestBodyAdivce失效

背景 最近项目要有向外部提供服务的能力&#xff0c;但是考虑到数据安全问题&#xff0c;要对接口进行加解密&#xff1b;实现加解密的方案有很多&#xff0c;比如过滤器、拦截器、继承RequestResponseBodyMethodProcessor什么的&#xff0c;不过我最近正在了解ResponseBodyAd…...

【c#】Quartz开源任务调度框架学习及练习Demo

Quartz开源任务调度框架学习及练习Demo 1、定义、作用 2、原理 3、使用步骤 4、使用场景 5、Demo代码参考示例 6、注意事项 7、一些Trigger属性说明 1、定义、作用 Quartz是一个开源的任务调度框架&#xff0c;作用是支持开发人员可以定时处理业务&#xff0c;比如定时…...

spring cloud Eureka集群模式搭建(IDEA中运行)

spring cloud Eureka集群模式搭建&#xff08;IDEA中运行&#xff09; 新建springboot 工程工程整体目录配置文件IDEA中部署以jar包形式启动总结 新建springboot 工程 新建一个springboot 工程&#xff0c;命名为&#xff1a;eureka_server。 其中pom.xml文件为&#xff1a; …...

数据迁移一致性测试探索与实践

背景 量级庞大的日志通过mysql不足以支撑业务需求&#xff0c;以前通过任务调度定时跑批从mysql同步到hive存储&#xff0c;这种方式时效性为T1&#xff0c;也就是说今天的日志&#xff0c;明天才能同步到hive&#xff0c;总而言之时效性不高。为了提高时效性&#xff0c;改为…...

---图的遍历和最小生成树

广度优先遍历 --- 针对的是顶点遍历 深度优先遍历 如果给的图不是连通图&#xff1f;以某个点为起点就没有遍历完成。那么怎么保证遍历完剩下的点呢&#xff1f;&#xff1f; 在标记数组当中找没有遍历过的点&#xff0c;在进行遍历 最小生成树 生成树&#xff1a;一个连通…...

中文编程工具开发语言编程案例:会员VIP管理系统软件实例

中文编程工具开发语言编程案例&#xff1a;会员VIP管理系统软件实例 中文编程工具开发语言编程案例&#xff1a;会员VIP管理系统软件实例。 软件功能&#xff1a; 1、系统设置&#xff1a;参数设定&#xff0c;账号及权限设置&#xff0c;系统初始化&#xff0c;卡类型设置&a…...

Hive用户中文使用手册系列(四)

Python Client 在github 上上可以使用 Python client 驱动程序。有关安装说明&#xff0c;请参阅设置 HiveServer2&#xff1a;Python Client 驱动程序。 Ruby Client 一个 Ruby client 驱动程序在https://github.com/forward3d/rbhive的 github 上可用。 与 SQuirrel SQL …...

高级深入--day37

手机App抓包爬虫 1. items.py class DouyuspiderItem(scrapy.Item):name scrapy.Field()# 存储照片的名字imagesUrls scrapy.Field()# 照片的url路径imagesPath scrapy.Field()# 照片保存在本地的路径2. spiders/douyu.py import scrapy import json from douyuSpider.it…...

Web自动化测试:测试用例断言!

运行测试用例时&#xff0c;需要判断用例是否执行成功&#xff0c;此时需要有一个我们期望的结果来进行验证。这里unittest中&#xff0c;如果一个case执行的过程中报错&#xff0c;或者我们判断结果不符合期望&#xff0c;就会判定此条用例执行失败&#xff0c;判断的条件主要…...

基于SSM的培训学校教学管理平台的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

2019年亚太杯APMCM数学建模大赛A题基于图像分析的二氧化硅熔化表示模型求解全过程文档及程序

2019年亚太杯APMCM数学建模大赛 A题 基于图像分析的二氧化硅熔化表示模型 原题再现 铁尾矿的主要成分是二氧化硅&#xff0c;而二氧化硅是铁尾矿成分中最难熔化的部分。因此&#xff0c;铁尾矿的熔融行为可以用二氧化硅的熔融行为来表示。然而&#xff0c;高温熔池的温度超过…...

C++之继承<2>【详解】

C之继承&#xff1c;2&#xff1e;【详解】 1. 派生类的默认成员函数1.1 1. 构造成员函数1.2 拷贝复制1.3 构造函数和析构函数的执行顺序 2. 继承和友元3. 继承与静态成员 1. 派生类的默认成员函数 1.1 1. 构造成员函数 派生类的构造函数必须调用基类的构造函数初始化基类的那…...

解决Kafka新消费者组导致重复消费的问题

问题描述&#xff1a;在使用Kafka时&#xff0c;当我们向新的消费者组中添加消费者时&#xff0c;可能会遇到重复消费的问题。本文将介绍一些解决这个问题的方法&#xff0c;帮助开发者更好地处理Kafka中的消费者组和消费偏移量。 Kafka是一个强大的分布式消息队列系统&#xf…...

公允价值会计(fair-value accounting)

《公允价值会计》是2008年经济科学出版社出版图书。 公允价值会计又称市值会计&#xff0c;是指以市场价值或未来现金流量的现值作为资产和负债的主要计量属性的会计模式。随着现代交通和通讯技术的发展&#xff0c;在工业社会中相互分割的市场正在走向世界一体化&#xff0c;…...

【java调取第三方接口,获取数据并保存至数据库】

java调取第三方接口&#xff0c;获取数据并保存至数据库 Overridepublic void doPost() {// 创建Httpclient对象CloseableHttpClient httpClient HttpClients.createDefault();CloseableHttpResponse response null;String resultString "";String url "htt…...

图论01-【无权无向】-图的基本表示-邻接矩阵/邻接表

文章目录 1. 代码仓库2. 图的基本表示的比较3. 邻接矩阵&#xff1a;Array和TreeSet3.1 图示3.2 Array主要代码解析3.3 测试输出3.4 使用TreeSet的代码 4. 邻接表&#xff1a;LinkedList4.1 图示4.2 LinkedList主要代码解析4.3 测试输出 5. 完整代码5.1 邻接表 - Array5.2 邻接…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...