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

Windows 程序设计6:错误码的查看

文章目录

  • 前言
  • 一、说明
  • 二、使用GetLastError找到错误的原因
  • 三、使用错误码的宏
  • 总结


前言

Windows 程序设计6:错误码的查看。


一、说明

有时写的代码单纯看是没有问题的,但是执行起来就会崩溃。因此要养成判断函数执行是否成功的习惯,除非这个函数根本判断不了。比如void Init()这样的函数是可能没办法进行判断的,这种函数一般是肯定会保证执行成功的。如果是自己封装的函数或者系统提供的API函数有时就可以进行判断。

对于自己封装的函数或者系统提供的API函数,如果不能保证100%成功,一般都会通过返回值或者参数返回的形式来判断函数是否执行成功。

所以,我们在使用一个函数的时候,要对他执行后返回的状态进行判断,否则默认函数执行成功,程序继续往下执行的话,很有可能造成程序的崩溃,而且还找不到程序崩溃的问题。

二、使用GetLastError找到错误的原因

使用函数GetLastError找到执行的错误信息,函数原型

DWORD GetLastError(VOID);

没有参数,返回值是DWORD双字的整型,表示错误码的值。针对函数执行遇到的不同错误,GetLastError的返回值是不同的。其针对Windows系统提供的API函数,执行失败获取其错误码。获取调用线程的最后错误代码值,最后一个错误代码是基于每个线程维护的,多个线程不会覆盖彼此的最后错误代码。
利用https://editor.csdn.net/md/?articleId=145371197介绍的文件删除函数进行说明。如果目标路径没有要删除的文件,则就会报错。

此时在本机的D盘下已经没有名为111.gif的文件,这里要删除D盘下的111.gif文件

BOOL bret1 = DeleteFile(_T("D:\\111.gif"));
if (bret1)
{MessageBox(NULL, _T("删除成功"), _T("提示"), MB_OK);	
}
else
{MessageBox(NULL, _T("删除失败"), _T("提示"), MB_OK);
}

理论上来说,由于已经不存在该文件,由于程序语法正确,编译可以通过,但是该删除函数会报错。
在这里插入图片描述
即便我们清楚,函数执行失败的原因是没有目标文件要删除的文件,但是对于使用者来说,其不清楚为什么删除失败,那么就需要用到函数GetLastError。
下断点后运行,进入DeBug模式
在这里插入图片描述
可以看到错误码为2
在这里插入图片描述
但是根据这个错误码"2",我们并不知道具体是什么原因。在网上查询发现,错误码"2"表示找不到指定文件
在这里插入图片描述
实际上,这种错误码有很多,每个错误码表示的错误信息是不一样的,那么我们如何找到其对应信息?每次都上网查询很不方便。

微软为我们提供了一个工具,可以根据GetLastError返回的错误码找的其对应的错误信息。位置在vs编译器的工具->错误查找
在这里插入图片描述
输入2,点击查找,则显示系统找不到指定文件,与我们在网上找的结果相同
在这里插入图片描述
这说明由于指定路径并不存在该文件,因此系统找不到指定的文件,与我们预料的原因相同。
再试一下另一种情况,D盘下存在一个命名为111new.gif的文件,其为只读文件。
在这里插入图片描述
此时要删除该文件

BOOL bret1 = DeleteFile(_T("D:\\111new.gif"));
if (bret1)
{MessageBox(NULL, _T("删除成功"), _T("提示"), MB_OK);
}
else
{DWORD dwerror = GetLastError();MessageBox(NULL, _T("删除失败"), _T("提示"), MB_OK);
}

此时给出的错误码为5

在这里插入图片描述
查找发现对应的错误信息为拒绝访问。
在这里插入图片描述
这是由于只读文件造成的,如果将只读去掉,则程序可以正常删除文件。
在这里插入图片描述
删除成功
在这里插入图片描述
则可将代码改为

BOOL bret1 = DeleteFile(_T("D:\\111new.gif"));
if (bret1)
{MessageBox(NULL, _T("删除成功"), _T("提示"), MB_OK);
}
else
{DWORD dwerror = GetLastError();if (dwerror == 2){MessageBox(NULL, _T("文件不在指定路径"), _T("提示"), MB_OK);}else{MessageBox(NULL, _T("删除失败"), _T("提示"), MB_OK);}
}

运行得到如下结果
在这里插入图片描述

三、使用错误码的宏

上文已经提到,错误码为2表示系统找不到指定的文件;错误码为5表示拒绝访问。但是错误码有上万个,不可能全都记住。而且错误码对应的数字随着微软系统的升级后期是有可能发生变化的,因此最好使用Windows提供给我们的错误码的宏,而不是使用数值。
利用关键字查找办法:Win32 Error Code
直接在搜索引擎中进行搜索,即可将错误码对应的错误原因列出,下面是部分错误码示例
ERROR_SUCCESS (0): 操作成功完成。

ERROR_INVALID_FUNCTION (1): 错误的函数。

ERROR_FILE_NOT_FOUND (2): 系统找不到指定的文件。

ERROR_PATH_NOT_FOUND (3): 系统找不到指定的路径。

ERROR_ACCESS_DENIED (5): 访问被拒绝。

ERROR_INVALID_HANDLE (6): 句柄无效。

ERROR_NOT_ENOUGH_MEMORY (8): 存储空间不足,无法处理此命令。

ERROR_BAD_FORMAT (11): 试图加载格式错误的程序。

ERROR_INVALID_ACCESS (12): 访问代码无效。

ERROR_INVALID_DATA (13): 数据无效。

ERROR_OUTOFMEMORY (14): 存储空间不足,无法完成此操作。

ERROR_INVALID_DRIVE (15): 系统找不到指定的驱动器。

ERROR_NO_MORE_FILES (18): 没有更多文件。

ERROR_WRITE_PROTECT (19): 介质受写入保护。

ERROR_BAD_UNIT (20): 系统无法找到指定的设备。

ERROR_NOT_READY (21): 设备未就绪。

ERROR_BAD_COMMAND (22): 设备不识别的命令。

ERROR_CRC (23): 数据错误(循环冗余检查)。

ERROR_BAD_LENGTH (24): 程序发出命令,但命令长度不正确。

ERROR_SEEK (25): 驱动器无法找到磁盘上的特定区域或磁道。

ERROR_NOT_DOS_DISK (26): 无法访问指定的磁盘或软盘。

ERROR_SECTOR_NOT_FOUND (27): 驱动器找不到请求的扇区。

ERROR_WRITE_FAULT (29): 系统无法写入指定的设备。

ERROR_READ_FAULT (30): 系统无法从指定的设备读取。

ERROR_GEN_FAILURE (31): 附加到系统的设备无法正常工作。

那么最好将程序中的错误码数字变为宏,这里将错误码2改为对应的宏即可。

if (dwerror == ERROR_FILE_NOT_FOUND)

同时也可以看到该宏与错误码2对应
在这里插入图片描述
需要说明。在DeleteFile等函数调用成功后,也可以调用GetLastError,此时返回的错误码为0,即操作成功完成。
在这里插入图片描述

总结

Windows 程序设计6:错误码的查看。

相关文章:

Windows 程序设计6:错误码的查看

文章目录 前言一、说明二、使用GetLastError找到错误的原因三、使用错误码的宏总结 前言 Windows 程序设计6:错误码的查看。 一、说明 有时写的代码单纯看是没有问题的,但是执行起来就会崩溃。因此要养成判断函数执行是否成功的习惯,除非这…...

doris: CSV导入数据

本文介绍如何在 Doris 中导入 CSV 格式的数据文件。Doris 支持灵活的 CSV 格式配置,包括自定义分隔符、字段包围符等,并提供多种导入方式以满足不同场景的数据导入需求。 导入方式​ Doris 支持以下方式导入 CSV 格式数据: Stream LoadBro…...

FastStone Image Viewer图像处理软件安装步骤(百度网盘链接)

软件简介:一款小巧便捷的添加水印、特效、图片处理软件,让使用者可以通过它的操作界面来浏览图片,且还支持了幻灯播放的功能,让使用者能够轻松的浏览目录中的所有图片。 网盘链接:https://pan.baidu.com/s/1Zvrx7fXwb6…...

Kafka 深入服务端 — 时间轮

Kafka中存在大量的延迟操作,比如延时生产、延时拉取和延时删除等。Kafka基于时间轮概念自定义实现了一个用于延时功能的定时器,来完成这些延迟操作。 1 时间轮 Kafka没有使用基于JDK自带的Timer或DelayQueue来实现延迟功能,因为它们的插入和…...

网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。

一、前言 我从24年11月份开始学习网络爬虫应用开发,经过2个来月的努力,于1月下旬完成了开发一款网络爬虫软件的学习目标。这里对本次学习及应用开发进行一下回顾总结。 前几天我已经发了一篇日志(网络爬虫学习:应用selenium从搜…...

【go语言】结构体

一、type 关键字的用法 在 go 语言中,type 关键字用于定义新的类型,他可以用来定义基础类型、结构体类型、接口类型、函数类型等。通过 type 关键字,我们可以为现有类型创建新的类型别名或者自定义新的类型。 1.1 类型别名 使用 type 可以为…...

Spring Boot是什么及其优点

简介 Spring Boot是基于Spring框架开发的全新框架,其设计目的是简化Spring应用的初始化搭建和开发过程。 Spring Boot整合了许多框架和第三方库配置,几乎可以达到“开箱即用”。 优点 可快速构建独立的Spring应用。 直接嵌入Tomcat、Jetty和Underto…...

谷氨酸:大脑功能的多面手

标题:谷氨酸:大脑功能的多面手 文章信息摘要: 谷氨酸是大脑中最主要的兴奋性神经递质,参与了90%以上的神经元激活,在蛋白质合成、味觉(鲜味)以及神经可塑性中发挥重要作用。它与GABA、多巴胺等…...

SpringCloudGateWay和Sentinel结合做黑白名单来源控制

假设我们的分布式项目,admin是8087,gateway是8088,consumer是8086 我们一般的思路是我们的请求必须经过我们的网关8088然后网关转发到我们的分布式项目,那我要是没有处理我们绕过网关直接访问项目8087和8086不也是可以&#xff1…...

HTML新春烟花

系列文章 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心(简易版)7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心(双心版)10…...

【Elasticsearch】中数据流需要配置索引模板吗?

是的,数据流需要配置索引模板。在Elasticsearch中,数据流(Data Streams)是一种用于处理时间序列数据的高级结构,它背后由多个隐藏的索引组成,这些索引被称为后备索引(Backing Indices&#xff0…...

Git进阶之旅:Git 配置信息 Config

Git 配置级别: 仓库级别:local [ 优先级最高 ]用户级别:global [ 优先级次之 ]系统级别:system [ 优先级最低 ] 配置文件位置: git 仓库级别对应的配置文件是当前仓库下的 .git/configgit 用户级别对应的配置文件时用…...

buu-pwn1_sctf_2016-好久不见29

这个也是栈溢出,不一样的点是,有replace替换,要输入0x3c字符(60),Iyou 所以,20个I就行,找后面函数 输出提示信息,要求用户输入关于自己的信息。 使用fgets函数从标准输入…...

ES2021+新特性、常用函数

一、ES2021新特性 ES2021 数字分隔符 let num 1234567 let num2 1_234_567 Promise.any 与 Promise.all 类似,Promise.any 也接受一个 Promise 的数组。当其中任何一个 Promise 完成(fullfill)时,就返回那个已经有完成值的 …...

STM32——LCD

一、引脚配置 查看引脚 将上述引脚都设置为GPIO_Output 二、导入驱动文件 将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。 当然,后面 lcd 的驱动学习可以和 IMX6U 一块学。 三、LCD函数 void LCD_Clear(u16 Color); 功能…...

【redis进阶】分布式锁

目录 一、什么是分布式锁 二、分布式锁的基础实现 三、引入过期时间 四、引入校验 id 五、引入lua 六、引入 watch dog (看门狗) 七、引入 Redlock 算法 八、其他功能 redis学习🥳 一、什么是分布式锁 在一个分布式的系统中,也会涉及到多个节点访问同一…...

园区管理系统如何提升企业核心竞争力与资产管理智能化水平

内容概要 在当今快节奏的商业环境中,园区管理系统正成为企业的重要合作伙伴,尤其在工业园、产业园、物流园、写字楼和公寓等多种类型的物业管理中。这个系统不仅仅是一个管理工具,它还是提升企业运营效率和核心竞争力的关键因素。通过智能化…...

AI大模型开发原理篇-3:词向量和词嵌入

简介 词向量是用于表示单词意义的向量, 并且还可以被认为是单词的特征向量或表示。 将单词映射到实向量的技术称为词嵌入。在实际应用中,词向量和词嵌入这两个重要的NLP术语通常可以互换使用。它们都表示将词汇表中的单词映射到固定大小的连续向量空间中…...

高精度算法:高精度减法

P2142 高精度减法 - 洛谷 | 计算机科学教育新生态 我们两个整数一定要是大数减去小数,所以这个点我们需要特判一下,那我们两个字符串表示的整型怎么判断大小呢,我们字典序比较大小和真实的数字比较大小是一样的,比如我们的‘21’…...

Java创建项目准备工作

新建项目 新建空项目 每一个空项目创建好后都要检查jdk版本 检查SDK和语言级别——Apply——OK 检查当前项目的Maven路径,如果已经配置好全局,就是正确路径不用管 修改项目字符集编码,将所有编码都调整为UTF-8 创建Spingboot工程 创建Spring…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

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

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

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

大数据学习(132)-HIve数据分析

​​​​🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言&#x1f4…...

dify打造数据可视化图表

一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...