windows句柄

这篇文章是我在学习的时候为了以后忘记所以把当时的理解记录下来。一定有不正确的地方,所以仅供参考。
我们初学VC++是经常遇到一些我们在标准C++中没有的数据类型,如句柄,消息。 
句柄:我们先看看Winnt.h有关句柄的定义。
#ifdef   STRICT   
  typedef   void   *HANDLE;   
  #define   DECLARE_HANDLE(name)   struct   name##__   {   int   unused;   };   typedef   struct   name##__   *name   
  #else   
  typedef   PVOID   HANDLE;   
  #define   DECLARE_HANDLE(name)   typedef   HANDLE   name   
  #endif   
  typedef   HANDLE   *PHANDLE;
我们看到HANDLE就是PVOID,也就是无类型指针,   
  而DECLARE_HANDLE(HWND);就是:   
  struct   HWND__   {   
            int   unused;};   
  typedef   struct   HWND__   *HWND; 
其实一个结构体指针,但是这个指针不像C指针一样,它的功能被微软进行了数据封装了(也就是MS$把一些危险的特性给限制了)。所以它在WinOS里只能作某个资源的标识符。来标识一个对象资源。
这些资源包括:模块(module)、任务(task)、实例 (instance)、文件(file)、内存块(block of memory)、菜单(menu)、控制(control)、字体(font)、资源(resource),包括图标(icon),光标 (cursor),字符串(string)等、GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域 (region),以及设备描述表(device context)。这些资源说到底就是一些复杂的数据结构,微软把不同的数据结构定义成不同的句柄来标识,因为 window是个多任务虚拟内存的系统,内存中的数据要不断的进行变化,随之而来的是地址就会发生变化,这样window就用一个表来保存变化的地址以确保程序访问内存中的数据时不会出现错误,这样这个用来保存变化的地址的列表就成了一个指向指针的指针了,但是这个表中保存内存变动前的地址的指针的变量是指针,但是MS为了确保安全所以它不像C指针的特性一样,MS作了手脚所以它失去了一个指针的特性,MS称为一个资源的标识。(所以系统这些资源和操作系统有着密切的关系,如果我们能通过句柄像平时指针那样来改来该去那系统就会被破坏。)
而指针则是一块内存的首地址。我们可以对指针进行lp++、lp—等操作,得到了指针就可以自由地修改该数据。
而句柄不可以这样操作。句柄用API函数来调用。使用GetSafeHdc、FromHandle、GetSafeHwnd、GetSafeHandle、m_hWnd、GetSafeHdc等函数可以实现指针与句柄人互换。
如:1. HWND   hWnd;  
  CWnd*   pWnd   =   CWnd::FromHandle(hWnd);   
  2. CWnd*   pWnd;   
  HWND   hwnd   =   pWnd->GetSafeHwnd();
访问一个句柄标识的内存必须先GlobalLock才能得到一个指向内存的指针。 
在Window编程时常用到的句柄有如下:
HINSTANCE 一个程序的实例句柄,实例句柄其实就是程序在内存中的地址,Windows在加载每个程序的时候都会分配不同的地址,这些地址就是一个个实例句柄.(也就是一个对象在内存中的地址或叫资源标识符)
HWND 一个窗口句柄。

windows ハンドル的更多相关文章

  1. Windows server 2012 添加中文语言包(英文转为中文)(离线)

    Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...

  2. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

  3. C# 注册 Windows 热键

    闲扯: 前几日,一个朋友问我如何实现按 F1 键实现粘贴(Ctrl+V)功能,百度了一个方法,发给他,他看不懂(已经是 Boss 的曾经的码农),我就做了个Demo给他参考.今日得空,将 Demo 整 ...

  4. Windows 7上执行Cake 报错原因是Powershell 版本问题

    在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...

  5. 在离线环境中发布.NET Core至Windows Server 2008

    在离线环境中发布.NET Core至Windows Server 2008 0x00 写在开始 之前一篇博客中写了在离线环境中使用.NET Core,之后一边学习一边写了一些页面作为测试,现在打算发布 ...

  6. Windows平台分布式架构实践 - 负载均衡

    概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为 ...

  7. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

    自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...

  8. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  9. 1.初始Windows Server 2012 R2 Hyper-V + 系统安装详细

    干啥的?现在企业服务器都是分开的,比如图片服务器,数据库服务器,redis服务器等等,或多或少一个网站都会用到多个服务器,而服务器的成本很高,要是动不动采购几十台,公司绝对吃不消的,于是虚拟化技术出来 ...

  10. 0.Win8.1,Win10,Windows Server 2012 安装 Net Framework 3.5

    后期会在博客首发更新:http://dnt.dkill.net 网站部署之~Windows Server | 本地部署:http://www.cnblogs.com/dunitian/p/482280 ...

随机推荐

  1. 不显示UITableView底部多余的分割线

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

  2. (CodeForces 558C) CodeForces 558C

    题目链接:http://codeforces.com/problemset/problem/558/C 题意:给出n个数,让你通过下面两种操作,把它们转换为同一个数.求最少的操作数. 1.ai = a ...

  3. mysql innodb 数据打捞(三)innodb 簇不连接页的扫描提取(计划)

    操作系统簇大小一般是4K,而innoDB的页大小一般是16K,那么就有可能16K的页没有存储在连续的簇中,这样扫描软件就不会扫描出来这样的页面.为了解决这个问题,决定给软件增加半页扫描功能. 在第一次 ...

  4. [翻译][MVC 5 + EF 6] 9:异步和存储过程

    原文:Async and Stored Procedures with the Entity Framework in an ASP.NET MVC Application 1.为什么使用异步代码: ...

  5. 安卓热更新之Nuwa实现步骤

    安卓热更新之Nuwa实现步骤 最近热更新热修复的功能在安卓应用上越发火热,终于我的产品也提出了相应的需求. 经过两天的研究,搞定了这个功能,在这里还要多谢大神们的博客,大神们的原理分析很到位,不过对于 ...

  6. 避免ajax请求过多,导致内存溢出,请求之后回收资源

    php试题网 http://phpshiti.com/ http://www.jb51.net/article/30458.htm success: function (data, textStatu ...

  7. CenOS6.4 系统升级内核

    获取要升级的内核版本的包 #wget -c https://www.kernel.org/pub/linux/kernel/v3.x/内核版本 若得到的内核的压缩格式为tar.xz,则需要两步解压 # ...

  8. JavaScript的事件监听、捕获和冒泡

    在前端开发中,我们经常需要对某些事件进行监听.这样只要在指定的元素上触发了该事件,就会执行一个回调函数来进行相关的操作. 而JavaScript中事件监听的方法总共有三种,分别如下: element. ...

  9. 怎么用程序获取远程url执行后的图片地址

    远程URL:https://121.199.16.229:8890/generate.cgi?rbid=1001&esn=22021434025005&pic=png&coun ...

  10. 笨方法学python 33课

    今天Eiffel看到了第33章,任务是把一个while循环改成一个函数. 我在把while循环改成函数上很顺利,但是不知道怎么写python的主函数,在参数的调用上也出现了问题. 通过查资料,发现py ...