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 NSMutableArray替换某个元素

    A * a1 = [A new]; A * a2 = [A new]; A * a3 = [A new]; A * a4 = [A new]; NSMutableArray *arr = [[NSMu ...

  2. C# 多任务之 Task

    Task 是什么 ? Task 是一个类, 它表示一个操作不返回一个值,通常以异步方式执行. Task 对象是一个的中心思想 基于任务的异步模式 首次引入.NET Framework 4 中. 继承层 ...

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

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

  4. Qt-获取主机网络信息之QHostInfo

    Qt中提供了几个用于获取主机网络信息的类,包括QHostInfo.QHostAddress.QNetworkInterface以及QNetworkAddress.在本节中,我将在这里总结QHostIn ...

  5. Web前端新人笔记之jquery入门

    本章将为大家介绍以下几点内容: 1.jquery的主要特点: 2.建立jquery的编码环境: 3.简单jquery脚本示例: 4.选择jquery而不是纯javaScript的理由: 5.常用的jq ...

  6. 如何使用 require.js ,实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。

    一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...

  7. json 包含字段及函数的写法

    在javascript中写类有多种方式: 1.function()中嵌套function; 2.prototype的方式 ,3.json的方式,如下: <script language=&quo ...

  8. PHP学习笔记(5) - 选择一个合格的框架

    作为一个合格的PHP开发框架,个人觉得起码需要满足以下几点. 一.上梁不正下梁歪,好的框架首先自身要有良好的编码规范和文件目录结构,代码要易于阅读理解. 二.为了可以更好地适应OOP,框架必须可以提供 ...

  9. 【加密】RSA加密之实现

    private void btn_RSA_Click(object sender, EventArgs e) { //第一种方法调用 this.textBox1.Text = RSAEncrypt(& ...

  10. EL四大作用域 9个jsp对象有效范围 及 对应的类

    java中request,session,application的作用范围 page,request,session,application四者的作用范围: page的作用范围是当前页面:对应El表达 ...