Windows 自定义错误码
1. 简要
通常情况下Windows函数在执行失败时会返回一个错误代码,此错误代码是一个32位的错误编号。
由于错误编号是一个全局的变量,所以在不同的线程获取这个变量时,可能会获取到别的线程的错误,但Windows在使用GetLastError()函数时会使用到"线程本地存储(thread-local-storage)"机制来保证获取错误码时的正确性。
在一个Windows API(api1)调用结束后需要立即调用GetLastError,若在执行另一个API(api2)后调用GetLastError获取到的将不是api1返回的错误码,如下图:
也可以在调试下的监视窗口中输入"$err,hr"获取当前线程的错误码
2. 自定义错误码
Windows还提供了自定义错误码的功能,只需在线程中设置上一个错误码即可,设置上一个错误码需要调用SetLastError(),自定义错误代码要遵循Windows的错误代码定义规则,32错误代码的规则如下:
3. 将错误代码转换为文本字符串
/*
DWORD FormatMessage(
// 格式化选项,以及如何解释 lpSource 参数。 dwFlags 的低位字节指定函数如何处理输出缓冲区中的换行符。 低位字节还可以指定格式化输出行的最大宽度。
DWORD dwFlags,
// 消息定义的位置。 此参数的类型取决于 dwFlags 参数中的设置
LPCVOID lpSource,
// 错误码, 如果 dwFlags 包含 FORMAT_MESSAGE_FROM_STRING,则忽略此参数
DWORD dwMessageId,
// 语言ID
DWORD dwLanguageId,
// 消息缓冲区
LPTSTR lpBuffer,
// 缓冲区大小
DWORD nSize,
// 通常为空,在自定义格式化显示(如:"%1,%2",这里的%1就是占位符)的时候有用到
va_list *Arguments
);
*/
// 获取当前语言环境
DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
// 转换后的消息
HLOCAL hlocal = NULL;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER,
0, dwError, systemLocale,
(PTSTR) &hlocal, 0, NULL);
关注「CoderPro」公众号,专注于分享.NET/C++知识及算法的大本营,新手公众号请大家多多关照/(ㄒoㄒ)/~~