找回密码
 加入
搜索
查看: 3577|回复: 7

句柄能应用到底的地方?大家知道的都贴出来分享

  [复制链接]
发表于 2009-12-21 16:14:27 | 显示全部楼层 |阅读模式
本帖最后由 binghc 于 2009-12-21 16:48 编辑

最近我在研究能后台操作的命令,我知道一些命令可以后台操作,比如controlsend、controlsettext这些都可以,但也很多有局限性,不能满足实际碰到的种种问题,比如在安装软件时,很多时候在点击下一步,或者“完成”按钮时,出现的下一个“即将要操作的新的窗口”,经常会几乎同时又弹出另外一个不想让他出现,或者说意外的新窗口,这些窗体经常夺走原来窗口的焦点,用winattive命令嘛,也不常常起作用,事总是因为各种各样的原因。很讨厌,当然可以sleep足够长时间再用winattive,但是我们用autoit追求的速度。所以我认为用句柄最安全,为什么大家都知道,不用多说,所以大家各抒己见,目前为止我知道句柄能用到的地方不多,winclose($a).($a代表句柄)。我用controlsend的时候,本也想用句柄代替,指定窗口的,controlsend($a,"controlid","string")却发现不行。还有controlsettext也是一样,不管这个句柄是窗口的句柄还是控件的句柄。
所以不管是高手还是低手,大家把知道的关于句柄的应用都贴出来分享,大家共同进步!!!
我去autoit帮助文档找了下,也没找到什么专门关于句柄方面的,目前我知道,winclose,winattive这两个可以用到wingethandle,不知道controlgethandle获取控件句柄的用处何在?而wingethandle命令能用到的也就知道winclose和winattive。
 楼主| 发表于 2009-12-28 23:54:50 | 显示全部楼层
回复 1# binghc


    怎么没人回 啊,难道说。。。。。句柄用处真的不大,开来是这样了
发表于 2009-12-29 13:20:53 | 显示全部楼层
本帖最后由 netegg 于 2009-12-29 13:57 编辑

回复 2# binghc

不是不大,是太大,不是学编程的,说不大清楚,最近看来,好像有指针的都可以转成句柄,其他的就不知道了,自己看看吧
又看了看,你是指其他程序的控件吗,那个就不好说了,没用过
发表于 2009-12-29 14:35:04 | 显示全部楼层
本帖最后由 pusofalse 于 2009-12-29 19:43 编辑

句柄用处太多了,分用户层句柄和内核层句柄。
窗口句柄、图标句柄、位图句柄,这类的属于用户层句柄。
进程句柄、文件句柄、互斥体句柄、SOCKET句柄、注册表键句柄,这类的是内核层句柄。

用户层的句柄就好像人的指纹,在整个系统中是唯一的,用于标识单独存在的一个窗口或其他用户对象,不可能会有两个相同的用户层句柄同时存在于系统中。用户层句柄简单来说,就是用来标识一个用户对象。AU3中的Win*函数和Control*函数用到的是用户层句柄。

内核层句柄用于标识一个内核对象,文件、进程、令牌都属于内核对象。例如你用TCPListen创建了一个Socket句柄,实际是创建了一个\Device\Tcp内核对象。句柄的值为0x120,那么再次调用TCPListen、_WinAPI_CreateFile、_WinAPI_OpenProcess获得的句柄绝对不能再是0x120,因为会混淆句柄所指的对象,除非在第二次调用TcpListen之前用TCPClose关闭句柄,关闭之后,此句柄会自动从自己的进程空间中抹去。
$hSocket = TCPListen("127.0.0.1", 7777) ;创建\Device\Tcp内核对象,返回socket句柄。
TCPClose($hSocket)
在用TCPClose($hSocket)关闭句柄之后,虽然$hSocket的值仍然是0x120,但它却是个废弃的句柄,实际所指的\Device\Tcp对象在用TCPClose关闭那一刻就已经从自身进程中消去了。关闭之后,如果再将$hSocket传递到TCPAccept进行后续操作,最终会返回错误号6,对应系统错误“句柄无效”。关闭之后,再次调用TCPListen,获取的句柄值可能又是0x120。

内核句柄,只确保在一个进程中唯一。当前进程中有某个句柄的值为0x120,在其他进程中可能也有值为0x120的句柄。这个用Process Explorer.exe可以很清楚地看到。

内核句柄的值在0x0000 - 0xFFFF之间,每个句柄之间的步进为4,即有效的句柄值为0x4/0x8/0xC/0x10/...,所以一个进程所能打开的句柄数量不能同时超过16383个。

内核句柄除了有标识内核对象的作用外,其中还记录着各种细节,例如打开对象时所使用的访问权限、内核对象的线性地址、共享标记等。例如用CreateFile打开了某个文件句柄,所使用的访问权限值为0x80000000,如果用返回的句柄对文件进行写入操作,最终会失败而返回错误5(拒绝访问),因为0x80000000所对应的权限只是读取(GENERIC_READ),进行写入操作,应确保权限值中有0x40000000(GENERIC_WRITE)。如果这个文件的访问控制列表没有为进程开启写入权限,CreateFile最终会失败。其他内核句柄同是,在打开一个内核对象时,都会指定一个权限值用于标记到底进行何种操作,如果此操作不被允许(与访问控制列表中定义的权限相违),最终会返回错误5,表示拒绝打开。
每个句柄都对应一个对象地址,此地址是线性地址而非物理地址,地址中记录着各种细节,例如一个socket句柄对应的线性地址中,会纪录此socket所打开的端口号和远程地址等信息。一个令牌句柄对应的线性地址中,会纪录此令牌的权限与进程标识等信息。

枚举系统中的所有句柄用NtQuerySystemInformation,NtQueryObject查看句柄所指的对象名称,关闭句柄用CloseHandle,复制句柄DuplicateHandle。

系统之所以能正常运行,有如此强大的功能,都是因为有这些各种各样的句柄,楼主竟然说句柄用处不大?

评分

参与人数 3金钱 +40 贡献 +20 收起 理由
C.L + 10
netegg + 10
afan + 20 + 20

查看全部评分

发表于 2009-12-29 14:41:06 | 显示全部楼层
句柄用处太多了,分用户层句柄和内核层句柄。
窗口句柄、图标句柄、位图句柄,这类的属于用户层句柄。
进 ...
pusofalse 发表于 2009-12-29 14:35
发表于 2009-12-29 22:23:59 | 显示全部楼层
通俗点说,句柄就是一条线,不管风筝飞向哪里,只要抓住这条线总会把他扯回来。
发表于 2010-1-5 19:36:17 | 显示全部楼层
controlsend 测试可以使用句柄...
发表于 2010-2-6 01:19:45 | 显示全部楼层
句柄用处太多了,分用户层句柄和内核层句柄。
窗口句柄、图标句柄、位图句柄,这类的属于用户层句柄。
进 ...
pusofalse 发表于 2009-12-29 14:35


讲的很透彻!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-29 15:27 , Processed in 0.904667 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表