手柄和指针的区别与联系


所谓 句柄实际上是一个数据。是一个Long (整长型)的数据。

句 柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗体。控制,位图。GDI对象等等。

WINDOWS句柄有点象C语言中的文件句柄。 从上面的定义中的我们能够看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每一个人都会有一个。不同的人的姓名不一样,可是。也可能有一个名字和你一样的人。

从数据类型上来看它仅仅是一个16位的无符号整数。应用程序差点儿总是通过调用一个WINDOWS函数来获得一个句柄,之后其它的WINDOWS函数就能够使用该句柄,以引用对应的对象。

假设想更透彻一点地认识句柄,我能够告诉大家, 句柄是一种指向指针的指针。 我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。

假设简单地理解。似乎我们仅仅要获知这个内存的首地址,那么就能够随时用这个地址訪问对象。可是。假设您真的这样觉得。那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这样的系统环境下。Windows内存管理器常常在内存中来回移动对象,依此来满足各种应用程序的内存须要。

对象被移动意味着它的地址变化了。

假设地址总是如此变化,我们该到哪里去找该对象呢?

为了解决问题,Windows操作系统为各应用程序腾出一些内存储地址。用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。

Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们仅仅需记住这个句柄地址就能够间接地知道对象详细在内存中的哪个位置。

这个地址是在对象装载(Load)时由系统分配给的。当系统卸载时(Unload)又释放给系统。 句柄地址(稳定)→记载着对象在内存中的地址────→对象在内存中的地址(不稳定)→实际对象 本质:WINDOWS程序中并非用物理地址来标识一个内存块,文件,任务或动态装入模块的。相反的,WINDOWS
API给这些项目分配确定的句柄,并将句柄返回给应用程序。然后通过句柄来进行操作。 可是必须注意的是程序每次从新启动。系统不能保证分配给这个程序的句柄还是原来的那个句柄,并且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动执行。那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

1、句柄所指的能够是一个非常复杂的结构。而且非常有能够是与系统有关的,比方说上面所说的线程的句柄,它指向的就是一个类或者结构,他和系统有非常密切的关系。当一个线程因为不可预料的原因。而终止时在系统就能够回它所占用的资料,如CPU。内存等等。反过来想能够知道,这个句柄中的某一些项,是与系统进行交互的。

因为Windows系统。是一个多任务的系统,它随时都可能要分配内存。回收内存,重组内存。
2、指针它也能够指向一个复杂的结构。可是一般是用户定义的。所以的必需的工作都要用户完毕。特别是在删除的时候。 但在VC++6.0中也有一些指针,它们都是处理一些小问题才用的,如最常见的字符的指针,它也是要用户处理的假设你动态分配了内存;可是Cstring就不要用户处理了,它事实上是VC++中的一个类。所以的操作都由成员函数完毕,产生(分配)由构造函数,删除(回收)由析构函数完毕。 3.句柄是标号,指针是内存地址

句柄和指针根本就不是一回事。基本上没有共同的地方。我对句柄的定义是:. 句柄是系统内部受保护的数据结构的标志或者说索引. 我的解释: 当你的应用程序或者系统建立内核对象。用户对象。GUI对象的时候实际上这些对象是一些内存数据结构(这个就不要我解释了吧)显然这些对象须要受到保护。不能让用户随便改动訪问,否则系统非常easy崩溃所以提供了一个机制来保护性的訪问这些对象,那就是API句柄是这些对象的标记,或者说是索引在内存中往往会存在一张句柄表。一般至少有例如以下结构
索引(也就是句柄) 指针(指向内存对象数据结构) 其它项 1 ox??????

??

2 ox??????

??

3 ox??

??

??

?? 4... 系统採用API,查询句柄表,取得句柄所相应的指针,这个指针才是真正的指针。用它能够訪问改动受保护的内存. . 假如句柄是指针 . 1 你自己输出一些句柄的值来看,句柄一般都是一些非常小的整数值。 比方1,2,3,4...... 假设是指针的话,它起不是指向受保护的区域?岂不是NULL指针??? 2 句柄假设是指针的话。那么用户岂不能够直接訪问内存对象了?那系统还有什么稳定性,安全性?
3 你把得到的句柄,比方hwnd做hwnd++,hwnd--等运算,你看错不错 其它理由我都不想说了 假设有人说看到句柄的定义为指针(我没有看到过) 那你就去当指针吧,反正指针也是32位的值。和无符号整数没有不论什么差别.

附注:获得窗体句柄三种方法

1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)

HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)

2.HWND WindowFromPoint(POINT& Point)//获得当前鼠标光标位置的窗体HWND

3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)

BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)

BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

指针 句柄之间的转换

a.由指针获得句柄 CWnd * pWnd; CWnd HWnd; HWnd = pWnd->GetSafeHWnd();

b.由句柄得到指针:

CWnd* pWnd=FromeHandle(hMyHandle); pWnd->SetWindowText("Hello World!"); or CWnd* pWnd; pWnd->Attach(hMyHandle); MFC类中有的还提供了标准方法,比方Window 句柄 : static CWnd* PASCAL FromHandle( HWND hWnd ); HWND GetSafeHwnd( ) const; 对于位图: static CBitmap*
PASCAL FromHandle( HBITMAP hBitmap ); static CGdiObject* PASCAL FromHandle( HGDIOBJ hObject ); HGDIOBJ GetSafeHandle( ) const;

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-11-03 22:09:56

手柄和指针的区别与联系的相关文章

句柄和指针的区别和联系

所谓 句柄实际上是一个数据,是一个Long (整长型)的数据.句 柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等.WINDOWS句柄有点象C语言中的文件句柄. 从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人.从数据类型上来看它只是一个16位的无符号整数.应用程序几乎总是

指针数组和数组指针的区别

数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数据的长度. 如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组. p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++;       //该语句执行过后,也就是p=p+

引用与指针的区别

引用:相当于给一个变量取的别名,它本身不是一种数据类型,因此不战用存储空间,不能建立数组的引用 引用作为函数参数:当发生函数调用时,用引用作为参数,在内存中并不会产生实参的副本,也不会给引用这个形参分配空间, 而是直接对实参进行操作,但如果用一般变量作为函数参数,则会给它分配空间,并且作为实参的副本,如果 传递的是对象,还将调用拷贝构造函数 引用与指针的区别:相同点:引用与指针都会导致实参对象值的改变 不同点:a.引用不用分配空间,指针要分配空间,且指针作为形参在调用时,必须用变量的地址作为实参

指针数组??数组指针的区别.xml

pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6;font-style:italic;font-weight:bold;} .selfFuc{color:#800080;} .bool{color:#d2576f;} .condition{color:#000080;font-weight:bold;} .key{color:#000080;} .

引用和指针的区别

引用(references)使用"."操作符,指针(pointers)使用"*"和"->"操作符,这是两者最基本也是最熟悉的区别了,应该不用详说. 首先,没有所谓的null reference.一个reference必须总代表某个对象,因此C++要求references必须有初值: string& rs://错误!references必须被初始化 string s("xyzzy"); string& rs

数组与指针的区别

数组与指针的区别 1.数组与指针的定义 指针是变量,存储的是一个地址,用来间接访问数据,在32位系统下占用4个字节.指针可以指向任何内存空间,但不是任何内存空间都可以通过指针去访问(不能访问寄存器). 数组是标识符且不占用存储空间,类似于常量,因此数组名不能作为左值. short *sz[4]; //大小为4的一维数组,元素是指针 short (*sz1)[4]; //指向数组的指针 2.extern数组与指针 先看这一段代码: /* * d.c * Created on: * Author:

字符串拼接 strcat ;数组和指针的区别

问题:字符串拼接 strcat 方法1: 开辟新空间,存放结果: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> char* _strcat(char* str1, char* str2){ assert(str1 != NULL && str2 != NULL); char* ret = (char*)malloc((strlen(

数组与指针的区别,以及在STL中传递数组/指针

数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = { 1,2,3,4,5 }; f(a); 上述代码输出的是4(32位系统)或8(64位系统),总之不是sizeof(int) * 5(数组大小). 为什么明明形参是数组形式的int [],实际上和指针形式的int *无异呢?关键原因就在于,数组是不能作为左值的. 也就是说,你不能定义两个数组,比如int a[

C语言学习笔记 (002) - C++中引用和指针的区别(转载)

下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图,所示指针的含义: 引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用.见下图,所示引用的含义: 2.指针和引用的区别 首先,引用不可以为空,但指针可以为空.前面也说过了引用是对象的别名,引用为空--对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化.因此