0x01 GetLastError() 函数用于获取上一个操作的错误代码

#include <Windows.h>
#include <iostream>
using namespace std; int main(int argc, char *argv[])
{
HANDLE nFile = CreateFile(TEXT("D:\\noknow.txt"), 0, 0, NULL, OPEN_EXISTING, 0, NULL);
DWORD error = GetLastError();
cout << "错误代码: " << error << endl;
return 0;
}

输出结果为

0x02 利用 VS 小工具查看

  • 利用 errlook.exe 工具查询错误代码 2 的含义

0x03 错误代码转换为相应的文本描述

#include <Windows.h>
#include <iostream>
#include <strsafe.h>
using namespace std; void ErrorExit(LPTSTR lpszFunction); int main(int argc, char *argv[])
{
WCHAR var_1[] = L"错误代码";
ErrorExit(var_1);
return 0;
} void ErrorExit(LPTSTR lpszFunction)
{
// 检索最后错误码的系统错误消息 LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
DWORD dw = 123; // 模拟错误代码定义为 123 FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | // 函数自动使用 LocalAlloc 函数,来为 lpBuffer 分配内存
FORMAT_MESSAGE_FROM_SYSTEM | // 定义可以使用 GetLastError 的返回值赋给 dw
FORMAT_MESSAGE_IGNORE_INSERTS, // 这个标志表示 Arguments 参数将被忽略
NULL, // 消息所在位置,这个参数类型,根据dwFlags标志来设定
dw, // 消息索引,如果 lpSource 是一个字符串,那么这个参数被忽略
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 设置为本地默认语言
(LPTSTR)&lpMsgBuf, // 接受消息字符串的内存块
0, // 内存大小
NULL); // 消息中的参数 // 显示错误消息并退出进程 lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, // 将内存初始化为 0
(lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); // 为字符串指针区域申请足够大小的内存 StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf), // 目标缓冲区和目标缓冲区的大小
TEXT("%s %d 的含义是: %s"), // 格式字符串
lpszFunction, // 参数1
dw, // 参数2
lpMsgBuf); // 参数3 MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); LocalFree(lpMsgBuf); // 释放空间
LocalFree(lpDisplayBuf);
ExitProcess(dw); // 关闭进程
}

输出的结果为,相当于 errlook.exe 小工具

设置自己的错误代码

#include <Windows.h>
#include <iostream>
using namespace std; #define MY_ERROR 100L void SetError(INT a); int main(int argc, char *argv[])
{
SetError(0);
cout << GetLastError() << endl;
return 0;
} void SetError(INT a)
{
if (a == 0) SetLastError(MY_ERROR);
}

输出结果为 100

Windows核心编程笔记之错误处理的更多相关文章

  1. Windows核心编程第一章.错误处理

    Windows核心编程第一章,错误处理. 一丶错误处理 1.核心编程学习总结 不管是做逆向,开始做开发.在Windows下.你都需要看一下核心编程这本书.这本书确实写得很好.所以自己在学习这本书的同时 ...

  2. Windows核心编程笔记之处理字符串

    0x01 ANSI 和宽字符定义 // ANSI 字符定义 CHAR varChar_1 = 'a'; // #typedef char CHAR CHAR varChar_2[] = "A ...

  3. Windows核心编程笔记之作业

    创建作业,并加以限制 HANDLE WINAPI CreateJob() { BOOL IsInJob = FALSE; DWORD ErrorCode = NULL; // 不能将已经在作业中的进程 ...

  4. Windows核心编程笔记之进程

    改变进程基址,获取进程基址 #include <Windows.h> #include <iostream> #include <strsafe.h> #inclu ...

  5. Windows核心编程笔记之内核对象

    0x01 子进程继承父进程内核对象句柄 父进程 #include <Windows.h> #include <iostream> #include <strsafe.h& ...

  6. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

  7. C++Windows核心编程读书笔记

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

  8. 【转】《windows核心编程》读书笔记

    这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...

  9. 《Windows核心编程》第一讲 对程序错误的处理

    一个Windows函数通常都有一个有意义的返回值类型,它标志着这个函数的运行状态,即函数运行成功与否.windows常用的函数类型如下图: 从系统内部来讲,当一个Windows函数检测到一个错误时,它 ...

随机推荐

  1. Python 元类编程实现一个简单的 ORM

    概述 什么是ORM? ORM全称"Object Relational Mapping",即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码 ...

  2. Codeforces Round #699 (Div. 2)

    A Space Navigation #include <bits/stdc++.h> using namespace std; typedef long long LL; #define ...

  3. AtCoder Beginner Contest 186

    A Brick int n, m; int main() { scanf("%d%d", &n, &m); printf("%d\n", n / ...

  4. python面试题总结

    Python语言特性 1. Python的函数参数传递 ​ 看两个如下例子,分析运行结果 #代码1 a = 1 def fun(a): a = 2 fun(a) print(a) #1 #代码2 a ...

  5. 进阶Java多线程

    一.多线程创建方式 1.1.继承Thread类创建线程类 1.实现步骤 定义一个继承Thread类的子类,并重写该类的run()方法: 创建Thread子类的实例,即创建了线程对象: 调用该线程对象的 ...

  6. WorkSkill 面试之 字节跳动一面

  7. jqgrid 实现表格随select框内容改变而刷新

    要实现的功能如下:当选择框选择数据源由原始数据切换到组合后数据时,界面左侧jqgrid表格随之改变.效果如下: 实现代码: 界面顶部select选择框:要点是用localStory将选择框的选择信息记 ...

  8. Win 10 下Pipenv源码安装 odoo12

    因为,本身电脑已经安装odoo8,9,10等odoo的版本,当时,没有考虑是直接是统一的环境很配置. 现在,在odoo11的环境下,需要Python 3的语言环境可以很好地支持odoo11的功能,所以 ...

  9. VUE移动端音乐APP学习【四】:scroll组件及loading组件开发

    scroll组件 制作scroll 组件,然后嵌套一个 DOM 节点,使得该节点就能够滚动.该组件中需要引入 BetterScroll 插件. scroll.vue: <template> ...

  10. Apache Pulsar 在能源互联网领域的落地实践

    关于 Apache Pulsar Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息.存储.轻量化函数式计算为一体,采用计算与存储分离架构设计,支 ...