您的位置:首页 > 科技 > IT业 > 笔记:简要介绍什么是句柄(Handle)常见句柄都有哪些

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

2024/10/5 9:47:35 来源:https://blog.csdn.net/u010975589/article/details/141823790  浏览:    关键词:笔记:简要介绍什么是句柄(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_WRITE0, // No sharingIntPtr.Zero,2, // CREATE_ALWAYS0x80, // FILE_ATTRIBUTE_NORMALIntPtr.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 eventfalse, // 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个人主页-哔哩哔哩视频

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com