Win32 GetLasrError 实现

 Windows编程人员都知道windows下有一个函数

DWORD GetLastError(VOID);
用于返回调用函数的错误信息。他是怎么实现的呢?
大家知道进程只是一个容器,线程的容器,所有的指令在线程下运行。 一个应用程序最少有一个线程,称为主线程,主线程可以创建辅助线程。每个线程都有自己的一块专有内存区域,_tiddata(多线程,C运行库errno)。
当程序(线程)运行了一个函数后,会将错误信息设置到_tiddata的_terrno变量中。
_tiddata的源码在VS src mtdll.h中。我的在
D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src下。
节选一点点如下:

/* Structure for each thread's data */
struct _tiddata {
    unsigned long   _tid;       /* thread ID */
    uintptr_t _thandle;         /* thread handle */
    int     _terrno;            /* errno value */
   void *      _initaddr;      /* initial user thread address */
    。。。。
    };

这样当我们调用GetLastError时,只需要将_terrno的值返回即可。
DOWRD GetLastError()
{
_piddate ptd = _getptd_noexit();
return (&ptd->_terrno);
}
实际上当然不是这样简单的,我只是举个列子。实际上是通过TLSGetValue获取主调线程数据块地址。
TLS-线程区域存储空间。

参考《windows核心编程》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值