首页 > 句柄是个什么东西?(百度过,但想再听听大家的解释)

句柄是个什么东西?(百度过,但想再听听大家的解释)

句柄是个什么东西?(百度过,但想再听听大家的解释)


先不说句柄的内涵,仅仅从我们使用的角度来看。

我们写程序的时候肯定会用到各种各样的资源,比如创建进程,创建窗口。一个窗口创建完之后我们当前写的程序还是要与这个窗口进行交互的,比如修改个标题之类的。一个窗口的存储方式我们是不知道的,因此我们也不知道如何修改这个窗口标题的细节,因此我们只能使用 Windows API。而windows 此刻显示的窗口有好多,因此需要一个值(或者说ID)来标识这个窗口。这个标识可以是数字、字符串等,只要唯一就好(为了方便实现的原因在windows里面这是一个指针)。其他的句柄也是这个意思,一个ID,是我们使用 window API 创建线程、打开文件、创建窗口时候windows 返回给我们的一个ID,以后我们使用这ID来告诉windows API 我们要操作的是哪个东西。

简单一个程序:

// 资源类型
typedef enum _type_ { Win,/*其他略*/} res_type;
typedef struct _res_ {res_type type;void * p;}res,*hHandle;
// 保存一个窗口的数据
typedef struct _win_ {char title[256];int width;int height;} Win;
// 创建窗口
hHandle createWin(){
    Win *p = (Win *)malloc(sizeof(Win));
    hHandle h = (hHandle)malloc(sizeof(res));
    h-> type = Win;
    h -> p = p;
    return h;
}
// 修改窗口的宽度
int setWidth(hHandle h,int w) 
{
   // ASERT(h-> type == Win);
   ((Win *)(h -> p)) -> width = w;
   return 0;
}
//===============================
int main(){
    hHandle h = createWin();
    setWidth(h,30);
    return 0;
}

显然如果我们知道结构体win 的内部结构,我们可以把setWidth(p,30);直接写为h -> p -> width = w;。可是在 windows 里面,大部分的东西我们都是不知道其内部结构的(没有必要知道,微软也不会告诉我们)。上述代码中我们不需要知道分割线以上的代码(操作系统的实现)只需要知道下面函数的用法就可以写出正确的代码。微软各个数据类型取了个名字叫做句柄。

还需要说明的是句柄不能在进程间简单的共享。如果你把一个进程的句柄的值发送给另外一个进程,那么在另外的进程中这个句柄的值不一定是有意义的,即使有意义也不一定指同一个资源。


一般是个资源地址,比如窗口句柄等


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

以上是百度百科中的描述
简单来说 一个句柄表示一个对象或者实例 也就是说 句柄在该系统中是唯一的不会出现重复的
那么在也就是说 你可以根据句柄来获取 该对象或实例。
比方说 你写一个程序 是对 另一个程序的窗体或者控件进行操作的时候 就可以使用句柄来获取该窗体的对象


一般来说是一个整数值,像身份证一样的某资源唯一标识。
通过这个标识可以对资源进行某种操作。


比如你向系统申请一块内存,申请成功后你会得到指向这内存的指针,这指针就是指向内存地址。
而句柄跟这指针类似,他是指向系统的资源。
比如前面有人说到的窗口句柄,就是指向某个窗口的"指针"。
所以你可以通俗地理解成,句柄是一个指针,他指向某个资源。


简单点说,就是一个把柄,你抓住了它的把柄,你就可以操控它,让它听你的话

【热门文章】
【热门文章】