VC其它-句柄大讨论

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

句柄大讨论

Windows程序设计中,句柄是无法精确定义的术语。随便找一个高手,让他给你讲讲句柄是什么,恐怕他都很难给你一个具体的定义来。
   
Windows程序设计中,句柄无所不在,窗口有窗口的句柄HWND,线程和进程也有句柄HANDLE,甚至有人把套接字也称为句柄(我就是这样的)。
   
句柄在英文中是handle,作为动词讲是处理的意思。简而言之,句柄是处理 对象 的一个接口,对于程序中所涉及的对象,你可以通过句柄去操作他。你不应该试图去回答句柄是什么,而应该从务虚的角度去理解他,知道他干什么即可。
   
有人说,因为handle的定义是void *,因此他是一个指针。有些熟悉内核的人说这是一个索引。这些说法都是不准确的。需要注意的是,微软并没有精确定义句柄的含义,也许在某个特殊的操作系统中,他使用了一种内部含义,但是在其他版本中,就不保证这样了。任何对句柄的内在假设都可能导致灾难性的后果。
    API
是接口,句柄是接口,两者有什么区别?API是一个通用的函数族,他处理所有的对象,而句柄是和某个具体对象相关联的数据结构。只有借助句柄,API才知道处理哪个对象。
   
有些对象有ID。句柄表示特殊的对象,ID也表示某个对象,为什么要两个东西来表示?
   
首先,句柄不能唯一表示对象。一个对象可以有多个句柄。例如:假设我们用CreateProcess创建一个进程,该进程的第一个线程的句柄会返回给调用CreateProcess的进程。同时,在新创建的进程中,该线程也会有一个句柄。这样,这个线程就有两个句柄。我们也可以用 DuplicateHandle复制一个句柄,这个句柄和原来句柄是不一样的,但是他们都表示同一个对象。而每个有ID的对象,在系统范围内,ID肯定是唯一的。
   
其次,句柄所能实现的功能ID不能实现。毕竟ID只是一个数字,他不能记录很多信息。而句柄可能在其内部结构中记录了很多信息(如权限、有无信号等)。
   
总之,如果试图解释他到底是什么,学习句柄就会误入歧途。从虚的角度去理解,对于新手是难一点,但是这也许是唯一正确的办法。 

一个名为ljk的网友是这样回的,感觉比较好理解:

句柄是一种指向指针的指针

我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是驻留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。
   
我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化 了。如果地址总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存
   
这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。句柄地址(稳定)→记载着对象在内存中的地址对象在内存中的地址(不稳定)→实际对象
   
但是,必须注意的是程序每次重新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。
   
假如我们把进入电影院看电影看成 是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

 
systemVerilog的一些基本概念(类/对象/句柄/属性/方法/原型) this指针和$cast 目录 1. 基本概念 2.this指针 3.$cast 1. 基本概念 以下的这些基本概念其实是面向对象编程的基本术语。 类(class):包含变量和子程序的基本构建块。 对象(object):类的实例 句柄(handle):指向对象的指针。一个句柄可以指向很多对象。 属性(property):存储数据的变量 方法(method):任务或者函数中操作的程序性代码 原型(prototype):程序的头,包括程序名、返回类型和参数列表 可参考: systemverilog语法(五) 2.th 阅读详情

相关推荐

linux进程数和句柄

注:linux版本CentOS7 目录 一、进程句柄概念 二、Linux资源限制 1. 用户资源限制 2.service 资源限制 3. 系统资源限制 三、 进程数限制 1. 用户进程数限制 2. service进程数限制 3. 系统总进程数 四、 句柄数限制 1. 用户句柄数限制 2. service句柄数限制 3. 系统总句柄数 一、进程句柄概念 一个程序可...

ZanDon 1万+

System Verilog — 面向对象编程基础

SV中有关OOP的概念。

Sisyphus415的博客 1724

进程句柄进程ID的区别和关系

进程句柄进程ID的区别和关系  进程一个正在运行的程序 进程里可以包括多个模块(DLL,OCX,等) 进程句柄是程序访问时用到的东西,当前进程句柄等于主模块的句柄,当你使用OpenProcess时的进程句柄是不等于那个句柄的,使用完了还要关闭那个句柄 进程ID是在系统中的标识,一个进程可以有多个句柄但是ID就只有一个,可以通过ID打开多个句柄 进程

chenglinhust的专栏 9701

SV---句柄的使用

1.句柄的传递 1)句柄可以作为形式参数通过方法来完成对象句柄的传递,从外部传入方法内部。 2)句柄也可以在方法内部首先完成修改,而后再由外部完成使用 例题:下述代码最后显示的t.addr的数值是多少? function void create (Transaction tr); tr = new(); tr.addr = 100; ... endfunction Transaction t; initial begin create(t); t.addr = 10; $dis

weixin_42263208的博客 4349

VC中使用ListCtrl保存上线主机SOCKET句柄

VC中使用ListCtrl保存上线主机SOCKET句柄我知道在BCB中的列表框有一个DATE项,昨天晚上在群里草草说VC的ListCtrl也可以存入一个DWORD类型的数据,这让我很高兴因为,当时我正为如何处理上线主机的SOCKET列表而头疼,而SOCKET是 unsigned long类型的,也就是说可以把上线的主机存在ListCtrl中,而使用这个方法可以搞定了保存SOCKET数据int n

冷风 1901

VC中ID、句柄、指针、对象互相转换

VC中ID、句柄、指针、对象互相转换 2011-09-20 22:42 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。 下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针 this,用th

3598

VC中获取窗口句柄的各种方法

VC中获取窗口句柄的各种方法                      分类:             C/C++/C#             VC 6.0/MFC              2011-08-11 15:15     12819人阅读     评论(4)     收藏     举报     nullapplicationbutton活动dialog

zhuanghuimei2008的专栏 646

qt 获取屏幕句柄_VC中获取窗口句柄的各种方法

AfxGetMainWndAfxGetMainWnd获取自身窗口句柄HWND hWnd = AfxGetMainWnd()->m_hWnd;GetTopWindow函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的句柄。函数原型:HWND GetTopWindow(HWND hWnd);参数:hWnd:被查序的父窗口的句柄。如果该...

weixin_39526459的博客 2189

VC 各种情况下的窗口句柄的获取

AfxGetMainWnd AfxGetMainWnd获取自身窗口句柄 HWND hWnd = AfxGetMainWnd()->m_hWnd; GetTopWindow 函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的句柄。 函数原型:HWND GetTopWindow(HWND hWnd); 参数:   hW

一人 一剑 一壶茶 383

VC 获取窗口句柄的几种方法

摘要: 在VC++编程中常需获取控件或窗体句柄,下面总结几种方法在VC++编程中常需获取控件或窗体句柄,下面总结了几种方法,还希望家能多多补充。1、自身窗口句柄可用AfxGetMainWnd获取。 2、系统中其他APP的窗口句柄可用FindWindow获取(用SPY帮一下忙).    HWND hBtnClose;     HWND hWnd=::FindWindow(NUL

xiaocai0807的专栏 4023

c语言 取窗口句柄,MFC获取句柄的方法

句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息、处理程序):例如:::PostMessage("句柄",WM_USER_DRAWVIEWPIC_EDS,0,0);0。获取所在类窗口的句柄:this->m_hwnd1。主窗口的句柄:无论在主窗口类内,还是子窗口类内,获取主窗口句柄的方法:AfxGetMainWnd()->m_hWnd,如:::SendMessage(Af...

weixin_33199315的博客 4224

vc 通过句柄修改窗口小_窗口句柄 小知识总结

1 FindWindowHWND WINAPI FindWindow( _In_opt_LPCTSTR lpClassName, _In_opt_LPCTSTR lpWindowName);该函数通过创建窗口时的类名和窗口名查找窗口并返回该窗口的句柄,函数不会搜索子窗口。该函数区分小写。参数lpClassName [in, optional]Type: LPCTSTR类名和窗口名是在...

weixin_39559559的博客 855

vc获得窗口句柄

MFC串口句柄浅析

keyouan2008的专栏 2052

VC获取进程ID 线程ID 窗口句柄

VC获得进程ID获得主线程ID获得窗口句柄获得主窗口获得进程名 1.窗口类名 -----> 窗口句柄 窗口标题--------> 窗口句柄 HWND FindWindow(  LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 );  举例: 以 记事本为例, 记事本 窗口类名 为:N

wuqiyinglang的专栏 5434

关闭窗口函数及如何获取窗口句柄VC

  参数是要杀死的窗口名称     BOOL   FindProcessHandleAndKill(const   CString   &cs_WndName)     {     HWND   hWnd;     DWORD   ProcessID;     HANDLE   hProcess;         hWnd=::FindWindow(NULL,   cs_WndName);

movayhust的专栏 5491

VC/MFC开发中的句柄HWND

Windows开发中,经常会碰到一个常见的字眼HWND,如下 HWND hWnd; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);HW

行者 5501

VC句柄、指针、ID之间的转换

win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量。 从句柄到指针  CWnd* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object is created //and attached.  pWnd->Attach(hW

wu5318的专栏 809

VC句柄和指针之间的转换

<br />win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量。<br /><br />从句柄到指针 <br />CWnd* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object is created //and attached. <br />pWnd->Attach(hWnd); //Attaches a Windows window t

江南烟雨梦 887

VC控件背景颜色初始化及对句柄和对象的理解

VC控件背景颜色初始化及对句柄和对象的理解 需要设计的界面如下 静态对话框背景颜色不采用系统颜色,这时候需要重载CDialog类中的HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) ,其中pDC是当前控件窗口的设备上下文而不是主窗口的设备上下文,改变控件窗口背景时需要改变的是主窗口的画刷(例如CDialog对话宽中有一个ID为IDC_...

oudianluoxuanwen的博客 307
上一篇: 生活-8个标签识别精品男人
下一篇: 星座-一个令你目瞪口呆的测试!(有我做的答案)
MasterFT
博客等级 码龄20年 48粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值