句柄C++

C++中的句柄

这个句柄只是从英文handle翻译过来的,只问句是什么意思难以解释,这个是我从别人的空间收集的信息,

功能上的理解:

什么是"句柄"(handle),handle的本意是把柄,把手的意思。是你与操作系统打交道的东东。

举个通俗的例子,比如你考上了大学,入学后,学校(操作系统)会给你一个学生证号。

注意,这个号码是学校指定的,你无法自选。

有了这个号码(学生证,假设一证多用)享受学校提供的服务:

如你就可以去图书馆借书,去食堂吃饭,去教室上课等等。

但你不能到食堂里买啤酒,因为学校不允许这种服务。

而在计算机中系统提供的服务就是API调用,你有了HANDLE,就可以理直气壮地向系统提出调用API的服务。

而指针的权力就大多了,有了指针你可以到处去喝酒,打架,学校(操作系统)管不着,

所以句柄和指针的区别在于句柄指针调用系统提供的服务。

而句柄虽然是一个能相互区别的号码,但与我们普通的ID号又有区别,

普通的ID号是可以由程序员自己定义的,而句柄不行,它是对象生成是系统指定的,

是为了区别系统中存在的各个对象,这个句柄不是由程序员符给的。

概念上的理解

1。句柄,是整个windows编程的基础,一个句柄是指使用的一个唯一的整数值,

是指一个四字节长的数值,用于标志应用程序中的不同对象和同类对象中的不同的实例,

诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。

应用程序能够通过句柄访问相应的对象的信息。

2。句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。

如果句柄不用在I/O文件中,它是毫无用处的。

3。句柄是windows用来标志应用程序中建立的或是使用的唯一整数,

windows使用了大量的句柄来来标志很多对象。

机制上的理解

前面的分析很经典,但我认为有一点必须指出的。如果不对,请各位指证。

句柄是指针,一点不假,但是这个指针又与C中的指针有不同之处。

因为Windows是一个多任务的系统,其内存是可以移动的,

这样的话如果某一时刻有一个指针指向一块内存,之后的某个时刻却被系统移走了,

如果你再用这个指针的话就会出错。

为了解决这一问题,windows在系统专区开一块内存用于存放句柄,这个句柄的值就是一个地址,

当这一块内存被移走后,windows就修改这个句柄的值,再访问这块内存时,句柄的值总是有效的。

正因为这样当你使用GlobalAlloc分配的内存时,如果你指定这块内存的属性是固定的,

那么它的返回值可以直接给一个指针,如果是可以移动的,

返回值就必须给一个句柄,你就必须先GlobalLock后才能使用。

这是我对句柄理解,不知道对不对?

我的理解

其实,句柄是一个指向指针的指针。即:

在windows程序设计中,句柄仅是一个应用程序用来识别某些事情的数字

如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。

我们知 道,所谓指针是一种内存地址。

应用程序启动后,组成这个程序的各对象是住留在内的 。

如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。

但是,如果您真的这样认为,那么您就大错特错了。

我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,

Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。

对象被移动意味着它的地址变化 了。如果地址总是如此变化,我们该到哪里去找该对象呢?

为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,

用来专门 登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。

Wi ndows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。

这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。

这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统 。

句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定) →实际对象

但是,必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是

原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成

是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电

影院售给我们的门票总是不同的一个座位是一样的道理。

时间: 2024-10-14 05:52:47

句柄C++的相关文章

终于懂了:Delphi重定义消息结构随心所欲,只需要前4个字节是消息编号就行了,跟Windows消息虽然尽量保持一致,但其实相互没有特别大的关系。有了这个,就有了主动,带不带句柄完全看需要。

比如这个结构就带句柄(放到了第二个参数): TWMContextMenu = packed record Msg: Cardinal; hWnd: HWND; case Integer of 0: ( XPos: Smallint; YPos: Smallint); 1: ( Pos: TSmallPoint; Result: Longint); end; 这个也带,因为确实需要: TWMDropFiles = packed record Msg: Cardinal; Drop: THANDLE

JAVAscript学习笔记 js句柄监听事件 第四节 (原创) 参考js使用表

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>句柄添加监听事件</title> <script type="text/javascript" src="tzy.js"></script> </head> <body>

平台服务器句柄泄露问题的排查与解决

我们监控平台有台报警服务器,其主要功能是接收前端,TDDC,网管服务器等发送的报警,并依据报警联动配置进行相应的联动操作,最近发现在该服务器运行过程中,通过任务管理器查看其句柄数量会不断增加,以至于影响其他服务器工作,初步怀疑是句柄泄露问题,现对其进行分析排查. 句柄是Windows用来标识应用程序所建立或使用的对象的唯一整数,Windows的内核对象包括进线程,窗口,位图,GDI对象等等.应用程序通过句柄访问内核对象,当使用完内核对象之后需要释放资源关闭该内核对象句柄,如果未能正确关闭,则会造

使用事件等待句柄EventWaitHandler 实现生产者、消费者队列

using System; using System.Threading; using System.Collections.Generic; class ProducerConsumerQueue : IDisposable { EventWaitHandle _wh = new AutoResetEvent (false); Thread _worker; readonly object _locker = new object(); Queue<string> _tasks = new

linux下查看系统进程占用的句柄数

查看系统默认句柄数: [[email protected] ~]# ulimit -n 65535 [[email protected] ~]# 查看当前系统打开的句柄数 [[email protected] ~]# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more 553 26093 205 22235 175 25323 142 23897 125 1020 113 6857 79 3570 61 30939 58 19726 53 30

事件句柄

1.事件句柄 (Event Handlers)onabort 图像的加载被中断. onblur 元素失去焦点. onchange 域的内容被改变. onclick 当用户点击某个对象时调用的事件句柄. ondblclick 当用户双击某个对象时调用的事件句柄. onerror 在加载文档或图像时发生错误. onfocus 元素获得焦点. onkeydown 某个键盘按键被按下. onkeypress 某个键盘按键被按下并松开. onkeyup 某个键盘按键被松开. onload 一张页面或一幅图

.NET对象与Windows句柄(三):句柄泄露实例分析

在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有一个句柄泄露的例子.例子中多次创建和Dispose了DataReceiver和DataAnalyzer对象,但由于忘记调用DataAnalyzer的Stop方法,导致产生句柄泄露.本文假定我们已经发现了泄露现象但还不知道原因,讨论如何在这种情况下分析问题. 一.发现问题 在程序运行约一个小时以后,通过任务管理器发现句柄数超过5000,线程数也超过1000.对于一段只需要并行接收和分析数据的简易代码来说,这

先有Delphi内存对象,后有句柄(如果需要的话),最后再显示

在设计期放上一个Panel1和Button1,然后设置Panel1.Visible:=False 这时候执行: procedure TForm1.Button4Click(Sender: TObject); begin ShowMessage(IntToStr(panel1.InstanceSize)); end; 得到552,说明这个Panel1这个内存对象已经存在了.再把它的visible改成true,还是得到552.说明这个内存对象已经存在,且大小没区别(其内容可能会有所不同). 再重新把

管道重定向之重定向标准输入输出句柄

管道重定向之重定向标准输入输出句柄1.如果控制台应用程序数据流中包含中文,则要调用 _tsetlocale(LC_ALL, _T("chs")),否则数据流中的中文字符会被当成中止符而被截断,如printf("abc中文def"),只会输出"abc" 2.printf,cout,wcout中的换行符'\n',会被修改为回车加换行'\r\n'传递到管道中,如有语句printf("abc\r\n"),传递的真实数据流是"

Maltab 句柄处理(Eval, Feval, @)

feval: funcList = {'sin','cos','tan'}; for i=1:numel(funcList) f = feval(funcList{i},1.0); end funcList = {'sin','cos','tan'}; for i= 1:numel(funcList) fh = str2func(funcList{i}); f = fh(1.0); end funcList = {@sin, @cos, @tan}; for i = 1:numel(funcLi