如何得到句柄和句柄对应的内存

转载 2012年03月27日 14:53:22
先来看些权威的片断:
...
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);

这样应用程序才能存取这块内存。

深入了解Windows句柄到底是什么

总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解。...
  • wenzhou1219
  • wenzhou1219
  • 2013年12月30日 11:02
  • 58264

Linux中句柄是什么?

句柄:句柄是一个32位的整数,实际上是windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引 指针:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据 ...
  • lufeisan
  • lufeisan
  • 2016年11月14日 10:26
  • 3767

获取真正的进程/线程句柄

首先在开始正文之前先介绍最简单的获取进程/线程句柄方法。那就是可以在创建进程/线程时获取句柄。 创建进程/线程是获取句柄。 //进程创建函数 BOOL CreateProcess( PCTSTR...
  • u010984552
  • u010984552
  • 2016年08月22日 15:54
  • 3856

取窗口句柄对应运行程序的全路径文件名模块+例程

  • 2011年08月09日 19:26
  • 3KB
  • 下载

C# 使用绑定句柄来减少进程的内存耗用

许多应用程序中,绑定了一组类型(Type)或者类型成员(从MemberInfo派生),并将这些对象保存在某种形式的一个集合中。以后,会搜索这个集合,查找特定的对象,然后调用这个对象。这是一个很好的机制...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2016年12月25日 10:03
  • 1040

使用句柄和引用计数器避免浅拷贝和浅赋值后内存空间二次释放

深拷贝和浅拷贝各有好处,但是在浅拷贝时往往会出现对指向同一片内存空间的指针变量的多次释放,在字符串类中封装一个引用计数类对象指针(句柄),通过引用计数器使指向同一片内存空间的指针仅被delete一次#...
  • yangshuangtao
  • yangshuangtao
  • 2015年06月16日 12:13
  • 887

iOS 【NSURLSession 下载文件(解决内存飙升/句柄指针/离线断点续传)】

NSURLSession发请求下载文件(代理) 解决内存飙升问题 实现下载的断点续传
  • Felicity294250051
  • Felicity294250051
  • 2016年01月22日 21:20
  • 1140

内存句柄与指针的区别 .

问题: 请专家详细介绍一下内存句柄与指针的区别。            指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这...
  • javaweb_research
  • javaweb_research
  • 2011年11月01日 11:47
  • 311

去掉LINUX系统对用户的内存大小和文件句柄限制等限制

去掉内存和文件句柄限制 以coherence用户为例子: 修改:/etc/security/limits.conf   coherence hard nproc 655360 coh...
  • xcjing
  • xcjing
  • 2017年05月07日 18:45
  • 1165

通过句柄、指针、内存看变化

句柄: 标识程序中不同对象和同类对象的不同实例的个数。如:一个窗口、图标、输入、输出设备、控件、文件等。 为什么句柄: 方便内存变更管理,源于虚拟存地址。 数据的地址需要变动,使用句柄来记录管理这个变...
  • lmdcszh
  • lmdcszh
  • 2013年07月02日 20:23
  • 1529
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何得到句柄和句柄对应的内存
举报原因:
原因补充:

(最多只允许输入30个字)