如何获得标准输出的句柄

用VC++实现USB接口读写数据的程序

用VC++实现USB接口读写数据的程序

// 检索相关GUID的USB设备总设备个数

// 取得一个该GUID相关的设备信息集句柄

// 申请设备接口数据空间

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

    windows 之所以要设立句柄,根本上源于内存管理机制的问题—虚拟地址,简而言之数据的地址需要变动,变动以后就需要有人来记录管理变动,(就好像户籍管理一样),因此系统用句柄来记载数据地址的变更。

    数据对象加载进入内存中之后即获得了地址,但是这个地址并不是固定的,(至于为什么以及什么情况下变动具体需要大家研究虚拟地址的原理与机制我这里只提我确定知道的例子)数据对象会根据需要在内存与硬盘之间游弋移动(例如不常用的数据会为常用数据让出其占用的内存空间进而被淘汰进硬盘中的虚拟内存之中以优化配置整体系统的资源进而提升效率性能),因此其物理地址总是变动的,那么作为管理者 则必须对 管理对象所发生的变化了如指掌才行,因此系统为进程分配固定的地址(句柄)来存储进程下的数据对象变化后的地址也就是当前的地址,其实设计机制很简单 :系统的某个部门移动了对象的地址后,同时上报给句柄所属部门管理者,管理者将改动写入句柄即可。该数据被重新起用时去其所属句柄内按内容存取即可。

    在程序设计中,句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。

    句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。

    在上世纪80年代的操作系统(如Mac OS 和Windows)的内存管理中,句柄被广泛应用。Unix系统的文件描述符基本上也属于句柄。和其它桌面环境一样,WindowsAPI大量使用句柄来标识系统中的对象,并建立操作系统与用户空间之间的通信渠道。例如,桌面上的一个窗体由一个HWND类型的句柄来标识。如今,内存容量的增大和虚拟内存算法使得更简单的指针愈加受到青睐,而指向另一指针的那类句柄受到冷淡。尽管如此,许多操作系统仍然把指向私有对象的指针以及进程传递给客户端的内部数组下标称为句柄。

  • 首先什么是句柄?(理解了句柄,也就知道了句柄和指针的区别了)所谓句柄实际上是一个...WINDOWS句柄有点象C语言中的文件句柄。从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象...

    首先什么是句柄?(理解了句柄,也就知道了句柄和指针的区别了)

    所谓句柄实际上是一个数据,是一个Long (整长型)的数据。

    句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

    从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。

    如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?

    为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。

    句柄地址(稳定)→记载着对象在内存中的地址────→对象在内存中的地址(不稳定)→实际对象

    本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。

    但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

    句柄是一些表的索引也就是指向指针的指针,句柄和指针都是地址,句柄是Windows编程的一个关键性的概念,编写Windows应用程序总是要和各种句柄打交道。

    所谓句柄,就是一个唯一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷、电话线路等。在Win32里,句柄是指向一个“无类型对象”(void*)的指针,也就是一个4字节长的数据。无论它的本质是什么,句柄并不是一个真正意义上的指针。

    从构造上看,句柄是一个指针,尽管它没有指向用于存储某个对象的内存位置。事实上,句柄指向一个包含了对该对象进行的引用的位置。

    由于Windows是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。这些运行的程序称为一个实例。

    为了对同一程序的多个副本进行管理,Windows引入了实例句柄。Windows为每个应用程序建立一张表,实例句柄就好象是这张表的一个索引。

    1,句柄所指的可以是一个很复杂的结构,并且很有可以是与系统有关的,比如说上面所说的线程的句柄,它指向的就是一个类或者结构,他和系统有很密切的关系,当一个线程由于不可预料的原因,而终止时在系统就可以回它所占用的资源,如CPU,内存等等,反过来想可以知道,这个句柄中的某一些项,是与系统进行交互的。由于Windows系统,是一个多任务的系统,它随时都可能要分配内存,回收内存,重组内存。

    2,指针它也可以指向一个复杂的结构,但是通常是用户定义的,所以的必需的工作都要用户完成,特别是在删除的时候。

    在Windows操作系统下用C语言编写控制台的窗口界面首先要获取当前标准输入和标准输出设备的句柄。通过调用函数GetStdHandle可以获取当前标准输入以及输出设备的句柄。函数原型为:

    需要说明的是,“句柄”是Windows最常用的一个概念。它通常用来标识Windows资源(如菜单、 图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为Windows系统内部表的索引值来使用 的。调用相关文本界面控制的API函数。这些函数可分为三类。一是用于控制台窗口操作的函数(包括窗口的缓冲区大小、窗口前景字符和背景颜色、窗口标题、大小和位置等);二是用于控制台输入输出的函数(包括字符属性操作函数);其他的函数并为最后一类。通过调用CloseHandle函数来关闭输入输出句柄。

    _getch(); //输入一个字符,不会显示到屏幕上

    向整个缓冲区填充字符'A'

    其中填充的开始处为pos,坐标为{0, 0},也就是屏幕最左上角的字符处

    因此可以达到向整个缓冲区填充字符'A'的效果

    //控制台窗口信息结构体

    还需要说明的是,虽然在C++中,iostream.h定义了cin和cout的标准输入和输出流对象。但它们只能实现基本的输入输出 操作,对于控制台窗口界面的控制却无能为力,而且不能与stdio.h和conio.h友好相处,因为iostream.h和它们是C++两套不同的输入 输出操作方式,使用时要特别注意。

    另外,本系列文章的示例程序主要在Code::Blocks上运行,在VS2010下根据是否宏定义了UNICODE,各种函数会有不同的情况,出现差异,大家可在多种IDE上尝试,已达到理想效果。

  • 句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息、处理程序):

    0。获取所在类窗口的句柄:

    无论在主窗口类内,还是子窗口类内,获取主窗口句柄的方法:

    2。子窗口句柄:用FindWindow,(只要知道子窗口的名字即可)如:

    寻找当前窗口是否在运行windowname的程序,该名字为窗口名字,如:

    函数功能:获取某个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用

    通过下面的例子来看其理由:

    程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码:

    就不会出现问题,因为尽管当pwnd是NULL时,GetSafeHwnd仍然可以用,只是返回NULL

    源文档 3。获取窗口中 控件的句柄,用 GetDlgItem

    内的函数,因此要先获取控件所在窗口的指针,如:

  • 简单、直观棗自己想出来的,颇得意 首先准备一个时钟,一种存类名方法(我用TMemo) 在定时器处理函数中: 1、得到当前cursor的点位置 2、再用WindowFromPoint, 3、然后得到类名,放到TMemo里 这样可以用鼠标获得你...

  • 从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句柄",其实还是个"柄"。从一个小东西拎起一大堆东西,这难道不像是个"柄...

  • —-想了解VC++编程获取窗口句柄的方法小结分享的全部内容且更多的C语言教程关注VC++编程获取窗口句柄的方法小结分享实例讲述了VC++编程获取窗口句柄的方法。分享给大家供大家参考,具体如下:在VC++编程中常需获取...

  • 我觉得自己对于指针理解比较透彻了,但关于句柄的理解,就容易犯理解成指针的错误.  一般说:句柄是资源(或项目)的唯一标识.  俺觉得这其实说得很不明白的,现在我想问的是句柄到底是怎么标识资源的:  1,句柄在32...

  • 1、 句柄是一种指向指针的指针。我们知 道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 访问...

  • 1、在matlab中,每一个对象都...3、句柄与指针的区别在于:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。而句柄不行,它是对象生成时系统指定的,是为了区别系统中存在的各个对象。 4、从数...

  • 用户通过某个函数打开文件以获得句柄,此后用户操纵文件皆通过该句柄进行。 设计这么一个句柄的原因在于句柄可以防止用户随意读写系统内核的文件对象。无论是Linux还是Windows,文件句柄总是和内核的文件对象相...

  • 文章目录文件指针重定向文本...重定向通常我们强制程序从文件读入而不是从键盘获得输入,方法是在命令行中放上文件的名字,并在前面加上字符demo:demo:>out.dat //输出重定向demo: < in.dat > out.dat文...

  • C语言中,SetConsoleTextAttribute(参数1,参数2)是设置控制台窗口字体颜色和背景颜色的函数。 参数1:句柄 参数2:颜色 颜色的参数 数值 颜色 0 黑色 1 深蓝色 2 深绿色 3 深蓝绿色 4 深红色 5 ...

  • 由Developer Studio添加的DISCARDABLE关键词指出,必要时Windows可以从内存中丢弃图标,以获得额外的空间。之后不需要程序任何特定的操作,Windows就能够重新加载图示。DISCARDABLE属性是内定的,不需要指定。只有在...

  • 句柄”这个词是从“handle”翻译的,这个词在编程里应该作为名词而不是动词,英文里handle作为名词意思是“xxx的柄 / xxx的把手”,在编程里,句柄常用于资源管理,资源的柄/资源的把手,可以理解成握住了把柄/...

  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼OpenProcess打开进程句柄失败返回奇怪的东西而且别人的代码可以用 复制到我这里就不能用了这是什么情况。。。#include#include#include#includeint main(){...

  • 句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由...

  • 句柄句柄概念在WINDOWS编程中是一个很重要的概念,在许多地方都扮演着重要的角色。但由此而产生的句柄概念也大同小异,比如:>(MicrosoftPress,byRichardWilton)一书中句柄的概念是:在Windows环境中,句柄是用来...

  • 本文主要向大家介绍了 C/C++知识点之c++ 屏幕截图指定窗口句柄后台截图返回位图句柄,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。/根据窗口句柄后台截图保存成BMP位图文件并且显示到picture控件...

  • 句柄无效在WINDOWS编程中是一个很重要的概念,在许多地方都扮演着重要的角色。但由此而产生的句柄概念也大同小异,比如:>(Microsoft Press,by Richard Wilton)一书中句柄的概念是:在Windows环境中,句柄是用来...

  • 在linux操作系统中,文件句柄(包括Socket句柄)、打开文件、文件指针、文件描述符的概念比较绕,而且windows的文件句柄又与此有何关联和区别?这一系列的问题是我们不得不面对的。 博主通过翻...

我要回帖

更多关于 获得句柄异常 的文章

 

随机推荐