在内部,当windows函数检查到错误时,他或使用一种名为“线程本地存储区”(thread-localstorage)的机制,讲相应的错误代码与“主掉线程”关联到一起。这种机制使不同线程能独立工作,不会互相干扰对方的错误代码情况。 查看具体是什么错误可以调用DWORD GetlastError();
每个错误都有三种表示方式:
一个消息ID,消息文本,一个编号。
Windows函数调用失败之后要马上调用GetLastError,因为又调用了另一个Windows函数,则此值很可能被改写。注意,成功调用windows函数可能用ERROR_SUCCESS改写此值。 Windows函数调用成功也有可能是不同的原因,例如创建一个具名事件内核对象时,有两种成功方式:1、对象实际完成创建;2、存在一个同名的事件内核对象(ERROR_ALREADY_EXISTS)。应用程序需要知道成功原因,为返回这种信息,Microsoft选择采用上一个错误代码机制。所以,特定函数调用成功是,可以调用GetLastError来确定额外的信息。
调试时候,MS Visual Studio中的watch(监视)窗口,支持$err,hr 来查看线程的上一个错误代码和错误的文本描述, “,hr”限定符显示错误描述。 Windows提供了一个函数,转化GetLastError返回的整数为错误描述, DWORD FormatMessage
{
DWORD dwFlags,
LPCVOID pSource,
DWORD dwMessageId,
DWORD dwLanguageId,
PTSTR pszBuffer,
DWORD nSize,
va_list *Arguments
}
Windows提供了一个函数,允许我们自己设定错误码
VOID SetLastError(DWORD dwErrCode);
错误代码的不同字段
位 31~30 29 28 27~16 15~0
内容 严重性 微软/用户 保留 Facility代码 异常代码
含义 0=成功 0=微软定义 必须为0 前256微软保留 MS和客户定义的代码
1=信息(提示) 1=用户定义
2=警告
3=错误