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. JS(ES6)、Vue.js、node.js

    JS行为(ESMAScript, JSdom, bom)$.ajax() <- (xmlhttpRequest由这个封装来的)  -> axios(vue版)  =  ajax技术jque ...

  2. AOP(面向切面编程)大概了解一下

    前言 上一篇在聊MemoryCache的时候,用到了Autofac提供的拦截器进行面向切面编程,很明显能体会到其优势,既然涉及到了,那就趁热打铁,一起来探探面向切面编程. 正文 1. 概述 在软件业, ...

  3. 从一部电影史上的趣事了解 Spring 中的循环依赖问题

    title: 从一部电影史上的趣事了解 Spring 中的循环依赖问题 date: 2021-03-10 updated: 2021-03-10 categories: Spring tags: Sp ...

  4. python基础学习之类的继承、魔法方法

    什么是继承 即类A可以使用类B的方法,即B是A的父类,A是B的子类,AB之间是继承关系 class Father():  # 父类 def __init__(self,name,age): self. ...

  5. [源码分析] 消息队列 Kombu 之 Hub

    [源码分析] 消息队列 Kombu 之 Hub 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Kombu 中的 ...

  6. Android中的TaskStack及启动模式

    目录 前言 如何观察ActivityStack? 几个问题 关键类介绍 ActivityStack的创建与种类 不同启动模式 launchMode Standard SingleTop SingleT ...

  7. ImportError: No module named site

    cmd中执行python提示:ImportError: No module named site 运行python.exe Fatal Python error: initfsencoding: un ...

  8. springboot集成swagger实战(基础版)

    1. 前言说明 本文主要介绍springboot整合swagger的全过程,从开始的swagger到Knife4j的进阶之路:Knife4j是swagger-bootstarp-ui的升级版,包括一些 ...

  9. 复制粘贴Ctrl+C改为自定义单键

    目录 那一瞬间不想用Ctrl+C了 (一)搜索渠道 关键词搜索 (二)方案对比 (三)最终方案Ditto 使用方法 (四)案例 1. 替换Ctrl+C快捷键: 2. 将英文小写替换为大写: 那一瞬间不 ...

  10. Python3实现短信轰炸机

    短信轰炸机的基本原理:利用某些限制不严格的网站短信注册接口,用Python模拟请求,传入被炸人手机号码,实现轰炸 实现方式:利用requests模块.time模块.完成请求模拟 模块安装: 在终端窗口 ...