当前位置: 首页 > news >正文

VC++ GetSafeHwnd()和GetSafeHandle()

GetSafeHwnd()和GetSafeHandle()的主要区别:

使用者不同:

  (1)窗体使用:GetSafeHwnd()用于获取窗体的安全句柄(即HWND),有了HWND我们就可以方便的对HWND指向的窗体进行所需的操作了;

  (2)GDI对象使用:GetSafeHandle(),用于获取GDI对象的句柄。

注意:在使用指针时强烈建议这么做:

  // pSomeWnd 为一个窗体的指针

  if ( NULL != pSomeWnd && NULL != pSomeWnd->GetSafeHwnd())

  {

      // do something.

  }

内存句柄与指针的区别:

1.句柄其实就是指针,但是他和指针最大的不同是:给你一个指针,你可以通过这个指针做任何事情,也许是好事,也许是通过这个指针破坏内存,干一些捣乱的事情。这个我想大家都会碰到过,因为乱用指针可能会导致程序崩溃。
句柄就没有这个缺点,通过句柄,你只能干一些windows允许你干的事情(例如调用一些api函数等等),没有了指针的随意。

2.句柄是一些表的索引也就是指向指针的指针。 句柄和指针都是地址,句柄是windows编程的一个关键性的概念,编写windows应用程序总是要和各种句柄打交道。
所谓句柄,就是一个唯一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷等。在win32里,句柄是指向一个无类型对象”(void)的指针,也就是一个4字节长的数据。
无论它的本质是什么,句柄并不是一个真正意义上的指针
从构造上看,句柄是一个指针,尽管它没有指向用于存储某个对象的内存位置。事实上,句柄指向一个包含了对该对象进行引用的位置。
句柄的声明是这样的:
typedef void handle

由于windows是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。这些运行的程序称为一个实例。为了对同一程序的多个副本进行管理,windows引入了实例句柄。windows为每个应用程序建立一张表,实例句柄就好象是这张表的一个索引。

 
不同之处还在于:
1
、句柄所指的可以是一个很复杂的结构,并且很有可以是与系统有关的,比如说上面所说的线程的句柄,它指向的就是一个类或者结构,他和系统有很密切的关系,当一个线程由于不可预料的原因而终止时,系统就可以回收它所占用的资源,如cpu,内存等等。反过来想可以知道,这个句柄中的某一些项,是与系统进行交互的。由于windows系统是一个多任务的系统,它随时都可能要分配内存,回收内存,重组内存等。 
2
、指针它也可以指向一个复杂的结构,但是通常是用户定义的,所有的必需的工作都需用户完成,特别是在删除的时候。 但在vc++6.0中也有一些指针,它们都是在处理一些小问题才用的,如最常见的字符的指针 它也是需要用户处理的,譬如你动态分配了内存;但是cstring就不要用户处理了,它其实是vc++中的一个类,所有的操作都由成员函数完成,产生(分配)由构造函数,删除(回收)由析构函数完成。


附注:获得窗口句柄三种方法

1.HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName);

 

  HWND FindWindowEx( HWND hwndParent, HWND hwndChildAfter,
                        LPCTSTR lpszClass, LPCTSTR lpszWindow );

2.HWND WindowFromPoint( 
          POINT Point);//
获得当前鼠标光标位置的窗口hwnd

3.BOOL CALLBACK EnumChildProc( HWND hwnd, LPARAM lParam);

 

BOOL EnumChildWindows( HWND hWndParent,
                       WNDENUMPROC lpEnumFunc,
                       LPARAM lParam );
BOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam ); 
BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam );
 

补充知识:指针和句柄之间的转换

a.由指针获得句柄 
      CWND* pwnd ;
      HWND  hwnd ;
      hwnd = pwnd-> GetSafeHwnd();

b.由句柄得到指针:
      CWND* pwnd = FromeHandle(hmyhandle);
      pwnd-> SetWindowText(" hello world!" ) ;

mfc类中有的还提供了标准方法,比如window 句柄 : 
static CWND pascal FromHandle( HWND hwnd )
HWND GetSafeHwnd( ) const

对于位图: 
static cbitmap pascal fromhandle( hbitmap hbitmap )
static cgdiobject pascal fromhandle( hgdiobj hobject )
hgdiobj getsafehandle( ) const


有人说句柄就是一个标示,一个id号,是错误的。一个id号可以包括多个资源,比如说单文档中的idr_mainframe,一般是指在硬盘上的资源。但是当把硬盘上的资源调入内存以后,将有一个句柄指向它,但是句柄只能指向一个资源。而且句柄知道所指的内存有多大。而指针指向地址,它不知道分配的内存有多大。
但是如果你定义一个句柄,然后在vc里面右击鼠标,选择" go to definition of handle,你会发现它的本质就是一个指针,但是它的作用不同于指针。

句柄是个指针,指向一块内存,但至于这块内存跟句柄所标识的对象是怎么联系起来的,调用者不需要清楚,调用者只需要知道,这个句柄联系着一个win32对象。
    句柄是物理地址,可以跨进程传递,例如,handle ha进程a的一个窗口,你可以在进程b中利用一个跟ha相等的值(相等就是说它们强制转成int32的值相等)初始化一个句柄,利用这个句柄你可以对进程a的那个对象进行操作,例如movewindow showwindow等。
句柄包含了一些引用计数之类的东西,所以我的上一点说的给句柄赋值是不安全的,windows api提供了一些函数,可以对句柄进行操作。


    句柄就是受限的指针。
它是由操作系统管理的,你不能通过它直接存取操作系统创建的数据结构(应该先获取对应的指针)。

操作系统在创建一个对象(如gdi file)等的时候,它会为这个对象上下文context保留一块数据结构,然后把它放在一张全局表中。句柄就是这块数据结构在表中的索引。

转载于:https://www.cnblogs.com/MakeView660/p/8446198.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • hibernate框架学习笔记5:缓存
  • Spring 的autowired大坑
  • X86汇编快速入门
  • 块存储,文件存储,对象存储的层次关系
  • HDU.3032.Nim or not Nim?(博弈论 Lasker's Nim)
  • VM CentOS Docker 安装
  • 004
  • spark深入:配置文件与日志
  • 微信支付
  • 计算机程序设计艺术(第三卷)pdf
  • react-native-splash-screen
  • C++蜂鸣器歌曲2
  • python之self本类对象
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • 解决数组塌陷的两种方式
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • canvas 五子棋游戏
  • CSS 专业技巧
  • EventListener原理
  • express如何解决request entity too large问题
  • fetch 从初识到应用
  • JavaScript-Array类型
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • mysql innodb 索引使用指南
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • sublime配置文件
  • 分布式事物理论与实践
  • 基于游标的分页接口实现
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 漂亮刷新控件-iOS
  • 三栏布局总结
  • 小程序测试方案初探
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​第20课 在Android Native开发中加入新的C++类
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (1) caustics\
  • (20)docke容器
  • (js)循环条件满足时终止循环
  • (笔试题)合法字符串
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (三)docker:Dockerfile构建容器运行jar包
  • (算法)N皇后问题
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)scrum常见工具列表
  • (自用)gtest单元测试
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Net 6.0--通用帮助类--FileHelper
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET开源、简单、实用的数据库文档生成工具