模块句柄(实例句柄)和句柄的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块句柄(实例句柄)和句柄的区别相关的知识,希望对你有一定的参考价值。
看过windows核心编程的都知道有很多概念。同时如果你不只对windows有所了解,对linux mac等 *unix操作系统也有所了解的话。可能会出现有的东西都重合,而有的没有。这里说下win下句柄概念。网上解释:
解释一:
1.模块的概念
一个模块代表的是一个运行中的exe文件或dll文件,用来代表这个文件中所有的代码和资源,磁盘上的文件不是模块,装入内存后运行时就叫做模块。一个应用程序调用其他DLL中的API时,这些DLL文件被装入内存,就产生了不同的模块,为了区分地址空间中的不同模块,每个模块都有一个惟一的模块句柄来标识。Win16,Win16中不同运行程序的地址空间并非是完全隔离的,一个可执行文件运行后形成"模块",多次加载同一个可执行文件时,这个"模块"是公用的,为了区分多次加载的"拷贝",就把每个"拷贝"叫做实例,每个实例均用不同的"实例句柄"(hInstance)值来标识它们。但在Win32中,程序运行时是隔离的,每个实例都使用自己私有的4 GB空间,都认为自己是惟一的,不存在一个模块的多个实例的问题,实际上在Win32中,实例句柄就是模块句柄,但很多API原型中用到模块句柄的时候使用的名称还是沿用hInstance,所以我们还是把变量名称取为hInstance。
在C语言的编程中,hInstance通过WinMain由系统传入,WinMain的原型是:
WinMain(hInstance,hPrevInstance,lpzCmdParam,nCmdShow),程序不用自己去获得hInstance,这个过程由C的初始化代码代劳了,但在Win32汇编中hInstance必须自己获取,如果不了解hModule就是hInstance的话,就无法得知如何得到hInstance,因为并没有一个类似于GetInstanceHandle之类的API函数。
2.句柄是什么
随着分析的深入,句柄(handle)一词也出现得频繁起来,"句柄"是什么呢?句柄只是一个数值而已,它的值对程序来说是没有意义的,它只是Windows用来表示各种资源的编号而已,可见只有Windows才知道怎么使用它来引用各种资源。
下面举例说明。屏幕上已经有10个窗口,Windows把它们从1到10编号,应用程序又建立了一个窗口,现在Windows把它编号为11,然后把11当做窗口句柄返回给应用程序,应用程序并不知道11代表的是什么,但在操作窗口的时候,把11当做句柄传给Windows,Windows自然可以根据这个数值查出是哪个窗口。当该窗口关闭的时候,11这个编号作废。第二次运行的时候,如果屏幕上现有5个窗口,那么现在句柄可能就是6了,所以,应用程序并不用关心句柄的具体数值是多少。打个比方,可以把句柄当做是商场中寄放书包时营业员给的纸条,纸条上的标记用户并不知道是什么意思,但把它交还给营业员的时候,她自然会找到正确的书包。
Windows中几乎所有的东西都是用句柄来标识的,文件句柄、窗口句柄、线程句柄和模块句柄等,同样道理,不必关心它们的值究竟是多少,拿来用就是了!
解释二:
在WINDOWS下,模块指的是EXE和DLL等数据加载到内存中的影像,模块句柄又是比较特殊的,它跟一般的句柄不一样,模块句柄指向的就是EXE和DLL等的在内存的位置(就是指向它们的数据起始位置,也就是加载基址);进程句柄只是WINDOWS用来标识某个进程的ID值罢了,在内部,WINDOWS使用一种类似MAP的技术来进行映射的,就是通过这个进程句柄来找到指定进程在内存的位置。
这里再说明下: 句柄在系统内核中是用一个句柄表表示的,每个内核对象在系统中只有一个。句柄值就是句柄表中的一个下标(偏移)。
以上是关于模块句柄(实例句柄)和句柄的区别的主要内容,如果未能解决你的问题,请参考以下文章
AutoCAD ObjectId 指针句柄和 ads_name的区别