什么是句柄

    在Windows环境中,句柄是用来标识 项目的,这些项目包括: 
    *.模块(module) 
    *.任务(task) 
    *.实例(instance) 
    *.文件(file) 
    *.内存块(block of memory) 
    *.菜单(menu) 
    *.控制(control) 
    *.字体(font) 
    *.资源(resource),包括图标(icon),光标(cursor),字符串(string)等 

    *.GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件 (metafile),

              调色板   (palette),画笔(pen),区域(region),以及设备描述表(device context)。 

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

   句柄是WINDOWS用 来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。 

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


     句柄是一个标识符,是拿来标识对象或者项目的。应用程序几乎总是通过调用一个 WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应 的对象。 
   如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知 道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如 果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道Windows是一个以虚拟内存为  基础的操作系统。在这种系统环境下,Windows 内存管理器经常在内存中来回移动对象,依此 
  来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变 
  化,我们该到哪里去找该对象呢?  
    为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记 各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows 内存 管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只 需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载  (Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。 
    注意: 
    内核对象句柄,是用来标识某个内核对象的一个id 
    同一个对象的该id对于每个进程是不同的,具体如何实现是ms不公开的算法,以下是一个 
  近似的,可能的算法: 
    进程创建时,windows系统为进程构造了一个句柄表 
    当该进程希望获得一个内核对象句柄或者创建一个内核对象从而获得该对象句柄时 系统会将在句柄表中增加一个表项,表项的内容中存储了指向目标内核对象的指针 同时,系统返回这个表项在句柄表中的索引作为句柄 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中,句柄(Handle)是一个引用或指针,用于表示对托管对象或非托管资源的引用。句柄可以被用于与底层系统交互、管理资源、进行跨 AppDomain 或进程通信等操作。 在C#中,使用句柄可以通过以下方式进行: 1. 托管句柄(Managed Handle):这是对.NET对象的引用,由CLR(Common Language Runtime)进行管理和释放。在C#中,托管句柄的创建和使用是自动的,开发者无需手动管理托管句柄的生命周期。 2. 非托管句柄(Unmanaged Handle):这是对非托管资源(如操作系统提供的资源)的引用。在C#中,可以使用`IntPtr`类型表示非托管句柄。通过调用外部API函数或使用`Marshal`类中的方法,可以获取或创建非托管句柄,并进行相关操作。 以下是使用非托管句柄的一个简单示例: ```csharp using System; using System.Runtime.InteropServices; class Program { // 假设有一个外部API函数,返回一个非托管句柄 [DllImport("mylibrary.dll")] private static extern IntPtr GetHandle(); static void Main() { IntPtr handle = GetHandle(); // 调用一些需要使用句柄的操作 DoSomethingWithHandle(handle); // 释放非托管句柄 ReleaseHandle(handle); } static void DoSomethingWithHandle(IntPtr handle) { // 使用句柄进行一些操作 // ... } static void ReleaseHandle(IntPtr handle) { // 释放句柄的资源 // ... } } ``` 请注意,在使用非托管句柄时,需要确保正确地管理它们的生命周期,包括获取、使用和释放资源。这样可以避免资源泄漏和潜在的安全问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值