Windows程序内部运行机制:窗口、句柄和上下文的理解  您所在的位置:网站首页 句柄怎么理解词语 Windows程序内部运行机制:窗口、句柄和上下文的理解 

Windows程序内部运行机制:窗口、句柄和上下文的理解 

2024-07-13 23:28| 来源: 网络整理| 查看: 265

目录

 

窗口、句柄和上下文的理解

窗口

句柄

上下文

参考

窗口、句柄和上下文的理解 窗口 窗口通过窗口句柄(HWND)标识对窗口操作,首先要获得该窗口的句柄 句柄

从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。

Windows系统中定义了许多内核对象(这里的对象不完全等价于"面向对象程序设计"一词中的"对象",虽然实质上差不多),比如打开的文件,创建的线程,程序的窗口等。这些重要的对象肯定不是4个字节或者8个字节足以完全描述的,他们拥有大量的属性。为了保存这样一个"对象"的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,但这至少有两个缺点:

暴露了内核对象本身,使得程序(而不是操作系统内核)也可以任意地修改对象地内部状态(首地址都知道了,还有什么不能改的),这显然是操作系统内核所不允许的操作系统有定期整理内存的责任,如果一些内存整理过一次后,对象被搬走了怎么办

所以,Windows操作系统就采用进一步间接的方法:在进程的地址空间中设一张表,表里保存一些编号和由这个编号对应一个地址,由地址去引用实际的对象,而编号跟地址在数值上没有任何规律性的联系,纯粹是映射而已。在Windows系统中,这个编号就叫做"句柄"。

Handle本身是一个32位的无符号整数,它用来代表一个内核对象。它并不指向实际的内核对象,用户模式下的程序永远不可能获得一个内核对象的实际地址(一般情况下)。Handle实际上是作为一个索引在一个表中查找对应的内核对象的实际地址,那么这个表在哪里呢?每个进程都有这样的一个表,叫句柄表。该表的第一项就是进程自己的句柄,这也是为什么你调用GetCurrentProcess()总是返回0x7FFFFFFF原因。

简单地说,Handle就是一种用来"间接"代表一个内核对象的整数值。你可以在程序中使用handle来代表你想要操作的内核对象。这里的内核对象包括:事件(Event)、线程、进程、Mutex等等。我们最常见的就是文件句柄(file handle)。

另外要注意的是,Handle仅在其所属的进程中才有意义。将一个进程拥有的handle传给另一个进程没有任何意义,如果非要这么做,则需要使用DuplicateHandle(),在多个进程间传递Handle是另外一个话题了,与这里要讨论的无关。

上下文

每一段程序都有很多外部变量,只有像Add这种简单的函数才是没有外部变量的。一旦一段程序有了外部变量,这段程序就不完整,不能独立运行。为了使他们运行,就要给所有的外部变量一个一个写一些值进去,这些值的集合就叫上下文。

在C或者C++中,context一般就是一个结构体,用来存储一些关键信息,比如切换上下文时,要保存切换之前的状态和数据,这需要一个结构体来承担,然后将contex中的状态和数据重新赋值为新的,这样就切换了,等运行完了之后,又要切换回来,那么之前保存的那些状态和数据又要重新启用了。

Context,在程序翻译为上下文,就是提供一些程序的运行环境基础信息。比如,要运行一个APP,这个APP运行时需要加载配置文件,然后写到一个类中,然后你需要的时候,通过这个类来获取这些参数,这个类就是所谓的上下文,简单的理解,就是相关的内容。

设备上下文是一种包含有关某个设备(如显示器或打印机)的绘制属性信息的 Windows 数据结构

参考

什么是句柄?为什么会有句柄?HANDLE

编程中什么是「Context(上下文)」



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有