Win32 Error


一、Win32错误

也就是Win32子系统产生的错误。当我们在自己的代码里调用Windows系统的API函数,系统执行API内部代码,当API内部代码出现错误,会将预先定义好的错误代码写到调用这个API的线程局部存储区域(这个区域是每个线程独有的其他线程无法更改。它存储着一些线程独有的东西),然后API返回,返回值告诉我们该API执行失败了。如果我们的代码加了检测,发现了API失败,这时我们调用GetLastError() 函数去获取这个错误代码,这个错误代码是一个DWORD值。如果我们不及时获取,就会被后面调用的API所覆盖。当我们想在自己的函数里借用这种机制时,可以调用SetLastError函数来设置一个错误代码。

这里我们提到了两个API:

  • DWORD GetLastError(VOID)
  • void SetLastError(DWORD dwErrCode)

二、Win32 Error Code

所有Win32错误代码都必须在0x0000到0xFFFF范围内,尽管Win32错误代码可以同时用于16位字段和32位字段,我们通常还是用32位来表示。大多数值已经定义了默认错误消息,可用于将值映射到我们可以读懂的文本消息。它的构成如下:

虽然win32子系统错误的位域有32bit,但受限于值的范围,也只能是0x00000000---0x0000FFF,也就是上面的位域高16bit都是0。

三、获取错误具体信息
通过前面的说明我们了解了错误代码的获取,以及错误代码和信息是怎么制作出来的,那么当我们用GetLastError获取到错误代码后,我们只是有了一个编号,还是不了解具体什么原因什么错误,这时,我们该用到另外一个函数了FormatMessage。

原型:

DWORD  WINAPI FormatMessage (
                             DWORD  dwFlags,  // source and processing options
                             LPCVOID  lpSource,  // message source
                             DWORD  dwMessageId,  // message identifier
                             DWORD  dwLanguageId,  // language identifier
                             LPTSTR  lpBuffer,  // message buffer
                             DWORD  nSize,  // maximum size of message buffer
                             va_list  *Arguments  // array of message inserts
 
                             );
它的功能就是将 GetLastError函数得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数。
四、总结
我们可以自定义错误代码和信息,通过SetLastError来实现我们自己的代码的错误处理机制,然后通过系统API或自定义函数的返回值,检测函数是否失败,若失败,通过GetLastError函数获取线程里当前的错误代码,在通过 FormatMessage来查询错误信息,写到我们自己的日志里,来帮助我们调试程序的功能性和业务性问题。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM