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. Spring集成PageHelper的简单用法

    1.Maven依赖,注意使用PageHelper时的版本必须与Mybatis版本对应 <!-- 添加Mybatis依赖 --> <dependency> <groupId ...

  2. 02_HttpClient_Get请求

    [实例1. GET请求百度(乱码)] /** * Http GET请求百度,但是返回乱码 */ public static void main(String[] args) throws Except ...

  3. STL的简介

    Standard Template Library,(标准模板库)<来自百度百科的整理> ————可复用性(reusability) STL是基于模板,内联函数的使用使得生成的代码短小高效 ...

  4. OpenJudge/Poj 2105 IP Address

    1.链接地址: http://poj.org/problem?id=2105 http://bailian.openjudge.cn/practice/2105 2.题目: IP Address Ti ...

  5. selenium自动化测试(1):环境搭建

    Selenium是一款优秀的WEB自动化测试工具,它功能强大,易于使用,支持多种平台.多种浏览器和多种开发语言.这里介绍使用python+selenium进行自动化测试的一些基础知识. 在Window ...

  6. Linux启动级别

    一共有7种启动级别,分别为: #   0 - halt (Do NOT set initdefault to this)  #   1 - Single user mode  #   2 - Mult ...

  7. php QQ登录

    基本原理: 就是获取唯一的openid,此值只要与自己数据库表中的值对应,就说明是此用户, 没有,则说明是新用户,其实就是找对应关系,因为openid与QQ号是唯一对应关系 放置按钮: 如在首页 in ...

  8. jquery中邮箱地址 URL网站地址正则验证实例代码

    QQ网站有一个网站举报的功能,看了一些js代码觉得写得很不错,我就拿下来了,下面是一个email验证与url网址验证js代码,分享给大家 email地址验证 复制代码代码如下: function ch ...

  9. 【PHP ThinkPHP框架】小bug汇总[更新]

    目录结构 1.函数调用 2.绑定select下拉框数据 3.PHP查询功能 4.格式化时间和价钱 5.IF标签比较两个变量 6.eq标签比较两个变量 7.新增信息或者修改信息的自动验证和自动填充 8. ...

  10. 上传头像,界面无跳转,php+js

    上传头像,界面无跳转的方式很多,我用的是加个iframe那种.下面直接上代码. html: //route 为后端接口//upload/avatar 为上传的头像的保存地址//imgurl=/uplo ...