学什么可以做视频网站,工程建设教育网首页,做网站三大主流框架,昌平网站建设推广优化seo原文链接#xff1a;
http://hi.baidu.com/dandanfeng160/blog/item/4eaa3df5215bc42dbd310955.html
在Windows程序设计中#xff0c;句柄是无法精确定义的术语。随便找一个高手#xff0c;让他给你讲讲句柄是什么#xff0c;恐怕他都很难给你一个具体的定义来。
在Wind…原文链接
http://hi.baidu.com/dandanfeng160/blog/item/4eaa3df5215bc42dbd310955.html
在Windows程序设计中句柄是无法精确定义的术语。随便找一个高手让他给你讲讲句柄是什么恐怕他都很难给你一个具体的定义来。
在Windows程序设计中句柄无所不在窗口有窗口的句柄HWND线程和进程也有句柄HANDLE甚至有人把套接字也称为句柄我就是这样的。
句柄在英文中是handle作为动词讲是处理的意思。简而言之句柄是处理对象的一个接口对于程序中所涉及的对象你可以通过句柄去操作他。你不应该试图去回答句柄是什么而应该从务虚的角度去理解他知道他干什么即可。
有人说因为handle的定义是void *因此他是一个指针。有些熟悉内核的人说这是一个索引。这些说法都是不准确的。需要注意的是微软并没有精确定义句柄的含义也许在某个特殊的操作系统中他使用了一种内部含义但是在其他版本中就不保证这样了。任何对句柄的内在假设都可能导致灾难性的后果。
API是接口句柄是接口两者有什么区别API是一个通用的函数族他处理所有的对象而句柄是和某个具体对象相关联的数据结构。只有借助句柄API才知道处理哪个对象。
有些对象有ID。句柄表示特殊的对象ID也表示某个对象为什么要两个东西来表示
首先句柄不能唯一表示对象。一个对象可以有多个句柄。例如假设我们用CreateProcess创建一个进程该进程的第一个线程的句柄会返回给调用CreateProcess的进程。同时在新创建的进程中该线程也会有一个句柄。这样这个线程就有两个句柄。我们也可以用DuplicateHandle复制一个句柄这个句柄和原来句柄是不一样的但是他们都表示同一个对象。而每个有ID的对象在系统范围内ID肯定是唯一的。
其次句柄所能实现的功能ID不能实现。毕竟ID只是一个数字他不能记录很多信息。而句柄可能在其内部结构中记录了很多信息如权限、有无信号等。
总之如果试图解释他到底是什么学习句柄就会误入歧途。从虚的角度去理解对于新手是难一点但是这也许是唯一正确的办法。
我们知道所谓指针是一种内存地址。应用程序启动后组成这 个程序的各对象是住留在内存的。如果简单地理解似乎我们只要获知这个内存的首地址那么就可以随时用这个地址 访问对象。但是如果您真的这样认为那么您就大错特错了。我们知道Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下Windows内存管理器经常在内存中来回移动对象依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化 了。如果地址总是如此变化我们该到哪里去找该对象呢?为了解决这个问题Windows操作系统为各应用程序腾出一些内存储地址用来专门 登记各应用对象在内存中的地址变化而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的当系统卸载时(Unload)又释放给系统。句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象。但是必须注意的是程序每次从新启动系统不能保证分配给这个程序的句柄还是原来的那个句柄而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成 是一个应用程序的启动运行那么系统给应用程序分配的句柄总是不一样这和每次电 影院售给我们的门票总是不同的一个座位是一样的道理。