日期:2014-05-19  浏览次数:20720 次

请教下什么是句柄
请各位哥哥姐姐解释下什么是句柄以及如何使用


------解决方案--------------------
Handler,很抽像~~基本上是控制某个东东的一种方法
------解决方案--------------------
对很多工具的操作,都是通过“柄”来完成的,比如勺子、铲子等,得到了它的“柄”,就可以让它执行什么操作。
------解决方案--------------------
paste一下

单从概念上讲,句柄指一个对象的标识,而指针是一个对象的首地址。从实际处理的角度讲,即可以把句柄定义为指针,又可以把它定义为同类对象数组的索引,这两种处理方法都有优缺点,至于选用哪种方式,完全应该看实际需要,这可以说是一种程序设计上的技巧。那种单纯认为句柄是指针或索引的想法都是机械的、不确切的。

其实,在Windows中类似的处理是很多的、很灵活的。再具个相似的例子:

我们知道,在Windows中有个函数叫做CallWindowProc。故名思义,它的作用就是向指定的窗口过程传递一个消息。你也许会想,既然我已经有了窗口过程的指针,为什么我不可以直接通过这个指针调用该函数(这是C语言的内建功能)?事实上,在Win16中确实可以这么做,因为GetWindowLong返回的确实是该函数的指针。但在Win32下,GetWindowLong返回的并不是该函数的指针,而是一个包含函数指针的数据结构的指针(MSDN上说返回的是一个窗口函数地址或它的句柄,就是指的这种情况)。该数据结构是可变的,但只要你使用CallWindowProc来调用的话是不会出错的。这里我们又看到使用句柄处理带来的好处。(补充说明一点:微软在这里之所以这么处理,是为了解决16位/32位以及ANSI/UNICODE的转化问题)

------解决方案--------------------
ls说的很生动呢~~
------解决方案--------------------
句柄是一个(通常为32位的)整数,它代表一个对象。Windows中的句柄类似传统C或者MS-DOS程序设计中使用的文件句柄。程序几乎总是通过呼叫Windows函数取得句柄。程序在其它Windows函数中使用这个句柄,以使用它代表的对象。

在 Windows 中,窗口可以有许多种。窗口可以是屏幕上的一块矩形封闭区域,比如您熟悉的应用程序窗口。窗体上的控件(例如列表框或滚动条)也可以是窗口,但并不是所有类型的控件都是窗口。桌面上的图标和桌面本身也是窗口。因为所有这些类型的对象都是窗口,所以 Windows 可以用类似的方式处理它们。Windows 给每个窗口一个唯一的句柄,通过句柄操纵该窗口。许多 API 函数可返回句柄或者接受句柄作参数。

创建窗口时,Windows 给它指派一个句柄,窗口消失后句柄被释放。
//这个是网上载的,要我的话说,句柄是给操作该程序提供 "拿 "的地方.
------解决方案--------------------
我学浅 现在才对句柄有点印象
------解决方案--------------------
在Windows里,句柄代表系统中资源(广泛)的唯一标识。可以用Spy++看一看。
------解决方案--------------------
句柄就是操作系统资源的唯一标识
这里的资源包括窗体、文件、线程、端口等等
操作系统就是通过句柄才知道你要访问的是那一个资源
------解决方案--------------------
句柄多数情况是用在API函数的调用上
当然.NET已经封装一遍API调用
所以C#中用的机会不是很多,比如:
Graphics vGraphics = Graphics.FromHwnd(Handle);
Control vControl = Control.FromHandle(Handle);

当然,难免会在以后的项目中用到API最好有个心理准备

------解决方案--------------------
看来以前做c++的人还是满多的
------解决方案--------------------
.NET中封装得相当好了

以前VC下的很多东西都不必去接触了,如果没有很特殊的需要,是不会用到这个概念的

一般来说,只要用过VC,基本都要接触句柄(指向资源ID的整数),有了它才能操作设备、窗口、端口,做什么事情都要用到它

还有很多时候为怎么获取句柄发愁。。。

.NET把WINDOWS底层的复杂机制(其实我觉得很多都是一些沉淀下来的垃圾,没人去整理)做了过滤和封装,把编程门槛也降低了非常多,让程序员的精力更多集中在业务逻辑而不是怎么和WINDOWS系统打交道上。
------解决方案--------------------
.net

1.x 主要用 IntPtr

2.0
推荐使用 SafeHandle
------解决方案--------------------
都是对非托管资源的操作系统句柄的包装类
------解决方案--------------------
就是你的身份证号,或者说是你的身份证,身份证是个东西,身份证号是个字符串。
------解决方案--------------------
在Windows中,os可能对你的程序在内存中的位置进行移动,程序移动后怎么样保证仍然可以获取到这个程序的入口地址呢?windows专门开辟出一块内存(这个内存中的数据是不移动的)保存各个程序的地址,可看成如下示:
名柄 程序地址
Hander1 程序1的地址
Hander2 程序2的地址
这样OS移动你的程序后只要更改程序地址即可,意思是我们只要知道句柄就可以不用考虑程序地址的变化,简化了编程人员的负担.
句柄是OS的重要资源,注意及时释放