原文地址:http://hi.baidu.com/hacknothack/blog/item/554c3c333ba0c1ff1b4cff7c.html

首先,要明白Windows对象和MFC对象的区别。MFC对象实际上并没有把整个Windows对象都包装在其中,它只是有一个窗口句柄而已,这个窗口句柄如果指向一个实际存在的窗口对象(窗口对象,也就是WNDCLASS,是一个Windows对象),那么这个MFC对象就是有效的,否则这个MFC对象是空的。如果你还不明白,请回忆一下,当我们使用MFC创建一个窗口时,是分两步进行的,第一步,new一个CWnd对象,这一步是创建MFC对象,但是其中的HWND还是非法的,因为对应的Windows对象还没有被创建出来;第二步,调用CWnd的成员函数Create创建真正的Windows对象,同时,把先前创建的MFC的CWnd对象的HWND成员指向该窗口,这样才算创建完毕一个窗口。而如果你是用SDK方式,那么只要创建一个WNDCLASS结构,然后调用Create或者CreateEx就创建了一个窗口。
好,现在回答你的问题,你可以假设,现在你已经有了一个有效窗口句柄,那么你想把这个窗口和一个CWnd对象关联起来怎么办?很简单,用Attach,其实就是让一个CWnd对象的HWND成员指向这个窗口句柄。这就是Attach主要完成的任务。
第二个,关于Detach。如前所述,WNDCLASS其实和CWnd根本没有什么关系。它们之间只是通过CWnd的成员HWND联系起来的。如果把Attach看做“联姻”的话,那么Detach就是“离婚”了,通俗地说,就是切断一个CWnd对象和一个有效窗口的脐带。为什么要切断呢?因为CWnd是C++的对象,C++的对象有一个生存期的概念,脱离了该对象的作用域,这个对象就要被销毁,但是Windows对象没有这个特点,当销毁CWnd对象的时候,我们不一定希望WNDCLASS一起被销毁,那么在此之前,我们就先要把这个“脐带”剪断,以免“城门失火,殃及池鱼”。

eg:

CWnd* pWnd = new CWnd;
pWnd->Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE,
       CRect(0, 0, 20, 20), this, 1234);

原文地址:http://www.winu.cn/ask/question.php?qid=17036

CWnd,CDC, Cxxx等都是MFC的类,这些类提供了很多成员函数来执行系统调用等操作,但是核心的类成员数据都是 句柄,(包括窗口句柄,DC句柄,线程句柄等)。 m_hWnd m_hDC m_hThread 如果这些类对象的这些句柄为空,就表示无效对象。比如你 CWnd * pWnd = new CWnd,执行是合法的,但是没有Create就没有窗口句柄,基本上就是一个无效对象,只是系统内存申请了内存分配空间而已,很多操作都无法执行(debug模式下会出现断言错误窗口)。但是,假如你申请了一个CWnd,CDC的对象实体,可以使用Attach来指定一个有效的句柄付给这个对象。那么此对象就是Valid的了。你可能跟踪看看Attach的实现,其实就是给m_hxxx赋值,而Detach就是值复位。这2个操作没有申请内存释放内存操作,就是一个赋值而已,是不是成对使用看你代码的实际情况吧。只要理解了这2函数的意义就行了 其实CWnd,CDC等类就是多了一个包装,方便用户(程序开发者)使用,如果用SDK开发,完全可以实现一样的功能。 句柄是操作系统内核对象,而窗口指针、DC指针是用户对象(由你的程序管理)。

Attach and Detach in VC相关推荐

  1. Attach、Detach和DeleteObject

    原文:Attach.Detach和DeleteObject ,想飞的梦想 1.CWnd Attatch和Detach的关系 首先,要明白Windows对象和MFC对象的区别. MFC对象实际上并没有把 ...

  2. [转] Attach、Detach和DeleteObject

    原文:Attach.Detach和DeleteObject ,想飞的梦想 1.CWnd Attatch和Detach的关系 首先,要明白Windows对象和MFC对象的区别. MFC对象实际上并没有把 ...

  3. attach()与detach()的使用

    attach()与detach()需要配对使用,如果使用了attach而未使用detach,再次使用attach时,会有"对象被屏蔽"的问题,如下: 转载于:https://www ...

  4. docker container的attach和detach模式

    docker container 容器运行的attach和detach模式 attach模式 docker run nginx 类似运行于前台的进程,会占据本地的STDIN和STDOUT detach ...

  5. VC中的Attach和Detach

    CWnd,CDC, Cxxx等都是MFC的类,这些类提供了很多成员函数来执行系统调用等操作,但是核心的类成员数据都是 句柄, (包括窗口句柄,DC句柄,线程句柄等).  m_hWnd  m_hDC  ...

  6. Attach()和Detach()函数

    一.Windows对象和MFC对象的区别? MFC对象实际上并没有把整个Windows对象都包装在其中. 对于窗口:MFC对象它只是有一个窗口句柄而已,这个窗口句柄如果指向一个实际存在的窗口对象(窗口 ...

  7. My Lead route attach and detach issue

    Created by Wang, Jerry on Jun 01, 2015 鼠标移动时,会产生大量的log 如果注释掉detach,listener 会越来越多.每次点击一个lead都会在liste ...

  8. attach和detach区别

    函数attach()可以直接访问数据框的列,而无须添加相应的数据框名 detach可以禁止访问数据库的列

  9. 关于attach和detach的疑问

    attach是把一个C++对象与一个WINDOWS对象关联,直到用detach则把关联去掉.     如果attach了以后没有detach,则C++对象销毁的时候WINDOWS对象跟着一起完蛋.   ...

  10. R语言中的attach()与detach()

    R语言中的attach()与detach() 我是学习R语言的新手,新手嘛只能做一只搬运知识的小蚂蚁,但我也是一只认真的小蚂蚁,所有的分享都是在自己遇到的问题基础上,结合前人的学习自己总结过的.这是我 ...

最新文章

  1. IE调试网页之一:F12 开发人员工具简介
  2. 学习强制删除正在运行的文件
  3. ModuleNotFoundError: No module named 'mpl_toolkits.basemap'
  4. Nginx模块开发中使用PCRE正则表达式匹配
  5. php简单的mysql类_超简单php mysql数据库查询类
  6. linux c之gcc -g file.c -o file提示warning: no newline at end of file
  7. [AGC031E] Snuke the Phantom Thief(网络流)
  8. 主机不支持php5.4,GoDaddy Linux主机不再支持PHP5.3版本 | Godaddy美国主机中文指南
  9. python爬虫验证码的识别_Python爬虫识别验证码
  10. redis-数据操作-键命令
  11. pytorch,onnx和tensorrt 的速度对比
  12. ES中文分词器-ik分词器安装
  13. 记kali下使用metasploit木马进行远程控制
  14. 服务器发送 微信通知,方糖,使用微信通知的小接口
  15. 按键消抖(并联0.1uf电容)
  16. php 微信 公众 平台,微信公众平台代码详解-php语言(一)
  17. Tasteless challenges hard WP
  18. 得了胆囊息肉对人体的危害大不大?
  19. 免费范文网复制内容-百味书屋
  20. 百万富翁问题--安全多方计算

热门文章

  1. Android文字的复制和粘贴
  2. 百度编辑器 ueditor .net开发
  3. MPC模型预测控制器——数学推导
  4. Windows程序设计学习-API-SetBkMode
  5. Android KeyCode 列表
  6. Docker以及Registry介绍
  7. C++实践參考——二进制文件浏览器
  8. 使用yo -v查看yeoman版本号
  9. Windows2008R2自动更新造成的意外重启
  10. linux 忘记mysql密码的解决办法