笔记:简要介绍什么是句柄(Handle)常见句柄都有哪些

一、目的:简要介绍什么是句柄(Handle)常见句柄都有哪些

        在 Windows 操作系统中,句柄(Handle)是一个用于标识和管理系统资源的抽象标识符。不同类型的句柄用于管理不同类型的资源。以下是一些常见的句柄类型及其用途:
常见句柄类型 


二、常见句柄(Handle)都有哪些


1.    窗口句柄(HWND):


•    用于标识窗口和控件。
•    例如,WPF 或 WinForms 应用程序中的窗口和按钮等控件都有对应的窗口句柄。


2.    文件句柄(HFILE):


•    用于标识文件和文件流。
•    例如,通过 CreateFile 函数打开的文件句柄。


3.    设备句柄(HDEV):


•    用于标识设备,如打印机、磁盘驱动器等。
•    例如,通过 CreateFile 函数打开的设备句柄。


4.    GDI 对象句柄:


•    用于标识图形设备接口(GDI)对象,如画笔、字体、位图等。
•    例如,HBRUSH(画笔句柄)、HFONT(字体句柄)、HBITMAP(位图句柄)。


5.    用户对象句柄:


•    用于标识用户界面对象,如菜单、光标等。
•    例如,HMENU(菜单句柄)、HCURSOR(光标句柄)。


6.    线程句柄(HTHREAD):


•    用于标识线程。
•    例如,通过 CreateThread 或 OpenThread 函数获取的线程句柄。


7.    进程句柄(HPROCESS):


•    用于标识进程。
•    例如,通过 CreateProcess 或 OpenProcess 函数获取的进程句柄。


8.    事件句柄(HEVENT):


•    用于标识同步事件对象。
•    例如,通过 CreateEvent 函数创建的事件句柄。


9.    互斥体句柄(HMUTEX):


•    用于标识互斥体对象。
•    例如,通过 CreateMutex 函数创建的互斥体句柄。


10.    信号量句柄(HSEMAPHORE):


•    用于标识信号量对象。
•    例如,通过 CreateSemaphore 函数创建的信号量句柄。


三、示例代码


以下是一些示例代码,展示了如何创建和使用不同类型的句柄:


创建文件句柄
 

using System;
using System.IO;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr CreateFile(
        string lpFileName,
        uint dwDesiredAccess,
        uint dwShareMode,
        IntPtr lpSecurityAttributes,
        uint dwCreationDisposition,
        uint dwFlagsAndAttributes,
        IntPtr hTemplateFile);

    static void Main()
    {
        IntPtr fileHandle = CreateFile(
            "example.txt",
            0x40000000, // GENERIC_WRITE
            0, // No sharing
            IntPtr.Zero,
            2, // CREATE_ALWAYS
            0x80, // FILE_ATTRIBUTE_NORMAL
            IntPtr.Zero);

        if (fileHandle == IntPtr.Zero)
        {
            Console.WriteLine("Failed to create file.");
        }
        else
        {
            Console.WriteLine("File created successfully.");
            // 记得关闭文件句柄
            File.CloseHandle(fileHandle);
        }
    }
}

创建事件句柄

using System;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr CreateEvent(
        IntPtr lpEventAttributes,
        bool bManualReset,
        bool bInitialState,
        string lpName);

    static void Main()
    {
        IntPtr eventHandle = CreateEvent(
            IntPtr.Zero,
            false, // Auto-reset event
            false, // Initial state is non-signaled
            "MyEvent");

        if (eventHandle == IntPtr.Zero)
        {
            Console.WriteLine("Failed to create event.");
        }
        else
        {
            Console.WriteLine("Event created successfully.");
            // 记得关闭事件句柄
            CloseHandle(eventHandle);
        }
    }

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hObject);
}

总结


•    窗口句柄(HWND):用于标识窗口和控件。
•    文件句柄(HFILE):用于标识文件和文件流。
•    设备句柄(HDEV):用于标识设备。
•    GDI 对象句柄:用于标识图形设备接口对象。
•    用户对象句柄:用于标识用户界面对象。
•    线程句柄(HTHREAD):用于标识线程。
•    进程句柄(HPROCESS):用于标识进程。
•    事件句柄(HEVENT):用于标识同步事件对象。
•    互斥体句柄(HMUTEX):用于标识互斥体对象。
•    信号量句柄(HSEMAPHORE):用于标识信号量对象。
通过了解和正确管理这些句柄类型,可以有效避免资源泄漏和系统资源耗尽的问题。 

需要了解的知识点 

Handle Inheritance - Win32 apps | Microsoft Learn 

About Handles and Objects - Win32 apps | Microsoft Learn

Handle Limitations - Win32 apps | Microsoft Learn 

Process Explorer - Sysinternals | Microsoft Learn 

Process Monitor - Sysinternals | Microsoft Learn 

Handle - Sysinternals | Microsoft Learn 

了解更多

适用于 .NET 8 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

适用于 .NET 7 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

欢迎使用 Expression Blend | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值