Windows对象是以句柄来标识的,对应的MFC类就是这些句柄的C++包装。内存中的Windows对象一定有唯一的句柄来标识,但不一定有对应的MFC类对象在内存中。当需要获取Windows对象的对应MFC类对象而内存中又没有此对象时,系统会创建一个临时MFC类对象返回给用户,并在之后某个空闲时刻进行回收。

 
  Windows对象句柄及其对应的MFC类如下表所示:

HWND

CWnd及派生类

HDC

CDC及派生类

HMENU

CMenu

HPEN、HBRUSH、HFONT、HBITMAP、HPALETTE、HRGN

CGdiObject

HIMAGELIST

CImageList

SOCKET

CSocket

  如果你拥有上面的任何一个Windows对象句柄,你可以调用对应类的静态成员函数FromHandle来查找对应的MFC对象(系统为每个线程维护了一个从Windows对象句柄到MFC对象的映射,一个持久的map和一个临时的map);如果你拥有上面的MFC对象,你也可以通过MFC类的公有成员变量来获取对应的Windows对象句柄。

 
  例如,给定一个HWND类型的句柄hWnd,可以通过

CWnd::FromHandle(hWnd);

来获得CWnd对象的指针。如果hWnd没有对应的CWnd对象,则系统会产生一个临时CWnd对象与hWnd关联,并返回该对象的指针。在获得CWnd对象后,你可以通过CWnd的公有成员m_hWnd获得窗口对象的句柄。

 
  如果在调用FromHandle时产生临时MFC对象,句柄和MFC对象之间的映射被保存在系统的临时map中。默认情况下,CWinThread::OnIdle自动为那些支持临时句柄映射的MFC类调用DeleteTempMap函数。在DeleteTempMap函数中,这些临时对象将被取消与句柄的关联,然后被销毁。
 
  如果你拥有一个Windows对象句柄,那么你可以创建一个对应的MFC对象,然后把该MFC对象与该Windows对象句柄进行关联。此时,该MFC对象与Windows对象相互建立起映射关系。
 
  例如,对于如下代码:

CWnd  myWnd;

myWnd.Attach(hWnd);

将建立起hWnd到myWnd的映射。此后,你调用CWnd::FromHandle(hWnd)将返回myWnd对象的指针。如果myWnd对象被销毁,它的析构函数将自动通过调用DestroyWindow来销毁该hWnd所指Windows对象。如果该行为不是所期望的,则需要在myWnd销毁之前调用Detach成员函数解除两者之间的关联(映射),如 myWnd.Detach()。
 
  所有临时MFC对象和持久(permanent)MFC对象都是以线程为单位进行维护管理的。也就是说,一个线程不能够访问另一个线程的MFC包装类对象,不管它是临时的还是持久的。
 
  为了在不同的线程间传递这些Windows对象,总是应该通过HANDLE类型传递。从一个线程向另一个线程传递MFC包装对象将可能引起不可预料的结果。
 
  由于MFC包装类对象是以线程为单位进行管理的,因此,在程序中的不同线程中可能有多个MFC对象与同一个句柄对应。
 
  存在的疑问:如果同一线程中有多个MFC对象Attach同一句柄,那么对该句柄调用FromHandle将返回哪个MFC对象呢?未定义行为?

句柄与MFC对象关系和相互获取的更多相关文章

  1. Windows对象、句柄与MFC对象

    windowsmfc编程c 目录(?)[-] Windows对象句柄与MFC对象 windows对象 句柄 mfc对象 杂谈 Windows对象.句柄与MFC对象 (2009-04-28 22:11: ...

  2. MFC中获取各个窗口之间的句柄或者指针对象的方法

    MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决.    HWND hWnd=::FindWindow(NULL,_T("S ...

  3. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. MFC框架各部分指针获取方式

    MFC框架各部分指针获取方式 前人在CSDN总结的,曾经帮助过我,整理总结一下,希望也能帮助一下别人. 获得CWinApp 获得CMainFrame 获得CChildFrame 获得CDocument ...

  5. 死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

    写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>博文中, ...

  6. 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro

    LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...

  7. Hibernate(开放源代码的对象关系映射框架)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...

  8. LLBL Gen Pro 4.2 Lite 免费的对象关系映射开发框架与工具

    LLBL Gen Pro是一款优秀的对象关系映射开发框架,自2003年发布以来,一直有广泛的客户群.LLBL Gen Pro有几个标志性的版本,2.5/2.6是一个很稳定的版本,公司的一些旧的项目仍然 ...

  9. Hibernate入门5持久化对象关系和批量处理技术

    Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...

随机推荐

  1. linux系统下实时监控进程以及定位杀死挂起的进程

    一.实时监测进程 [root@instance-3lm099to ~]# top top - :: up days, min, users, load average: 0.01, 0.05, 0.0 ...

  2. [LeetCode]Palindrome Number 推断二进制和十进制是否为回文

    class Solution { public: bool isPalindrome2(int x) {//二进制 int num=1,len=1,t=x>>1; while(t){ nu ...

  3. Python基础之函数与装饰器

    阅读目录 一.为什么要使用函数 二.函数的定义与调用 三.函数返回值 四.函数的参数 五.本章小结 六.装饰器 一.函数流程图: 函数名的命名规则: 1.函数名必须由字母下划线数字组成,不能是关键字和 ...

  4. 清华EMBA课程系列思考之三 -- 中国经济与金融

    清华EMBA的第三次课,大家都已经渐渐了解了课程系列的基本节奏,也逐步适应了思考的基本思路,本次课程涉及到的全部内容都非常专业.闲话少述,直入主题了. 李稻葵教授部分: -- 清华大学经济管理学院弗里 ...

  5. unity开发android游戏(一)搭建Unity安卓开发环境

    unity开发android游戏(一)搭建Unity安卓开发环境 分类: Unity2014-03-23 16:14 5626人阅读 评论(2) 收藏 举报 unity开发androidunity安卓 ...

  6. 安卓手机的后门控制工具SPADE

    SPADE,一款安卓手机的后门控制工具,安全研究人员可以以此了解和研究安卓后门原理. 首先,我们从网站www.apk4fun.com下载apk文件,如ccleaner.然后,我们安装spade git ...

  7. "fcitx按ctrl+space没反应"解决方法

    如果是KDM.GDM.LightDM,打开~/.xprofile.如果是startx.Slim,打开~/.xinitrc.(没有就新建一个) export GTK_IM_MODULE=fcitxexp ...

  8. (1) yum源配置-epel

    1.获取epel地址 登录https://fedoraproject.org/wiki/EPEL/zh-cn,看“如何获取EPEL的软件包”,根据你的操作系统版本,复制对应的下载地址. 2.下载epe ...

  9. Gradle 的配置和引用

    我们的Android studio工程有时会存在很多共同的构建包 这里我会新建一个gradle 文件 config.gradle ext{ android = [ applicationId : &q ...

  10. SPSS统计功能与模块对照表

    SPSS统计功能 - 应用速查表第一列为统计方法,中间为统计功能,最后一列为所在模块 1 ANOVA Models(单因素方差分析:简单因子) : 摘要 描述 方差 轮廓 - SPSS Base 2 ...