`
izuoyan
  • 浏览: 8964778 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

什么是句柄?(转载)

阅读更多
先来看些权威的片断:
...
typedef unsigned int HANDLE;
#define DECLARE_HANDLE(name) typedef UINT name

DECLARE_HANDLE(HMODULE);
DECLARE_HANDLE(HINSTANCE);
DECLARE_HANDLE(HLOCAL);
DECLARE_HANDLE(HGLOBAL);
DECLARE_HANDLE(HDC);
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HMENU);
DECLARE_HANDLE(HACCEL);
DECLARE_HANDLE(HTASK);
...
#define DECLARE_HANDLE(x) typedef WORD x
...
//+-------------------------------------------------------------------------
// DECLARE_HANDLE Macro
//--------------------------------------------------------------------------
#ifndef DECLARE_HANDLE
#define DECLARE_HANDLE(name) \
struct name##__ { DWORD unused; }; \
typedef struct name##__ _far* name
#endif
...

知道本质了吧~~~~

WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。


在<<WINDOWS编程短平快>>(南京大学出版社)一书中是这么说的:句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

从上面的2个定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。在WINDOWS编程中会用到大量的句柄,比如:HINSTANCE(实例句柄),HBITMAP(位图句柄),HDC(设备描述表句柄),HICON(图标句柄)等等,这当中还有一个通用的句柄,就是HANDLE,比如下面的语句:

HINSTANCE hInstance;

可以改成:

HANDLE hInstance;

上面的2句语句都是对的。

一个WINDOWS应用程序可以用不同的方法获得一个特定项的句柄。许多API函数,诸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一个句柄值。另外,WINDOWS也能通过应用程序的引出函数将一个句柄作为参数传送给应用程序,应用程序一旦获得了一个确定项的句柄,便可在WINDOWS环境下的任何地方对这个句柄进行操作。其实句柄的大量使用已经影响到了每一个WINDOWS的程序设计。

句柄只有当唯一的确定了一个项目的时候,它才开始有意义。句柄对应着项目表中的一项,而只有WINDOWS本身才能直接存取这个表,应用程序只能通过API函数来处理不同的句柄,举个例子来说吧!比如:我们可以为我们的应用程序申请一块内存块,通过调用API函数GlobalAlloc,来返回一个句柄值:

hMem=GlobalAlloc(......);

其实现在hMem的值只是一个索引值,不是物理地址,应用程序还不能直接存取这块内存。这儿还有一个话外题,就是,一般情况下我们在编程的时候,给应用程序分配的内存都是可以移动的或者是可以丢弃的,这样能使有限的内存资源充分利用,所以,在某一个时候我们分配的那块内存的地址是不确定的,因为他是可以移动的,所以得先锁定那块内存块,这儿应用程序需要调用API函数GlobalLock函数来锁定句柄。如下:

lpMem=GlobalLock(hMem);

这样应用程序才能存取这块内存。
分享到:
评论

相关推荐

    易语言获取窗口句柄工具

    新手学习易语言时必须的工具,自己也在用,转载自网络。

    易语言枚举窗口易语言枚举窗口易语言枚举窗口

    易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载...

    米散射理论整理综合.docx

    mie散射理论整理多篇关于...版权声明:本文为CSDN博主「谁梦蓝天」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/manqianfu9364/article/details/84996018

    GUIs_FEX.zip

    什么是回调字符串?(见GUI_30) 当其中一个图片关闭时,其它所有图片都自动关闭?(见GUI_24, 29, 30, 41) 在一个复杂的GUI中如何使得多个uicontrol进行交互?(见GUI_31, 32, 33, 41) 如何从GUI获取数据并...

    解决了关闭串口时死锁的CSerialPort类

    该文章转载自:http://blog.csdn.NET/itas109 与2016-12-20日在其基础上修改了其中关串口卡死现象,添加十六进制与ASCII之间互转函数,觉得蛮好用的推荐给大家 如需转载请标明原始出处:...

    MFC下实现毛玻璃效果

    想在Win7下重画MFC应用程序界面及实现界面的毛玻璃效果,在网上溜达一下发现“用C++品尝Vista美味:界面地毛玻璃效果”,各大网站都是相互转载的同一篇文章。这篇文章是基于WTL实现的,其中有个默认主题句柄。而MFC...

    MFC调用win32窗口显示调试信息

    MFC调用win32窗口显示调试信息,使用AllocConsole 函数(2010-11-16 15:33:25)转载标签: 调试win32mfc杂谈 分类: 编译器 AllocConsole Function 为主调进程分配一个新的控制台。 语法 C++ : BOOL WINAPI ...

    vc++动态调整对话框属性实现悬浮窗体

    转载请说下! vc++动态调整对话框属性实现悬浮窗体 主要应用了将 主窗口的子窗口(初始为child属性) 悬浮(populer)归位;动态改变属性;归位、复位是将 窗口恢复到母窗口原来的地方(通过获取主窗口的句柄 CWnd ...

    vc++动态悬浮窗体

    原创代码,免费分享,转载请说明! 主要应用了将 主窗口的子窗口(初始为child属性) 悬浮(populer)归位;动态改变属性;归位、复位是将 窗口恢复到母窗口原来的地方(通过获取主窗口的句柄 CWnd *wnd = ...

    C#写的QQ自动发消息.rar

    版权归 三角猫 和 真有意思网 所有,转载请注明出处 using System; using System.Collections.Generic; using System.Text; namespace QQAutoMsg { /// /// 消息发送 /// internal static class QQMsgSender...

    windows用户称拦截api

    为什么是十字节呢?其实修改多少字节都没有关系,只要实现了函数的跳转之后,你能把他们恢复并让他继续运行才是最重要的。在CPU的指令里,有几条指令可以改变程序的流程:JMP,CALL,INT,RET,RETF,IRET等指令。...

    ce源码易语言滴

    ReadProcessMemory (操作句柄, 超级列表框1.取表项数值 (计次 - 1), 临时, 取字节集长度 (到字节集 (搜索变量)), 0) .如果真 (超级列表框1.取标题 (计次 - 1, 1) ≠ 到文本 (临时)) 超级列表框1.置标题 (计次 ...

    线程里面列表框 标签调用反馈用法/高级表格线程防崩溃-易语言

    ' 参数一:进程句柄 -1为自身句柄 ' 参数二:指定CPU ' 参数二的设置是二进制转十进制。参数二需填写十进制数字 ' 例如我想设置 ' 1CPU二进制为1 转换为十进制为 1 ' 2CPU二进制为10 转换为十进制为 2 ' 3CPU...

    perl 程序开发教程

    Perl 5 教程 by flamephoenix ... 本教程欢迎下载、转载和链接,转载必须保留本说明并保持文章完整。本教程不允许以任何形式用于商业用途。 对本教程有何疑问、更正或建议请告诉我,谢谢。 flamephoenix

    易语言-易语言真正的线程池简易实现

    转载请保留 前文: 为了能充分理解本篇文章的内容,需要了解的知识如下: 1.事件对象的使用:http://baike.baidu.com/view/751499.htm 2.信号量的使用:http://baike.baidu.com/view/1285861.htm 3.等待单一对象,...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    面再提示缺少什么dll 文件,都像这样解决就可以了。 二、Qt Creator 编写多窗口程序(原创) 实现功能: 程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直 接关闭这个对话框,便不能进入主窗口,整个程序...

    NB模块v4.3-易语言

    NB模块部分代码摘自论坛或其它源码,仅转载,能找到出处的都注明了出处,原帖地址 等NB模块完全开源,可根据需要自行修改 更新内容: NB模块v4.31.新增 路径一定位() 路径一定位W() //取自精易模块  文件_定位() ,修复...

    x64进程远程hook,x64_远程调用函数,源码更新V1.8.2:2021/4/12-易语言

    不管您是转载还是使用请保留版权,源码在精益论坛免费发布本人未获利,请不要用于非法途径。 --------------------------------------------------------------- 2021/4/12 模块源码 v1.8.2更新 1:修复 x64_远调用...

    仿windows关机功能界面

    转载同事的测试例子,也许大家可以看看 // MyFade.cpp : implementation file // #include "stdafx.h" #include "MyFade.h" #pragma warning(disable: 4201) #include #pragma comment(lib,"winmm.lib") #...

Global site tag (gtag.js) - Google Analytics