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. iOS类似QQ好友展开和合并列表的实现代码

    其实原理就是好友列表合上的时候,将这组的cell数设置为0,展开的时候,在变成原来的,就是这么简单 -(); }

  2. c#解析Josn(解析多个子集,数据,可解析无限级json)

    首先引用 解析类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; name ...

  3. 09_TomCat_基础知识

    [TomCat目录结构] bin----------存放TomCat的操作命令.bat:window版本,sh:Linux版本. startup.bat:   后台在调用catalina.bat st ...

  4. 11_Jaxws常用注解

    [不使用注解] 默认namespace是服务类包名的倒序 默认portType是服务类的类名 ............... 注解的所起的作用: Jaxws提供的注解可以对WebService的接口规 ...

  5. tomcat服务器启动错误

    有的时候,启动tomcat,显示的他已经启动了,但是就是没有加载任何工程,最后页面报404错误. 这时候,可以试着把服务器Clean一下

  6. Convert CString to TCHAR

    Quote from: http://vctipsplusplus.wordpress.com/2008/05/21/cstring-to-tchar/ CString is a very usefu ...

  7. 第43条:返回零长度的数组或者集合,而不是null

    private final List<Cheese> cheesesInStock = ...; public Cheese[] getCheese() { if(cheesesInSto ...

  8. debian 学习记录-5

    后裔排名 1 Debian - 1292 Fedora - 633 Knoppix - 50 (Knoppix本身是Debian后裔) Debian4 SuSE - 28 Debian,由Ian Mu ...

  9. highcharts图表

    最近项目中用到highcharts雷达图,如下 其实echarts就不错,echarts用canvas,highcharts用svg,各有特点 代码如下: index.html <!doctyp ...

  10. android的liveview装载数据

    设置布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andro ...