windows为什么要分数据类型创建其自己的数据类型,比如HANDLE句柄是一个无符号整型,为什么不直接用C++数据类型

频道本月排行
随机推荐文章
Copyright (C) 2006 - 2016 www.eorder.net.cn
All Rights Reserved下次自动登录
现在的位置:
概念上的理解
    句柄,是整个windows编程的基础,一个句柄是指使用的一个唯一的整数值,是指一个四字节长的数值,用于标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等,应用程序能够通过句柄访问相应的对象的信息。但是,句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。 句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来标志很多对象。
    从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。
    如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?
    为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。
    句柄地址(稳定)→记载着对象在内存中的地址——→对象在内存中的地址(不稳定)→实际对象
    本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
    但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。
功能上的理解
    什么是&句柄&(handle),handle的本意是把柄,把手的意思。是你与操作系统打交道的东东。举个通俗的例子,比如你考上了大学,入学后,学校(操作系统)会给你一个学生证号。注意,这个号码是学校指定的,你无法自选。有了这个号码(学生证,假设一证多用)享受学校提供的服务:如你就可以去图书馆借书,去食堂吃饭,去教室上课等等。但你不能到食堂里买啤酒,因为学校不允许这种服务。
    而在计算机中系统提供的服务就是API调用,你有了HANDLE,就可以理直气壮地向系统提出调用API的服务。而指针的权力就大多了,有了指针你可以到处去喝酒,打架,学校(操作系统)管不着,所以句柄和指针的区别在于句柄指针调用系统提供的服务。而句柄虽然是一个能相互区别的号码,但与我们普通的ID号又有区别,普通的ID号是可以由程序员自己定义的,而句柄不行,它是对象生成是系统指定的,是为了区别系统中存在的各个对象,这个句柄不是由程序员符给的。
机制上的理解
    句柄是指针,一点不假,但是这个指针又与C中的指针有不同之处。因为Windows是一个多任务的系统,其内存是可以移动的,这样的话如果某一时刻有一个指针指向一块内存,之后的某个时刻却被系统移走了,如果你再用这个指针的话就会出错。
    为了解决这一问题,windows在系统专区开一块内存用于存放句柄,这个句柄的值就是一个地址,当这一块内存被移走后,windows就修改这个句柄的值,再访问这块内存时,句柄的值总是有效的。正因为这样当你使用GlobalAlloc分配的内存时,如果你指定这块内存的属性是固定的,那么它的返回值可以直接给一个指针,如果是可以移动的,返回值就必须给一个句柄,你就必须先GlobalLock后才能使用。这是我对句柄理解,不知道对不对?
    其实,句柄是一个指向指针的指针。即:在windows程序设计中,句柄仅是一个应用程序用来识别某些事情的数字。我们知 道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。
    我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。
    Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。
【上篇】【下篇】
您可能还会对这些文章感兴趣!
百度站内搜索
同分类最新文章加入时间: 月光软件站
Windows基本的数据类型
&&& 下面列出较为常用的数据类型,大体包括了字符型、整型、浮点型、布尔型、指针型以及Windows应用程程特有的句柄型,表示指针型的数据类型往往以P或LP作为前缀,而句柄型总是冠以H。
类型&&&&&&&&&&&&&&&&&&& 定义-------------------------------------------------------------ATOM&&&&&&&&&&&&&&&&&&& 原子(字符串在原子表中的参考值)BOOL&&&&&&&&&&&&&&&&&&& 布尔型(逻辑型)变量(应为TRUE或FALSE)BOOLEAN&&&&&&&&&&&&&&&& 布尔型(逻辑型)变量(应为TRUE或FALSE)BYTE&&&&&&&&&&&&&&&&&&& 字节(8位)CCHAR&&&&&&&&&&&&&&&&&& Windows字符CHAR&&&&&&&&&&&&&&&&&&& Windows字符COLORREF&&&&&&&&&&&&&&& RGB(红绿蓝)颜色值(32位)CONST&&&&&&&&&&&&&&&&&& 在执行时其值保持不变的变量DLGPROC&&&&&&&&&&&&&&&& 指向应用程序定义的对话框过程回调过程的指针DWORD&&&&&&&&&&&&&&&&&& 双字(32位)DWORDLONG&&&&&&&&&&&&&& 双双字(64位)FARPROC&&&&&&&&&&&&&&&& 指向应用程序定义的指针FLOAT&&&&&&&&&&&&&&&&&& 浮点型变量GLOBALHANDLE&&&&&&&&&&& 全局内存块句柄HACCEL&&&&&&&&&&&&&&&&& 加速键表句柄HANDLE&&&&&&&&&&&&&&&&& 对象句柄HBITMAP&&&&&&&&&&&&&&&& 位图句柄HBRUSH&&&&&&&&&&&&&&&&& 画刷句柄HDC&&&&&&&&&&&&&&&&&&&& 设备描述表句柄HFILE&&&&&&&&&&&&&&&&&& 文件句柄HFONT&&&&&&&&&&&&&&&&&& 字体句柄HGDIOBJ&&&&&&&&&&&&&&&& GDI(图形设备接口)对象句柄HGLOBAL&&&&&&&&&&&&&&&& 全局内存块句柄HHOOK&&&&&&&&&&&&&&&&&& 钩子句柄HICON&&&&&&&&&&&&&&&&&& 图标句柄HINSTANCE&&&&&&&&&&&&&& 实例句柄HLOCAL&&&&&&&&&&&&&&&&& 本地内存句柄HMENU&&&&&&&&&&&&&&&&&& 菜单句柄HOOKPROC&&&&&&&&&&&&&&& 指向应用程序定义的钩子的指针HPALETTE&&&&&&&&&&&&&&& 调色板句柄HPEN&&&&&&&&&&&&&&&&&&& 画笔句柄HWND&&&&&&&&&&&&&&&&&&& 窗口句柄LOCALHAND&&&&&&&&&&&&&& 本地内存句柄LONG&&&&&&&&&&&&&&&&&&& 32位无符号值LONGLONG&&&&&&&&&&&&&&& 64位无符号值LPARAM&&&&&&&&&&&&&&&&& 32位消息参数LPCSTR&&&&&&&&&&&&&&&&& 指向Windows常字符串(以空字符结束)的指针LPSTR&&&&&&&&&&&&&&&&&& 指向Windows字符串(以空字符结束)的指针LPVOID&&&&&&&&&&&&&&&&& 指向任意类型的指针PROC&&&&&&&&&&&&&&&&&&& 指向回调函数的指针SHORT&&&&&&&&&&&&&&&&&& 短整型数UCHAR&&&&&&&&&&&&&&&&&& 无符号Windows字符UINT&&&&&&&&&&&&&&&&&&& 无符号整数ULONG&&&&&&&&&&&&&&&&&& 无符号长整型数(32位)USHORT&&&&&&&&&&&&&&&&& 无符号知整型数(16位)VOID&&&&&&&&&&&&&&&&&&& 任意类型WNDPROC&&&&&&&&&&&&&&&& 指向在应用程序中定义的窗口过程的指针WORD&&&&&&&&&&&&&&&&&&& 无符号字(16位)WPARAM&&&&&&&&&&&&&&&&& 32位消息参数&
相关文章:相关软件:
┊┊┊┊┊┊┊┊┊┊┊
┊┊┊┊┊┊┊┊┊┊┊
┊┊┊┊┊┊┊┊┊┊┊为什么要使用句柄?_百度知道
为什么要使用句柄?
我有更好的答案
这些重要的对象肯定不是4个字节或者8个字节足以完全描述的,他们拥有大量的属性。为了保存这样一个&对象&的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,但这至少有两个缺点:所以,Windows操作系统就采用进一步的间接:在进程的地址空间中设一张表,表里头专门保存一些编号和由这个编号对应一个地址,而由那个地址去引用实际的对象,这个编号跟那个地址在数值上没有任何规律性的联系,纯粹是个映射而已。在Windows系统中,这个编号就叫做&句柄&。也就是说,如果不在乎浪费空间的话,在某些情况下可以不使用句柄,直接对文件进行操作。——————————————————————————————————————————————原文如下:《什么是句柄?为什么会有句柄?HANDLE》从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是&Handle&,本义就是&柄&,只是在计算机科学中,被特别地翻译成&句柄&,其实还是个&柄&。从一个小东西拎起一大堆东西,这难道不像是个&柄&吗?Windows系统中有许多内核对象(这里的对象不完全等价于&面向对象程序设计&一词中的&对象&,虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重要的对象肯定不是4个字节或者8个字节足以完全描述的,他们拥有大量的属性。为了保存这样一个&对象&的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,但这至少有两个缺点:所以,Windows操作系统就采用进一步的间接:在进程的地址空间中设一张表,表里头专门保存一些编号和由这个编号对应一个地址,而由那个地址去引用实际的对象,这个编号跟那个地址在数值上没有任何规律性的联系,纯粹是个映射而已。在Windows系统中,这个编号就叫做&句柄&。Handle在Windows中的含义很广泛,以下关于谈到的Handle除非特别说明,将仅限于进程、线程的上下文中。1、先来谈谈HandleHandle本身是一个32位的无符号整数,它用来代表一个内核对象。它并不指向实际的内核对象,用户模式下的程序永远不可能获得一个内核对象的实际地址(一般情况下)。那么Handle的意义何在?它实际上是作为一个索引在一个表中查找对应的内核对象的实际地址。那么这个表在哪里呢?每个进程都有这样的一个表,叫句柄表。该表的第一项就是进程自己的句柄,这也是为什么你调用GetCurrentProcess()总是返回0x7FFFFFFF原因。简单地说,Handle就是一种用来&间接&代表一个内核对象的整数值。你可以在程序中使用handle来代表你想要操作的内核对象。这里的内核对象包括:事件(Event)、线程、进程、Mutex等等。我们最常见的就是文件句柄(file handle)。另外要注意的是,Handle仅在其所属的进程中才有意义。将一个进程拥有的handle传给另一个进程没有任何意义,如果非要这么做,则需要使用DuplicateHandle(),在多个进程间传递Handle是另外一个话题了,与这里要讨论的无关。2、进程ID首先,进程ID是一个32位无符号整数,每个进程都有这样的一个ID,并且该ID在系统范围内是唯一的。系统使用该ID来唯一确定一个进程。深入些说,系统可能使用进程ID来计算代表该进程的内核对象的基地址(及EPROCESS结构的基地址),具体的计算公式你可以去问微软的OS开发人员。3、HINSTANCE
采纳率:62%
为您推荐:
其他类似问题
句柄的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 sqlite创建数据类型 的文章

 

随机推荐