句柄的概念

所谓句柄就是一个 Long型的数据。

句柄是Windows 用于表示应用程序创建出来的对象的唯一的整数。 Windows 使用各种各样的句柄来标识应用程序实例,窗口控制,位图, GDI 对象等等。 Windows 句柄有点像 C 语言中的文件句柄。

从上面的定义我们可以看到,句柄是一个标识符,是用来标识对象或者项目的。应用程序总是通过调用一个 Windows函数来获得一个句柄。这样,之后的其他 Windows 函数就可以通过使用该句柄来应用相应的对象。

若想更透彻一点的认识句柄,可以把句柄说成指向指针的指针。指针是一种内存地址。应用程序启动后,组成这个程序的各个对象是驻留在内存的。所以似乎我们只要获知这个内存的首地址就可以随时用这个地址访问对象,可是这种说法不对。 Windows是一个以虚拟内存为基础的操作系统。 Windows 内存管理器经常在内存中来回移动对象以此来满足各种应用程序的内存需要,对象被移动意味着地址变化了。

为了解决这问题, Windows为各应用程序腾出一些内存储地址,用来专门登记各应用对象的地址变化,而这存储变化的地址本身是不变的。句柄地址是稳定的,句柄地址记载着对象在内存中的地址。而对象的内存地址是不稳定的。这个句柄地址是在对象装载时系统分配给的,当系统系在是又释放给系统。

Windows API 给项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。但是,系统不能保证每次程序重新启动后分配给某一程序的句柄为原来的句柄。

根据提供的引用内容,没有明确说明“哈希表的处理句柄含义”这个问题。但是可以解释一下哈希表中的处理句柄概念。 在哈希表中,处理句柄通常是指一个指向哈希表中某个元素的指针或引用。通过处理句柄,我们可以访问哈希表中的元素,进行查找、插入、删除等操作。 在使用第三方头文件uthash.h实现哈希表时,处理句柄通常是一个指向自定义结构体的指针。通过在结构体中定义UTHASH_HANDLE字段,uthash.h可以自动为结构体生成处理句柄。例如: ```c #include "uthash.h" struct my_struct { int id; char name[10]; UT_hash_handle hh; }; struct my_struct *users = NULL; ``` 在上面的例子中,我们定义了一个名为my_struct的结构体,并在其中定义了UTHASH_HANDLE字段hh。通过这个字段,我们可以使用uthash.h提供的宏来实现哈希表的相关操作。例如,我们可以使用HASH_ADD_INT宏将一个整型id和一个my_struct结构体添到哈希表中: ```c struct my_struct *s = malloc(sizeof(struct my_struct)); s->id = 1; strcpy(s->name, "John"); HASH_ADD_INT(users, id, s); ``` 在上面的例子中,我们使用HASH_ADD_INT宏将s添到users哈希表中,并以s->id作为哈希表的键值。通过这个操作,我们可以使用处理句柄users来访问哈希表中的元素,例如: ```c struct my_struct *s; int id_to_find = 1; HASH_FIND_INT(users, &id_to_find, s); if (s != NULL) { printf("Found user %s\n", s->name); } ``` 在上面的例子中,我们使用HASH_FIND_INT宏在users哈希表中查找id为1的元素,并将结果存储在s中。如果找到了元素,我们就可以使用s->name来访问元素的name字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值