1。我的理解,进程/线程Id可以唯一标识一个进程,进程handle也是唯一标识一个进程,all right ?
2。一个进程/线程为什么要有两个唯一标识符?它们用途有什么分工?
2。一个进程/线程为什么要有两个唯一标识符?它们用途有什么分工?
解决方案 »
- 既然STARTUPINFO里面可以指定句柄可以继承,那么什么时候需要用到DuplicateHandle?
- 请教MFC里消息机制的相关问题
- 一个自动提交网页的问题(急)
- 在dll中气球提示为什么不能马上显示
- 请教高手:有关bitblt贴图和在贴图上面显示文字的问题
- 各位大虾,请问VC如何通过DDE保存EXCEL文件?
- 哪里有csdn下载?
- 怎样改CTreeCtrl中汉字的字体啊
- 将一个exe文件复制到section当中,然后在另一个文件中提取并恢复,总会出错,有没有什么思路
- 吃软饭的程序员(中美……),有兴趣的请进来讨论……
- 谁有北京科海的《新概念Visual C++6.0教程》的源代码?
- 求能把汉语拼音拆分成声母和韵母的函数代码?? 谢谢!!分不够再加。。
句柄的本质(CSDN)受M$的帮助文档以及很多Windows编程书籍的影响,大家对局柄比较普遍的认识是:句柄
是一个整数,用以标识Windows对象,句柄不是一个指针……
而实际上,这些不过是M$进行数据封装的幌子而已,下面我们一起来分析一下HANDLE到底
是什么。
请先到Windef.h找绝大多数句柄的定义:
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HHOOK);
……
DECLARE_HANDLE(HGDIOBJ);
DECLARE_HANDLE(HBITMAP);
DECLARE_HANDLE(HBRUSH);
……
typedef HANDLE HGLOBAL;
typedef HANDLE HLOCAL;
……
OK, 现在大家跟我一起翻到Winnt.h,看看DECLARE_HANDLE和HANDLE到底是什么:
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; };
typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;
哈哈,现在知道了吧,HANDLE就是PVOID,也就是无类型指针,
而DECLARE_HANDLE(HWND);就是:
struct HWND__ {
int unused;};
typedef struct HWND__ *HWND;
现在实际上都清楚啦,这些Handles都不过是指向struct的指针,至于这个struct的用处
,连M$都说unused了,^o^
现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结
构指针传来传去,可是你却不知道它到底指向的内容是什么,
而且可以编个句柄的瞎话防止大家的质疑:)。而M$的程序大可以这么写:
#include <windows.h> //这个和大家用的一样
#include "windows_in.h" //这个是M$自用的,外人别想看到^o^
HSOMETHINGELSE DoSomething(HSOMETHING hSomething) {
struct RealSomething* p = (struct RealSomething*)hSomething; //先强制类型
//转换成内部结构指针
……do something……
return (HSOMETHINGELSE)pRealSomethingElse;//强制类型逆转换
}这段同样转载自CSDN,指明使用句柄而不是内存地址来使用对象的作用。句柄是一个32位的整数,实际上是WINDOWS在内存中维护的一个对象(窗口等)内存物
理地址列表的整数索引。因为WINDOWS的内存管理经常会将当前空闲对象的内存释放掉,
当需要时访问再重新提交到物理内存。所以对象的物理地址是变化的,不允许程序直接
通过物理地址来访问对象。程序将想访问的对象的句柄传递给系统,系统根据句柄检索
自己维护的对象列表就能知道程序想访问的对象及其物理地址了。
线程HANDLE:这个线程函数在内存中的地址