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. 怎么在ubuntu上使用pidgin登陆QQ

    1.Ubuntu pidgin安装webqq 首先安装webqq的通讯协议: sudo add-apt-repository ppa:lainme/pidgin-lwqq sudo apt-get u ...

  2. Xcode中添加代码块的方式

    在写代码的过程中,经常会有重复的代码(比如说,cell的使用),当然了复制粘贴也不是不行,但是Xcode提供了一个很方便的东西. 1.在Xcode右下角你会看到有一个{}的东西,这里是一些常用的代码块 ...

  3. Attribute (一)

    本文导读 1.概念 2.自定义一个 Attribute 概念       Attribute是一个特殊的类,我们知道 .NET 程序集 具有自描述的特性(由于元数据),Attribute和.NET的元 ...

  4. The method getContextPath() is undefined for the type ServletContext

    我出错时,到网上说得是版本问题,我找到对应的包javax-servlet5.1.12.jar,把它删了,居然不报错了,原来是和包servlet-2_5-api.jar冲突了

  5. Codevs 1001 舒适的路线 2006年 NOIP全国联赛提高组

    1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观 ...

  6. UVA - 572 Oil Deposits(dfs)

    题意:求连通块个数. 分析:dfs. #include<cstdio> #include<cstring> #include<cstdlib> #include&l ...

  7. How to: Extract files from a compiled setup.exe created by Inno setup

    Use innounp.exe to unpack setup.exe created by using Inno setup: for example, unpack all the files w ...

  8. 实习笔记-1:sql 2008r2 如何创建定时作业

    在公司实习了近一个月,学了很多东西.这一篇是一些比较基础的东西,本人是小菜鸟,不喜欢大神来喷.大神欢迎出门点右上角.谢谢~ 说大实话,对于数据库,我在还没出来实习的时候就是只懂写一些sql语句以及知道 ...

  9. Eclipse代码自动提示

    发现了一个好用的快捷键,不用跳转到源文件就可以看源代码:先按shift键,然后鼠标点击要看的代码,即可.

  10. 我爱工程化 之 gulp 使用(二)

    上一篇  介绍了gulp的安装.环境等配置.基本使用,那么现在,我们快走进 速8,深入了解吧...... 一.各种安装.环境配置.插件安装(参考上一篇文章) 二.项目基本目录结构 三.编写 gulpf ...