精华内容
下载资源
问答
  • C++句柄

    2021-01-29 11:02:00
    C++句柄 出处:http://www.cppblog.com/mymsdn/archive/2009/02/19/handle-in-windows.html 概述 从广义上来说,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是“Handle”,本义就是“柄”,只是...

    C++句柄

    出处:http://www.cppblog.com/mymsdn/archive/2009/02/19/handle-in-windows.html

    概述

    从广义上来说,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是“Handle”,本义就是“柄”,只是在计算机科学中,被特别地翻译成“句柄”,其实还是个“柄”。

    指针其实也是一种“句柄”,只是由于指针同时拥有更特殊的含义–实实在在地对应内存里的一个地址–所以,通常不把指针说成“句柄”,但指针也有着能从一个32位的值引出一大堆数据的作用,有着与“句柄”相同的功能。

    Windows系统中有许多内核对象(这里的对象不完全等价于“面向对象程序设计”一词中的“对象”,虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口等。这些重要的对象肯定不是4个字节或8个字节足以完全描述的,它们拥有大量的属性。为了保存这样一个“对象”的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝显然会浪费效率。如果传递这些对象的首地址,则存在以下两个缺点:

    1)暴露了内核对象本身,使得程序(而不是操作系统内核)也可以任意地修改对象的内部状态,这显然是操作系统内核所不能允许的;

    2)操作系统有定期整理内存的责任,如果一些内存整理过一次,对象被搬走,会出现错误。

    所以,Windows操作系统就采用进一步的间接:在进程的地址空间中设一张表,表里专门保存一些编号和由这个编号对应一个地址,而由那个地址去引用实际的对象,这个编号跟那个地址在数值上没有任何规律性的联系,纯粹是个映射而已。在Windows系统中,这个编号叫做“句柄”。

    Handle在Windows中的含有很广泛,以下关于谈到的Handle除非特别说明,将仅限于进程、线程的上下文中。

    1. Handle

    Handle本身是个32位无符号整数,它用来代表一个内核对象。它并不指向实际的内核对象,用户模式下的程序永远不可能获得一个内核对象的实际地址(一般情况下)。那么Handle的意义何在?它实际上是作为一个索引在一个表中查找对应的内核对象的实际地址。那么这个表在哪呢?每个进程都有这样的一个表,叫句柄表。该表的第一项就是进程自己的句柄,这也是为什么你调用GetCurrentProcess()总是返回0×7FFFFFFF的原因。

    简单地说,Handle就是一个用来“间接”代表一个内核对象的整数值。你可以在程序中使用handle来代表你想要操作的内核对象。这里的内核对象包括:事件(Event)、线程、进程、Mutex等。我们最常见的就是文件句柄(file handle)。

    另外要注意的是,Handle仅在其所属的进程中才有意义。将一个进程拥有的handle传给另一个进程没有任何意义,如果非要这么做,则需要使用DuplicateHandle()。

    2.进程ID

    首先,进程ID是一个32位无符号整数,每个进程都有这样的一个ID,并且该ID在系统范围内是唯一的。系统使用该ID来唯一确定一个进程。

    深入些说,系统可能使用进程ID来计算该进程的内核对象的基地址(及EPROCESS结构的基地址)。

    3.HINSTANCE

    HINSTANCE也是一个32位无符号整数,它表示程序加载到内存中的基地址。

    展开全文
  • c++句柄

    2013-12-04 09:51:34
    c++中的句柄概念(转载) 能上的理解: 什么是"句柄"(),handle的本意是把柄,把手的意思。是你与操作系统打交道的东东。 举个通俗的例子,比如你考上了大学,入学后,学校(操作系统)会给你一个学生证号...

    c++中的句柄概念(转载)


    能上的理解:
    什么是"句柄"(),handle的本意是把柄,把手的意思。是你与操作系统打交道的东东。
    举个通俗的例子,比如你考上了大学,入学后,学校(操作系统)会给你一个学生证号
    注意,这个号码是学校指定的,你无法自选。
    有了这个号码(学生证,假设一证多用)享受学校提供的服务:
    如你就可以去图书馆借书,去食堂吃饭,去教室上课等等。

    但你不能到食堂里买啤酒,因为学校不允许这种服务。
    而在计算机中系统提供的服务就是API调用,你有了HANDLE,就可以理直气壮地向系统提出调用API的服务。
    而指针的权力就大多了,有了指针你可以到处去喝酒,打架,学校(操作系统)管不着,
    所以句柄和指针的区别在于句柄指针调用系统提供的服务。
    而句柄虽然是一个能相互区别的号码,但与我们普通的ID号又有区别,
    普通的ID号是可以由程序员自己定义的,而句柄不行,它是对象生成是系统指定的,
    是为了区别系统中存在的各个对象,这个句柄不是由程序员符给的。

    概念上的理解
    1。句柄,是整个windows编程的基础,一个句柄是指使用的一个唯一的整数值,
    是指一个四字节长的数值,用于标志应用程序中的不同对象和同类对象中的不同的实例,
    诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。
    应用程序能够通过句柄访问相应的对象的信息。
    2。句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。
    如果句柄不用在I/O文件中,它是毫无用处的。
    3。句柄是windows用来标志应用程序中建立的或是使用的唯一整数,
    windows使用了大量的句柄来来标志很多对象。

    机制上的理解
    前面的分析很经典,但我认为有一点必须指出的。如果不对,请各位指证。
    句柄是指针,一点不假,但是这个指针又与C中的指针有不同之处。
    因为Windows是一个多任务的系统,其内存是可以移动的,
    这样的话如果某一时刻有一个指针指向一块内存,之后的某个时刻却被系统移走了,
    如果你再用这个指针的话就会出错。
    为了解决这一问题,windows在系统专区开一块内存用于存放句柄,这个句柄的值就是一个地址,
    当这一块内存被移走后,windows就修改这个句柄的值,再访问这块内存时,句柄的值总是有效的。
    正因为这样当你使用GlobalAlloc分配的内存时,如果你指定这块内存的属性是固定的,
    那么它的返回值可以直接给一个指针,如果是可以移动的,
    返回值就必须给一个句柄,你就必须先GlobalLock后才能使用。
    这是我对句柄理解,不知道对不对?

    我的理解
    其实,句柄是一个指向指针的指针。即:
    在windows程序设计中,句柄仅是一个应用程序用来识别某些事情的数字

    如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。
    我们知 道,所谓指针是一种内存地址。
    应用程序启动后,组成这个程序的各对象是住留在内的 。
    如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。
    但是,如果您真的这样认为,那么您就大错特错了。
    我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,
    Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。
    对象被移动意味着它的地址变化 了。如果地址总是如此变化,我们该到哪里去找该对象呢?
    为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,
    用来专门 登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。
    Wi ndows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。
    这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。
    这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统 。

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

    bool与BOOL的区别联系?
    bool是C++中的一种变量类型(布尔类型),只可以写
    bool   x;
    x   = true;
    x   = false;
    在VC++中BOOL是这样说明的:
    typedef int   BOOL;
    也就是说BOOL是当int用的。
    BOOL   x;
    x   = 1;
    x   = 0;
    当然为了方便,VC++已经定义了
    #define    TRUE   0
    #define    FALSE 1
    展开全文
  • C++ 句柄

    2013-09-27 16:44:04
    http://kingphp.blog.163.com/blog/static/2004232442012849439484/ 类似指针的的指针

    http://kingphp.blog.163.com/blog/static/2004232442012849439484/

    类似指针的的指针

    展开全文
  • 详解C++句柄

    2020-08-27 08:53:14
    本篇文章给大家详细分析了C++句柄类的相关知识点,对此有需要的朋友跟着学习参考下吧。
  • C++句柄

    2015-09-01 16:57:01
    假设有一个父类base,然后从base继承了多个子类base1,base2等等,C++句柄类主要是用来管理多个子类,统一个的接口,不同的操作. 句柄类需要智能指针的基础知识和多态的知识,句柄类其实就是智能指针+多态知识....

    假设有一个父类base,然后从base继承了多个子类base1,base2等等,C++句柄类主要是用来管理多个子类,统一个的接口,不同的操作.

    句柄类需要智能指针的基础知识和多态的知识,句柄类其实就是智能指针+多态知识.如果,对智能指针不是很了解,可以查看我上篇博客.

    直接看代码如下:

    #include <iostream>
    #include <string>
    class animal
    {
    public:
    	virtual animal* clone() const=0;
    	virtual void eat() const = 0;
    	virtual void haul() const = 0;
    };
    
    class cat:public animal
    {
    public:
    	cat(std::string n):name(n){
    		std::cout<<"create cat:"<<name<<std::endl;
    	}
    	~cat(){}
    	virtual animal* clone() const
    	{
    		return new cat(*this);
    	}
    	virtual void eat() const
    	{
    		std::cout<<name<<" \teat"<<std::endl;
    	}
    	virtual void haul() const
    	{
    		std::cout<<name <<" \thaul"<<std::endl;
    	}
    private:
    	std::string name;
    };
    
    class dog:public animal
    {
    public:
    	dog(std::string n):name(n){
    		std::cout<<"create dog:"<<name<<std::endl;
    	}
    	~dog(){}
    	virtual animal* clone() const
    	{
    		return new dog(*this);
    	}
    	virtual void eat() const
    	{
    		std::cout<<name<<" \teat"<<std::endl;
    	}
    	virtual void haul() const
    	{
    		std::cout<<name <<" \thaul"<<std::endl;
    	}
    private:
    	std::string name;
    };
    
    class handle
    {
    public:
    	handle():an(NULL),use(new std::size_t(1)){}
    	handle(const animal&);
    	handle(const handle& h):an(h.an),use(h.use){++*use;}
    	handle& operator=(const handle&);
    	~handle(){decr_use();}
    	const animal* operator->()const {
    		if(an) 
    			return an;
    		else
    			return (animal*)-1;}
    	const animal* operator*() const {
    		if(an) 
    			return an;
    		else
    			return (animal*)-1;
    	}
    private:
    	animal *an;
    	std::size_t *use;
    	void decr_use()
    	{
    		if (--*use==0) {
    			//std::cout<<"use is = "<<*use<<std::endl;
    			delete an;
    			delete use;
    		}
    	}
    };
    
    handle::handle(const animal &an):an(an.clone()),use(new std::size_t(1)){    }
    
    handle& handle::operator=(const handle& h)
    {
    	++*h.use;
    	decr_use();
    	an=h.an;
    	use=h.use;
    	return *this;
    }


    以下是测试函数,

    <span style="font-size:18px;">#include "smart_ptr.h"
    #include <iostream>
    
    int main(void)
    {
    	cat c("tom");
    	dog d("jim");
    	handle h(c);
    	h->eat();//通过重载->操作符实现
    	(*h)->haul();//通过重载*操作符实现
    
    	handle h1(d);
    	h1->eat();
    	(*h1)->haul();
    	// handle *h2=new handle(h);
    	// delete h2;
    	return 0;
    }</span>
    
    输出结果为:


    可以看到通过传给句柄类不同的子类,同样的接口却调用不同的子类的函数,实现了多态.我注释掉的那两行,主要时用来验证智能指针的,因为有指针成员,必须使用智能指针,保证指针安全.


    展开全文
  • C++句柄解析

    2015-12-20 12:02:00
    C++句柄类解析  引题:在C++中,对于运行时类型识别问题。在程序中使用引用或者指针在运行时动态识别对象类型。然而使用指针或者引用却增加了用户负担(在继承体系中,没有明确的基类到派生类的转换,必须用户显示...
  • C++句柄类详解

    2018-02-01 15:22:29
    C++句柄类详解  昨天由于时间的关系剩下一个小尾巴,今天忙里偷闲来把这个洞洞填上。昨天学习了“面向对象编程”的部分,详细讨论了复制控制与类作用域需要注意的问题。这里有一个新的问题,如何实现一个类似...
  • [转载]C++句柄

    2019-10-09 01:27:21
    原文地址:C++句柄类作者:DREAMER_D 句柄类,也就是handle class,是C++中的一种重要的面向对象方法,其作用有两条:1. 减少头文件的编译依赖关系,让文件间的编译更加独立;2. 增加系统安全性,把类的实现细节和...
  • C++句柄代码实现(1)

    千次阅读 2017-03-18 13:03:49
    欢迎转载请注明出处:海漩涡 ...C++句柄代码实现(1) C++句柄 作用:解决代理类中,创建代理时复制所有代理对象的问题 #include using namespace std; class Point{ public: Point():xval(0){}
  • c++句柄,智能指针 指针间的区别,初学者可以下来了解了解
  • C++句柄的理解

    千次阅读 2014-01-16 16:17:21
    通俗的讲,c++句柄就像一个“复合指针”:它不但“指向”某个对象,还“记录”所指对象由于复制/赋值而被其他句柄拥有的次数。当没有句柄与次对象 关联的时候,他还负责删除该对象。 泛型句柄类: template class ...
  • C++ 句柄

    2019-08-14 18:53:44
    一、容器与继承 在容器中保存有继承关系的对象时,如果定义成保存基类对象,则派生类将被切割,如果定义成保存派生类对象,...C++中一个通用的技术是包装类(cover)或句柄类(handle)。用句柄类存储和管理类指针。 ...
  • c++ 句柄和指针的区别

    2014-12-21 12:16:58
    c++ 句柄和指针的区别 句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。 Windows并不希望一般程序修改其内部数据结构,因为这样...
  • c++句柄泄漏

    2020-04-15 15:51:24
    待续
  • c++句柄泄漏问题定位      在Windows内核中定义了一组操作系统特有的对象类型,包括文件对象,线程对象,Event对象等等。要使用某种对象类型,必须首先生成这种对象类型的一个实例,以...
  • c++句柄设计

    2016-04-22 19:53:00
    最近读的是c++沉思录,开篇就用了3章来讲述句柄。好了,废话少说,接下来谈谈我学到的内容。  首先,我们知道c语言有指针,高手因为指针而灵活,菜鸟因为指针而危险。c++选择c作为底层语言,并兼容它,必然有指针...
  • c++句柄含义

    2013-12-16 19:50:37
    所谓句柄实际上是一个数据,是一个Long (整长型)的数据。 句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,005
精华内容 1,202
关键字:

c++句柄

c++ 订阅