`

大话 句柄和ID,通俗理解。

 
阅读更多

句柄和ID
在Windows程序设计中,句柄无所不在,窗口有窗口的句柄HWND,线程和进程也有句柄HANDLE,甚至有人把套接字也称为句柄(我就是这样的)。

句柄在英文中是handle,作为动词讲是处理的意思。简而言之,句柄是处理对象的一个接口,对于程序中所涉及的对象,你可以通过句柄去操作他。你不应该试图去回答句柄是什么,而应该从务虚的角度去理解他,知道他干什么即可。

有人说,因为handle的定义是void *,因此他是一个指针。有些熟悉内核的人说这是一个索引。这些说法都是不准确的。需要注意的是,微软并没有精确定义句柄的含义,也许在某个特殊的操作系统中,他使用了一种内部含义,但是在其他版本中,就不保证这样了。任何对句柄的内在假设都可能导致灾难性的后果。

API是接口,句柄是接口,两者有什么区别?API是一个通用的函数族,他处理所有的对象,而句柄是和某个具体对象相关联的数据结构。只有借助句柄,API才知道处理哪个对象。

有些对象有ID。句柄表示特殊的对象,ID也表示某个对象,为什么要两个东西来表示?

首先,句柄不能唯一表示对象。一个对象可以有多个句柄。例如:假设我们用CreateProcess创建一个进程,该进程的第一个线程的句柄会返回给调用 CreateProcess的进程。同时,在新创建的进程中,该线程也会有一个句柄。这样,这个线程就有两个句柄。我们也可以用 DuplicateHandle复制一个句柄,这个句柄和原来句柄是不一样的,但是他们都表示同一个对象。而每个有ID的对象,在系统范围内,ID肯定是唯一的。

其次,句柄所能实现的功能ID不能实现。毕竟ID只是一个数字,他不能记录很多信息。而句柄可能在其内部结构中记录了很多信息(如权限、有无信号等)。

总之,如果试图解释他到底是什么,学习句柄就会误入歧途。从虚的角度去理解,对于新手是难一点,但是这也许是唯一正确的办法。


句柄一般是操作系统避免你直接对某个对象数据结构进行操作而引入的,可以通过句柄来使用某个对象,而不用知道句柄的内容。

句柄是一种指向指针的指针。我们知 道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一 个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化 了。如果地址总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。 Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象。但是,必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

句柄和控件ID的区别

你的家庭现在就好比是一个程序(窗体也是程序的一部分,实际窗体、控件都是由命令语句动态构建的,只是省了你自己写代码而已,autoit的窗体和控件好像就只能用代码构建,和vb还不一样),控件ID就好像你的名字,一般一个家庭(程序)里的众多成员(控件)之间是不会重名的,每个人在自己家(程序)里的名字(控件ID)都是唯一的,当你的家人(程序代码)需要找你,叫你名字的时候就直接称呼你的名字(控件ID)。

但是全国无数个家庭,就可能会有重名了吧,于是政府(系统)就不管你的名字(控件ID)是什么,直接分配给每个人(控件)一个身份证号码(句柄),公安局(其他程序)来找你(一个控件)的时候就使用你的身份证号(句柄)来保证在全国(内存)范围里也不会把你弄错。

每个家庭组成以后(运行了一个新程序),生下了小宝宝(构建新的控件)就会得到一个全国(内存)唯一的一个身份证号(句柄),以保证在国内(内存)的唯一性。当一个家庭的成员寿终正寝(控件销毁)的时候,身份证号码(句柄)同时被作废(系统收回,以后分配给新产生的控件)。

什么是“句柄”(handle),handle的本意是把柄,把手的意思。是你与操作系统打交道的东东。举个通俗的例子,比如你考上了大学,入学后,学校(操作系统)会给你一个学生证号。注意,这个号码是学校指定的,你无法自选。有了这个号码(学生证,假设一证多用)享受学校提供的服务:如你就可以去图书馆借书,去食堂吃饭,去教室上课等等。但你不能到食堂里买啤酒,因为学校不允许这种服务。而在计算机中系统提供的服务就是API调用,你有了HANDLE,就可以理直气壮地向系统提出调用API的服务。而指针的权力就大多了,有了指针你可以到处去喝酒,打架,学校(操作系统)管不着,所以句柄和指针的区别在于句柄只能调用系统提供的服务。而句柄虽然是一个能相互区别的号码,但与我们普通的ID号又有区别,普通的ID号是可以由程序员自己定义的,而句柄不行,它是对象生成时系统指定的,是为了区别系统中存在的各个对象,这个句柄不是由程序员符给的。

  句柄
    1.句柄,是整个windows编程的基础,一个句柄是指使用的一个唯一的整数值,是指一个四字节长的数值,用于标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息。
    2.句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。
    3.句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来来标志很多对象。
   

说明:实例——在windows环境下,不但可以运行多个应用程序,还可以运行多个应用程序的多份拷贝,每个拷贝叫做一个实例,并且有不同的实例句柄。一个实例句柄是windows可以单独运行的副本,是唯一可以标志此实例的整数

分享到:
评论

相关推荐

    通过窗口句柄取得进程ID

    总的来说,通过窗口句柄取得进程ID是Windows编程中常用的一个技巧,特别是在进行进程管理和窗口操作时。易语言提供的API函数接口使得这个过程变得简单易行,只需几行代码就能完成任务。在开发过程中,合理运用这些...

    通过进程ID找到窗口句柄.

    此函数获取指定窗口所属的进程ID和线程ID。 **返回值**: 返回创建窗口的线程ID。 #### 三、代码实现 接下来,我们将通过示例代码展示如何结合这两个API函数来实现通过进程ID找到窗口句柄的功能。 **示例结构...

    获取其他进程ID和控件句柄

    首先,我们要理解什么是进程ID和控件句柄。进程ID是操作系统为每个运行的进程分配的唯一标识符,用于区分系统中的不同进程。控件句柄,也称为窗口句柄,是Windows操作系统中用来标识和操作特定窗口或控件的对象引用...

    易语言通过窗口句柄取得进程ID

    3. **获取进程ID**:调用`GetWindowThreadProcessId`函数,传入窗口句柄和一个临时变量。该函数会将进程ID写入临时变量,返回的是窗口所属线程的ID。 4. **处理结果**:检查返回的进程ID是否有效,无效可能是窗口...

    VC进程ID获得主窗口句柄获得进程名

    //同时得到进程ID和主线程ID. 3.窗口HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程名 进程ID (注:进程名,即在"任务管理器"中看到的名字) 用CCheckObject类(详细实现源文件); ...

    MFC 句柄的理解

    理解句柄、进程ID和`HINSTANCE`的用途和工作原理,可以帮助开发者编写出更加高效和稳定的Windows应用程序。在实际开发中,合理地管理和使用句柄,可以避免不必要的内存拷贝,提高程序性能,并确保系统的稳定运行。

    VC由进程ID获取窗口句柄

    VC++提供了两种方法来获取进程句柄:通过进程ID和通过进程名。 1. 通过进程ID获取进程句柄 使用OpenProcess函数可以通过进程ID获取进程句柄。下面是一个示例代码: ```cpp HANDLE GetProcessHandle(int nID) { ...

    句柄和指针的区别

    通过上述分析可以看出,句柄和指针虽然都指向内存中的数据,但它们的设计理念和应用场景有着根本的不同。句柄更多地是从系统层面考虑,为了解决资源管理和安全性的问题;而指针则是从程序员的角度出发,提供了直接...

    通过进程id获取主窗口句柄及主窗口标题

    通过进程id获取到所在进程的主窗口的句柄,及通过该主窗口句柄获取当前主窗口的标题,进程名;这是一个demo例程,仅供参考

    取窗口句柄+进程名+进程ID

    取指定标题窗口的句柄,进程名,进程ID 取指定标题窗口的句柄,进程名,进程ID 取指定标题窗口的句柄,进程名,进程ID 取指定标题窗口的句柄,进程名,进程ID 取指定标题窗口的句柄,进程名,进程ID

    句柄搜索 显示句柄

    在IT领域,句柄搜索和显示句柄是操作系统级别的编程技术,主要应用于系统资源的管理和调试。本篇文章将深入探讨2012年备受推崇的“金鹰句柄搜索”工具,它集成了闪动句柄功能,为开发者和系统管理员提供了一种强大的...

    窗口句柄浅析和获取窗口句柄的方法

    理解和正确使用句柄是编写高效、稳定的Windows应用程序的基础。不论是SDK编程还是MFC编程,对句柄概念的深入理解都将对开发者大有裨益。通过学习和实践,开发者可以更好地掌握如何创建、操作和管理各种类型的句柄,...

    易语言源码通过窗口句柄取得进程ID.rar

    易语言源码通过窗口句柄取得进程ID.rar 易语言源码通过窗口句柄取得进程ID.rar 易语言源码通过窗口句柄取得进程ID.rar 易语言源码通过窗口句柄取得进程ID.rar 易语言源码通过窗口句柄取得进程ID.rar 易语言源码...

    E语言通过窗口句柄获取进程ID

    E语言通过窗口句柄获取进程ID

    C++中句柄和指针的区别

    在C++编程中,句柄和指针是两种不同的数据访问机制,它们都在不同场景下用于访问和操作内存中的对象。...在Windows开发中,理解并正确使用句柄和指针是至关重要的,因为它们是实现各种系统级交互的基础。

    窗口句柄捕获工具

    它附带的C++源码和VS2013工程,对于学习Windows API编程和理解窗口句柄处理机制的开发者来说,是一份宝贵的参考资料。通过查看和分析源代码,用户可以深入了解如何利用Windows API函数实现这样的功能,例如`...

    句柄和API介绍

    句柄和 API 介绍 句柄概念在 WINDOWS 编程中是一个很重要的概念,在许多地方都扮演着重要的角色。句柄是用来标识项目的,这些项目包括模块、任务、实例、文件、内存块、菜单、控制、字体、资源,包括图标、光标、...

    windows进程句柄权限控制

    句柄不仅包含了对象的唯一ID,还包含了访问权限信息,这是它不同于直接使用对象ID的关键之处。 接下来,我们讨论权限控制。Windows为每个句柄分配了一组访问权利,这些权利定义了进程可以对对象执行的操作。例如,...

Global site tag (gtag.js) - Google Analytics