
基础知识:
1.调用Windows函数时,它会验证我们传递给它的参数,然后才开始执行。
2.如果函数执行出错,通过判断函数的返回值可以获取错误的原因。返回错误代码有助于我们理解函数为何会失败。
3.常见返回值的数据类型:
VOID:不可能失败,极少数Windows函数返回值为该类型;
BOOL:失败返回0;否则返回非0;检验时检验是否不为FALSE;
HANDLE:失败返回NULL,否则将标识一个可操纵对象;
PVOID:失败返回NULL,否则将标识一个数据块内存地址;
LONG/DWORD:返回计数的函数通常会返回一个LONG/DWORD;如果处于某个原因无法计数,通常会返回0或-1;
4.函数检测到错误,会用“线程本地存储区”(thread-local-storage)将错误代码和“主调线程”关联,是不同线程独立运行且不会出现干扰对方错误代码。
5.WinError.h头文件包含了Microsoft定义的错误代码列表。每个错误有三种表示:消息ID(用于和GetLastError返回值做比较)、消息文本(描述错误)、编号(避免使用)。
6.MS Visual Studio,可在MS调试器中配置Watch窗口,选择一行并输入$err,hr显示线程上一个错误代码和错误的文本描述。
7.我们可以通过SetLastError函数自己定义错误代码,传递我们认为合适的任何32位值。
8.错误代码是一个32位数,不同字段代表不同含义。
31-30:0=成功,1=提示,2=警告,3=错误
29: 0=MS定义,1=客户定义
28: 必须为0
27-16:前256个值MS保留,共容纳4096个值
15-0: 异常代码,MS/客户定义
常用函数:
1.GetLastError函数:查看具体错误
1 |
DWORD WINAPI GetLastError(void); |
(函数失败后应马上调用该函数,否则很可能被改写。)
2.FormatMessage函数:将错误代码转换为相应文本描述
1 2 3 4 5 6 7 8 9 |
DWORD WINAPI FormatMessage( _In_ DWORD dwFlags, _In_opt_ LPCVOID lpSource, _In_ DWORD dwMessageId, _In_ DWORD dwLanguageId, _Out_ LPTSTR lpBuffer, _In_ DWORD nSize, _In_opt_ va_list *Arguments ); |
(支持多语言)
3.SetLastError函数:自定义错误代码
1 2 3 |
void WINAPI SetLastError( _In_ DWORD dwErrCode ); |
本文链接地址: Windows via C/C++ Chapter 1 : Windows 错误处理
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
如果您愿意为文章的内容或想法提供支持,欢迎点击下边的捐赠按钮,资助作者创作更多高价值高品质的内容。