《Windows核心编程》相关名词概念

索引目录

在学习《windows核心编程》开始,要了解一些常用的知识,这里收集了一些个人理解的知识点,便于以后的学习。

1.句柄

从句柄自身的类型来理解,它是一个32位无符号整数值,网上的说法基本统一为:句柄是对象的唯一标识,而这个整数值就是和对象一一对应(相互映射)。
从语义通俗理解是提东西(大)的手柄(小)。因为windows内核对象(创建的线程、打开的文件、窗口等)拥有大量的属性,不可能每次都传递这么多字节,所以在进程的地址空间中设一张表,表里头专门保存一些编号和由这个编号对应一个地址,而由那个地址去引用实际的对象,这个编号就是句柄。相等于指向指针的指针。

讨论:为什么有句柄这一概念?

应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。
这个认知是错误的,因为**”Windows是一个以虚拟内存为基础的操作系统“**,而Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。

讨论:如果地址总是如此变化,我们该到哪里去找该对象呢?
操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。
在这里插入图片描述

2.错误处理

书中提到很多返回值,得知通过返回值是不能知道函数调用为什么会失败,这时候就需要Windows内部的错误检测机制:即书中提到的“采用线程本地存储区的机制来将相应的错误代码与“主调线程”关联到一起。它可以使不同的线程能独立运行,不会出现相互干扰对方的错误代码的情况。”

讨论: 线程本地存储(TLS).
TLS出现的原因:一个进程中,所有线程是共享同一个地址空间的。所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线程对其进行了修改,也就会影响到其他所有的线程。所以推荐用基于堆栈的自动变量或函数参数来访问数据,因为基于堆栈的变量总是和特定的线程相联系的。
而有时候要用到全局或静态,为保证在多线程程序中能访问而不互相影响,OS提供了TLS。

书中列举错误的三种表示:
1.一个消息ID(一个可在源代码直接使用的宏名,用于与GetLastError()返回值比较)
2.消息文本(描述错误内容的英文文本)
3.编号(可理解为宏的具体值,在代码中最好不要直接出现,否则增加代码阅读理解的难度,不利于开发进行)
当函数发生各种不同的错误时,为了使调用者可以通过GetLastError()函数来访问错误代码,以便于观察具体发生的错误而不是直接结束程序,需要我们设置线程的上一个错误代码,再让自己的函数返回这个错误值即可,调用SetLastError()并传入一个32位合适值即可。
最后一点值得注意的是,错误发生后应立即用GetLastError()来诊断错误,成功调用的Windows函数可能使用用ERROR_SUCCESS改写GetLastError()函数的值,这个操作是不可逆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值