神秘的HANDLE,神秘的WIN32,神秘的MICROSOFT

renxu350 2010-12-22 10:14:18
句柄(HANDLE)到底是什么东西?
我原来一直没有思考过这个问题,
原来认为句柄就是1个编号而已,拿来使用就是了,
最近因为某种原因,需要探究HDC的内部细节,
句柄的实质的问题又重新浮出水面,
有一点WIN32编程经验的程序员肯定都知道句柄是什么东西,
可是句柄到底是什么东西呢?
有没有人能够真正的说清楚句柄的实质?

有人说句柄就是指针,
确实,对HINSTANCE,HMODULE而言,
句柄100%是指针,
但是,对HWND,HDC而言,
如果你说HWND,HDC是指针,
你可能100%是错误的,
比如通常情况下,一个 hDC = 0xFF012345; 时,
那么有一些WINDOWS WIN32编程经验的程序员肯定都知道,
像HWND,HDC的这样的通常的值告诉你这根本就不可能是一个指针,

再看WIN32,
WIN32的常用函数SelectObject,DeleteObject,
这很容易让人联想到C++的面向对象的“对象”,
那么这个SelectObject,DeleteObject中的Object是不是就是C++的面向对象的“对象”的对象呢?
此对象是否就是彼对象呢?
可是熟悉WIN32编程的程序员都知道,
WIN32的使用与“面向对象”四个字八杆子打不着,

神秘的HANDLE,神秘的WIN32,神秘的MICROSOFT,
MICROSOFT是不是对我们隐藏了什么?
...全文
279 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunlin7 2010-12-23
  • 打赏
  • 举报
回复
Windows为每一个进程维护了一个内核对象表,句柄就对应了这个表中的一个Item.
以文件句柄为例,HANDLE hFile,其低四位((ULONG_PTR)hFile)&(ULONG_PTR)0x1F)是句柄描述符,包括继承属性,安全属性等。其它位((ULONG_PTR)hFile)>>4)则是内核对象表的序号。基它句柄可能使用不同的约定。
对于不同的句柄,在不同的系统中可能有不同的管理策略,但从应用层次来看,它们是黑盒子,其内部改变并不影响外部的使用。
jameshooo 2010-12-23
  • 打赏
  • 举报
回复
所有句柄都只是一个整数标识,记住这只是一个整数,不要联想到指针,也不要联想到索引,虽然它可能真的是指针,也可能真的是索引。

所有系统资源都用句柄来识别身份。

为什么要用句柄?
1、保护系统资源。句柄是无意义的数值,除了API,其它人无法通过句柄访问内部资源。
2、最重要的是操作系统是跟语言无关的,别只用C/C++的眼光看系统,用整数作为身份证号码是所有语言都可以识别的,尤其对那些不支持指针的语言。
向立天 2010-12-23
  • 打赏
  • 举报
回复
你问微软是不是隐藏了是么
那是必须得
不过隐不隐藏有怎么样的
会影响我们的应用开发么?
不会
不过你要研究windows的深层机制
要自己做操作系统
即便是微软隐藏了内核实现细节有怎么样的
抄来的东西又有什么价值呢
我觉得有些事不必过于纠结
jyh_baoding 2010-12-23
  • 打赏
  • 举报
回复
需要它是什么,它就是什么
LuciferStar 2010-12-23
  • 打赏
  • 举报
回复
抱歉,本来不懂,现在更糊涂。
b2b160 2010-12-22
  • 打赏
  • 举报
回复
微软之所以用句柄就是不想你探究它怎么实现,和面向对象是一回事,就是封装
无言猪 2010-12-22
  • 打赏
  • 举报
回复
取之,用之.不调试就不用关心细节
cnzdgs 2010-12-22
  • 打赏
  • 举报
回复
句柄是对象的标识,已知对象类型和句柄可以确定唯一的对象。这里的“对象”可以看作是类对象,只是对开发者不透明。
不同类型的句柄取值方法不同,可能是数组下标、指针、偏移量,也可能是用某种特殊方法生成的ID。句柄值的作用就是找到其所指示的对象。
快乐鹦鹉 2010-12-22
  • 打赏
  • 举报
回复
wltg2001 2010-12-22
  • 打赏
  • 举报
回复
有人说句柄就是指针,
确实,对HINSTANCE,HMODULE而言,
句柄100%是指针,
========
对于HINSTANCE来说,也不一定是指针,对于HMODULE来说,它是首地址。

再看WIN32,
WIN32的常用函数SelectObject,DeleteObject,
这很容易让人联想到C++的面向对象的“对象”,
那么这个SelectObject,DeleteObject中的Object是不是就是C++的面向对象的“对象”的对象呢?
此对象是否就是彼对象呢?
可是熟悉WIN32编程的程序员都知道,
WIN32的使用与“面向对象”四个字八杆子打不着
=========
大家都知道这个和面向对象没有关系。
sg_knight 2010-12-22
  • 打赏
  • 举报
回复
我的理解就是一个标记符。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧