Windows Internals 笔记——错误处理
2024-08-24 07:39:09
1.Windows函数检测到错误时,会使用一种名为“线程本地存储区”的机制将相应的错误代码与“主调线程”关联到一起。这种机制使得不同的线程能独立运行,不会出现相互干扰对方的错误代码的情况。
2.GetLastError返回32位的错误代码表,每个错误有三种表示:一个消息ID、消息文本、和一个编号。函数失败后应立即调用GetLastError,否则很可能被改写。
//
// MessageId: ERROR_SUCCESS
//
// MessageText:
//
// The operation completed successfully.
//
#define ERROR_SUCCESS 0L #define NO_ERROR 0L // dderror
#define SEC_E_OK ((HRESULT)0x00000000L) //
// MessageId: ERROR_INVALID_FUNCTION
//
// MessageText:
//
// Incorrect function.
//
#define ERROR_INVALID_FUNCTION 1L // dderror //
// MessageId: ERROR_FILE_NOT_FOUND
//
// MessageText:
//
// The system cannot find the file specified.
//
#define ERROR_FILE_NOT_FOUND 2L
3.可以用FormatMessage函数来格式化输出错误信息。
void OutputLastError(LPTSTR lpszFunctionName)
{
LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
DWORD dwErrorCode = GetLastError(); FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
, NULL); lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunctionName) + ) * sizeof(TCHAR));
StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error %d : %s"), lpszFunctionName, dwErrorCode, lpMsgBuf); _tprintf((LPCTSTR)lpDisplayBuf); LocalFree(lpMsgBuf);
LocalFree(lpDisplayBuf);
}
4.我们可以使用 void SetLastError(DWORD dwErrCode); 来设置错误代码,也可以创建自己的代码,32位字段的组成如下:
需要注意的是第29位。
最新文章
- MySQL实现嵌套集合模型
- Fast Fourier Transform
- 404. Sum of Left Leaves
- 【leetcode】Binary Tree Right Side View(middle)
- cocos2d/x 自带字体(label)
- Python 基礎 - pyc 是什麼
- Appium for win7 环境搭建
- Html - Footer
- Core Java Volume I — 3.1. A Simple Java Program
- Codeforces 424 B Megacity【贪心】
- 关于ref与out的区别
- 推荐牛X的一本JS书
- Spring(AbstractRoutingDataSource)实现动态数据源切换--转载
- css 权威指南笔记(一)
- Oracle数据库按属性成绩查询
- AIX 命令大全
- 原型及原型链,以及prototype和__proto__属性(笔记便于以后复习)
- 项目收集-AutoMapper使用,事务,Json.Net序列化反序列化,代码生成调用等
- 【ASP.NET Core】给路由规则命名有何用处
- 一对一Socket简单聊天的实现
热门文章
- npm 的 --save 和 --save-dev 的区别
- CentOS 7安装Redis
- Linux下安装PCRE
- TensorFlow学习笔记之--[compute_gradients和apply_gradients原理浅析]
- CentOS 7 安装配置 Vsftpd
- linux 用户空间获得纳秒级时间ns【转】
- 设计模式C++学习笔记之六(Facade门面模式)
- vc++基础班[23]---文件夹的基本操作
- centos6.8安装httpd后无法访问
- spring3.1 profile 配置不同的环境