
Windows程序设计
文章平均质量分 93
charlie114514191
我是一个普通的嵌入式软件程序员,喜欢研究Linux(应用层跟内核从都有粗浅的涉略),单片机,操作系统和计算机体系架构等内容,目前是一枚普通的本科生。
笔者是一个朴素的开源主义者,我坚信代码和知识没有壁垒,也不应该有壁垒所在,任何人都应该平等的获取到所有的知识。笔者力所能及的将自己的代码项目开源到Github
笔者的github:https://github.com/Charliechen114514
笔者的私人博客(旧):https://charliechen114514.github.io/
笔者的私人博客(新):https://www.charliechen114514.tech/
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Windows 10 系统编程——线程专题1
本文摘要: Windows系统编程中的线程专题介绍了线程的基本概念及其与进程的关系。线程作为处理器调度的基本单位,在共享进程资源的同时,通过多线程可提升程序并发能力。文章重点讲解了Windows线程的创建方法,详细解析了CreateThread函数的各个参数,并提供了创建线程的代码示例。此外,还探讨了线程终止的三种方式,强调应从线程函数返回而非直接调用ExitThread或TerminateThread,以确保资源正确释放。线程同步和通信机制将在后续内容中进一步展开。原创 2025-10-04 09:25:22 · 332 阅读 · 0 评论 -
Windows 10系统编程——进程专题:枚举我们进程的状态
摘要 本文介绍了在Windows 10系统下使用Psapi.h进行进程状态枚举的方法。主要内容包括: Psapi.h模块介绍:该头文件提供查询系统进程、模块和内存信息的API,需在Windows.h之后包含。 EnumProcesses函数使用:通过动态分配内存池试探性获取系统所有进程PID列表,演示了典型的试探型编程模式。 OpenProcess函数详解:讲解如何获取进程句柄及所需权限,强调使用后必须调用CloseHandle释放资源。 代码实践:展示了完整代码示例,包括枚举进程PID、获取进程句柄等操作原创 2025-10-03 10:58:41 · 467 阅读 · 0 评论 -
Windows 10系统编程——进程专题1
本文介绍了Windows 10系统中的进程概念及其组成要素。主要内容包括: Windows进程类型:从Vista到Windows 10不断演进,新增了受保护进程、UWP进程、轻量级受保护进程(PPL)、最小进程和Pico进程等多种类型。 进程组成要素:通过任务管理器详细分析了进程名称、PID、状态、用户名、会话ID、CPU占用、内存使用、基本优先级、句柄数和线程数等关键属性。其中特别说明了GUI进程和UWP进程的状态判断机制。 特殊系统进程:解释了系统中断、系统空闲进程、系统进程等伪进程或特殊进程的特性。原创 2025-09-25 08:39:20 · 996 阅读 · 0 评论 -
Windows 10系统编程整理——内核对象和用户态句柄
本文介绍了Windows系统中的内核对象和用户态句柄的关系及管理机制。内核对象是内核空间的数据结构,由对象管理器创建和管理,通过引用计数机制维护生命周期。用户态通过句柄访问内核对象,句柄作为中间层提供了安全隔离和标准化接口。文章详细讲解了句柄的结构、访问权限控制、对象命名机制,以及三种共享内核对象的方式:句柄继承、DuplicateHandle复制和命名对象共享。重点强调了内核对象与用户态句柄的映射关系,以及如何通过不同机制在进程间安全地共享内核资源。原创 2025-09-24 08:15:15 · 304 阅读 · 0 评论 -
Windows 10系统编程1:概论基础
Windows 10系统架构与编程基础摘要 本文介绍了Windows 10系统架构的基本概念和编程初步。主要内容包括:Windows进程的组成要素(可执行程序、私有地址空间、访问令牌等);DLL动态链接库的作用;虚拟内存机制(32位2GB,64位8TB/128TB);线程的构成要素。文中还解释了关键系统组件如用户进程、服务进程、内核、执行程序等。最后展示了在Visual Studio Code环境下使用C++23进行Windows系统编程的示例代码,通过调用GetNativeSystemInfo()函数获取原创 2025-09-23 09:13:53 · 780 阅读 · 0 评论 -
Chrome 学习小记5——demo:(动态壁纸基础)
这篇文章介绍了如何利用Windows系统中的WorkerW窗口实现动态壁纸效果。主要内容包括: WorkerW窗口的作用 - 作为桌面级别的透明画布,可在不影响桌面图标的情况下显示动态内容。 实现步骤: 找到桌面顶层窗口Progman 通过发送0x052C消息创建WorkerW窗口 识别并获取可用的WorkerW窗口 设置窗口样式(透明、无边框、不激活等) 将自定义窗口嵌入WorkerW中 关键代码展示了如何查找和设置WorkerW窗口,以及如何调整窗口样式使其适合作为动态壁纸容器。 这种方法可以用于开发动原创 2025-09-22 09:41:13 · 923 阅读 · 0 评论 -
Windows系统编程——DLL技术
Windows DLL技术摘要 DLL(动态链接库)是Windows系统中用于共享代码和资源的动态链接技术。其主要优点包括:节省内存空间、支持运行时动态加载、便于更新维护。但也面临版本依赖(DLL Hell)、接口兼容性和加载路径等挑战。 创建DLL的基本步骤: 定义导出函数(使用__declspec(dllexport)) 实现函数功能 编译生成DLL和导入库(.lib) 客户端程序通过头文件和导入库使用DLL功能 DLL支持两种加载方式: 隐式加载(编译时链接) 显式加载(运行时通过LoadLibrar原创 2025-09-22 08:30:14 · 1024 阅读 · 0 评论 -
Windows 系统编程——内存管理
本文介绍了Windows系统的内存管理机制,主要包括虚拟地址空间划分、页表转换、工作集管理和内存分配API等内容。系统通过虚拟内存管理将进程地址空间映射到物理内存,并提供保留/提交机制控制内存使用。底层使用页表(PTE)和页框数据库(PFN)实现地址转换,通过工作集优化内存访问性能。文章详细讲解了VirtualAlloc等核心API的使用方法,包括保留/提交内存、设置保护权限等操作,并比较了传统VirtualAlloc与新版VirtualAlloc2的功能差异。这些机制共同构成了Windows高效灵活的内存原创 2025-09-22 08:28:40 · 789 阅读 · 0 评论 -
Windows编程——进程篇:线程池与纤程
Windows原生线程池与纤程机制解析 摘要:本文介绍了Windows系统原生的线程池API和纤程机制。线程池通过复用线程降低创建销毁开销,包含核心对象如池、回调环境和工作项,并提供了CreateThreadpool、SubmitThreadpoolWork等API。纤程则是更轻量的用户态调度单元,采用协作式调度,由SwitchToFiber显式切换。文章通过C++示例演示了线程池和纤程的使用方法,并对比了两者适用场景:线程池适合通用并发任务,纤程适合特定轻量级调度需求。最后建议现代开发优先考虑语言级协程或原创 2025-09-22 08:27:30 · 884 阅读 · 0 评论 -
Windows系统编程——线程同步机制
Windows系统提供了多种线程同步机制,包括临界区(Critical Section)、互斥锁(Mutex)、读写锁(SRWLock)和信号量(Semaphore)。临界区适用于进程内轻量级同步,开销小但不可跨进程;互斥锁是内核对象,支持跨进程同步但性能开销较大;读写锁优化了读多写少的场景,允许多个读线程并发访问;信号量则用于控制资源访问数量。开发者应根据具体场景(如同进程/跨进程、读写比例、性能要求等)选择合适的同步原语,平衡功能与性能需求。每种机制都有其适用场景和限制,合理选择能有效避免竞态条件并提升原创 2025-09-22 08:26:48 · 589 阅读 · 0 评论 -
Windows编程日志——线程编程基础
本文介绍了Windows线程编程的基础知识,主要包括线程的概念、创建线程的两种方式(CreateThread和_beginthreadex)以及线程退出的注意事项。线程是Windows内核可调度的执行实体,与进程不同,它是进程内的执行单元。创建线程时,若使用CRT函数应优先使用_beginthreadex以确保CRT初始化正确,否则会导致内存泄漏或异常。线程退出时,C++中应通过return退出以确保析构函数执行,避免直接调用ExitThread。最后强调不要使用TerminateThread强制终止线程,原创 2025-09-22 08:25:49 · 810 阅读 · 0 评论 -
深入理解 Windows IOCP(IO 完成端口)
Windows IOCP 异步 I/O 框架摘要 IOCP(I/O 完成端口)是 Windows 提供的高性能异步 I/O 解决方案,适合处理大量并发连接。核心机制是通过重叠 I/O 发起异步操作,由完成端口统一接收 I/O 完成通知,工作线程通过 GetQueuedCompletionStatus 获取事件处理。 关键特点: 使用少量线程处理大量连接 减少线程切换开销 支持重叠 I/O 异步操作 基本使用流程: 创建完成端口 绑定 Socket 到完成端口 发起重叠 I/O 操作 工作线程处理完成事件 文原创 2025-09-16 08:37:30 · 627 阅读 · 0 评论 -
Windows系统编程 进程篇——销毁进程
本文详细介绍了Windows系统中进程销毁的机制和流程。主要内容包括:1)基本API如ExitProcess、TerminateProcess的功能和区别;2)进程优雅退出的典型顺序,包括用户态清理、DLL卸载回调等步骤;3)内核层面的资源回收过程;4)强制终止的危害和使用场景;5)父进程监控子进程退出的方法;6)与线程/资源相关的常见陷阱和建议;7)Job objects的使用方法。文章还对比了Linux系统的进程终止机制,并提供了示例代码说明如何实现优雅退出和强制终止。原创 2025-09-15 06:01:19 · 590 阅读 · 0 评论 -
Windows 系统编程——进程篇之进程创建
本文详细解析了Windows系统API CreateProcess的使用方法及注意事项。从函数签名入手,重点讲解了lpApplicationName和lpCommandLine参数的差异与使用建议、命令行引号处理规则、dwCreationFlags常用标志、STARTUPINFO和STARTUPINFOEX结构体的配置方法。文章还深入探讨了进程创建中的句柄继承机制、环境块格式、权限与Token管理等关键问题,并提供了使用CreateProcessWithLogonW和CreateProcessAsUser创原创 2025-09-15 06:00:49 · 1098 阅读 · 0 评论 -
Windows系统编程——进程篇:获取环境变量
本文对比了Windows和Linux系统下获取环境变量的方法。在Windows系统中,可以通过GetEnvironmentStrings获取环境变量块,该块以\0分隔的name=value字符串组成,最后以双空字符结束。文章详细介绍了如何遍历、拆分这些变量,并存储到STL容器如std::map和std::vector中。同时指出Windows对字符编码的特殊处理,建议不要直接修改环境变量块。Linux系统则通过environ全局变量获取环境变量,采用C运行时库的方式实现。两种系统在环境变量处理上存在明显差异原创 2025-09-15 05:59:35 · 954 阅读 · 0 评论 -
Windows 编程 —— 进程篇1——聊下Windows 应用程序的Main入口
本文对比了Windows和Linux系统下的程序入口机制。Windows程序通过PE文件头指定的入口点启动,由CRT启动函数(如_mainCRTStartup)初始化环境后调用用户入口main()或WinMain();而Linux通过ELF的_start调用glibc启动函数再执行main()。文章详细介绍了Windows下四种常见入口形式(控制台main、宽字符main、GUI程序的WinMain及其Unicode版本)的区别,以及它们与系统调用的关系,最后通过表格对比了两大平台在程序入口、参数传递和环境原创 2025-09-14 06:43:51 · 739 阅读 · 0 评论 -
Windows 编程——字符串处理
本文摘要: Windows系统中的字符串处理涉及多种编码方式,包括ASCII/ANSI、GBK/GB18030汉字家族和Unicode(UTF-8/UTF-16)。Windows API提供"A"(ANSI)和"W"(UTF-16)两套函数版本,推荐优先使用"W"版本以避免编码转换问题。核心转换API是MultiByteToWideChar和WideCharToMultiByte,可实现不同编码间的转换。在DLL开发中,建议内部使用UTF-16实现原创 2025-09-04 07:51:30 · 1042 阅读 · 0 评论 -
Windows内核理解1(基于Inside Windows NT)
《Windows内核理解1》摘要: 本文基于《Inside Windows NT》梳理Windows内核机制,重点解析进程、线程与纤程的核心概念。进程是资源容器,包含虚拟地址空间(32位2-3GB/64位128TB)、工作集(物理内存驻留部分)、可执行映像、句柄表、安全上下文等要素,由PEB管理模块列表与进程参数。线程是CPU调度实体,共享进程资源但拥有独立栈与寄存器,通过ETHREAD/KTHREAD结构实现抢占式多任务调度。纤程作为用户态轻量线程,由应用自主协作调度,无内核开销但需手动切换。三者形成&q原创 2025-09-04 07:40:01 · 995 阅读 · 0 评论 -
Windows 错误处理机制详解(深度博客)
本文深入解析了Windows平台的错误处理机制,重点介绍了三种主要错误类型:Win32错误码(DWORD)、HRESULT(COM/WinRT)和NTSTATUS(内核层)。文章详细说明了如何正确使用GetLastError()获取错误信息及其注意事项,探讨了自定义错误码的实现方法,特别是通过HRESULT的自定义机制。此外,还介绍了FormatMessage()函数将错误码转换为可读文本的技巧,包括常用参数和注意事项。文章为Windows开发者提供了系统级错误处理的全面指南和实践建议。原创 2025-09-03 10:24:10 · 886 阅读 · 0 评论 -
Windows系统编程系列——说一说Windows下的静态库和动态库
本文介绍了Windows系统中静态库(.lib)和动态库(DLL)的核心概念与差异。静态链接将代码直接合并到可执行文件中,而动态链接则依赖运行时加载机制。文章详细解析了两种库文件的生成原理、使用场景及常见问题,包括动态库的导出机制、加载顺序、安全风险以及跨模块边界的使用注意事项。特别强调了DLL搜索顺序的安全隐患和DllMain中的loader lock问题,并给出了工程实践建议,如使用C风格ABI确保跨模块兼容性。原创 2025-09-01 07:18:04 · 1231 阅读 · 0 评论 -
Windows编程日志7——GDI编程基础
Windows GDI编程基础摘要 GDI(Graphics Device Interface)是Windows的传统绘图系统,提供设备无关的2D绘图功能。核心概念包括: HDC(设备上下文):代表绘图目标,如屏幕、打印机或内存位图 GDI对象:包括HPEN(画笔)、HBRUSH(画刷)、HBITMAP(位图)和HFONT(字体) 绘制流程:在WM_PAINT消息中通过BeginPaint/EndPaint获取和释放HDC GDI优势在于设备兼容性好、简单业务实现方便,但存在性能局限,现代应用推荐使用Dir原创 2025-08-30 12:00:57 · 1419 阅读 · 0 评论 -
Windows编程日志——Windows 资源(RC)机制深度解析 — 从 rc.exe 到 .rsrc 到运行时加载
本文深入解析了Windows资源机制,从资源编译到运行时加载的全过程。主要内容包括: 资源编译器rc.exe将.rc文件编译为.res文件,再通过链接器嵌入PE文件的.rsrc节 Visual Studio中可视化创建资源的方法及底层实现 字符串、菜单、图标三种资源的存储格式和加载逻辑: 字符串以16个为一组存储,通过LoadString加载 菜单以模板形式存储,运行时解析为HMENU对象 图标分解为多个RT_ICON资源和组描述结构 文章详细介绍了资源从定义、编译到运行时加载的完整流程,以及相关API的底原创 2025-08-29 08:37:22 · 1281 阅读 · 0 评论 -
Windows编程日志——说一说键盘、定时器、鼠标处理
本文介绍了Windows编程中常见的输入场景处理方式,包括键盘事件、鼠标事件和定时器的使用。在键盘处理部分,详细说明了虚拟键码、扫描码和字符转换的API调用;鼠标处理部分介绍了捕获和释放鼠标的API;定时器部分对比了消息定时器和高精度定时器的实现方法。文章还分析了Windows输入流的处理路径,从硬件驱动到应用程序的完整流程,并提供了不同场景下的API选择建议,帮助开发者根据需求选择合适的输入处理方式。原创 2025-08-29 08:12:34 · 866 阅读 · 0 评论 -
Windows编程5——常见的WM_系列消息含义
本文介绍了Windows编程中常见的WM_系列消息及其处理方式。消息主要分为窗口生命周期、输入、绘制、系统命令等类别,通过MSG结构传递给窗口过程函数WndProc。文章详细说明了WndProc的编写规范,包括用switch处理不同消息类型、正确拆解wParam和lParam参数、以及必须调用DefWindowProc处理未定义消息。重点列举了WM_CREATE、WM_PAINT、鼠标/键盘消息、窗口大小变化等常见消息的处理方法,并解释了消息从队列到回调函数的完整传递流程。文章强调正确处理消息参数并维护系统原创 2025-08-26 09:52:45 · 293 阅读 · 0 评论 -
Windows编程日志4——消息队列和消息处理
Windows消息队列机制是GUI应用的核心,通过消息队列缓冲外部输入事件,采用生产者-消费者模式处理消息。系统提供GetMessage/PeekMessage获取消息,TranslateMessage转换按键消息,DispatchMessage分发到窗口过程。典型消息循环采用阻塞式GetMessage或非阻塞PeekMessage实现,后者常用于游戏循环。消息结构包含窗口句柄、消息类型和参数,系统会合并同类消息以提高效率。关键点包括正确处理WM_QUIT消息、避免CPU空转以及支持对话框和快捷键处理。这种原创 2025-08-26 09:38:17 · 514 阅读 · 0 评论 -
Windows编程日志3——注册窗口类的深入学习
本文深入探讨了Windows编程中注册窗口类的核心机制。文章首先解释了RegisterClass(Ex)函数的作用,它是向操作系统注册窗口蓝图的关键步骤。随后详细解析了WNDCLASS和WNDCLASSEX结构体的各个字段,包括窗口风格、消息处理函数、图标光标等配置参数,并比较了两者的区别。文章还揭示了RegisterClassEx背后的实现原理,包括系统如何验证输入、构建内部数据结构等过程。最后阐述了为什么必须预先注册窗口类才能创建窗口,这是因为Windows事件驱动机制需要通过预先注册的类信息来快速定位原创 2025-08-25 12:32:10 · 913 阅读 · 0 评论 -
Windows编程日志2
本文介绍了Windows应用程序开发的基本流程,重点讲解了创建窗口的五个关键步骤:定义窗口类、注册窗口类、创建窗口实例、显示更新窗口以及建立消息循环。通过一个简单的代码示例,展示了如何使用Win32 API创建基本窗口程序。文章还分析了Windows编程的特点,包括大量使用结构体、严格的函数调用顺序、事件驱动的消息处理机制以及丰富的样式常量。这些内容为初学者理解Windows GUI编程提供了实用指导。原创 2025-08-24 17:14:10 · 411 阅读 · 0 评论 -
Windows编程日志学习1
Windows编程基础与API风格摘要 Windows开发主要使用C风格的API,核心头文件为windows.h。WinMain是程序入口,参数包含实例句柄和命令行信息。API设计特点鲜明:函数名直白(如MessageBox),参数多为句柄/宏(HWND、MB_OK),返回值是枚举常量。编程风格面向过程,以消息驱动为核心,通过GetMessage/DispatchMessage处理事件。大量使用句柄(HWND、HDC等)作为系统资源标识,隐藏内部实现细节。基础开发需包含相应头文件,如winuser.h处理窗原创 2025-08-24 16:23:04 · 829 阅读 · 0 评论 -
Windows系统编程API 学习之路
GetLastError公开的错误代码机制也可供应用程序使用,以类似的方式设置错误代码。这是通过在当前线程上调用SetLastError with error来设置的。函数可以使用许多预定义的错误代码之一,也可以定义自己的错误代码。为了防止与系统定义的代码发生任何冲突,应用程序应在定义的错误代码中设置第29位。以下是一个使用此技术的函数示例:if (!ok) {if (!ok) {原创 2024-07-29 09:29:47 · 2921 阅读 · 0 评论 -
Windows程序设计 - 字符与字符串处理
他们的函数基名都是一致的!唯一不同的是针对处理字符集的不同它会有不一样的后缀名,比如说处理ASCII字符串的时候,它的后缀名是A!如果提供的大小不包含终止 null 字符,则生成的 Unicode 字符串不会以 null 结尾,并且返回的长度不包括此字符。始终使用安全的字符串处理函数,例如后缀为杠S的函数或者前缀为StringCCH的函数!但是实际上,如果我们的程序走向国际,就不可避免的出现过国际化的问题,也就是字符串需要存储的是不同国家语言的文字。类的函数,他将会动态的决定是使用何种版本的字符串。原创 2024-04-26 16:19:18 · 700 阅读 · 0 评论 -
Windows程序设计 - 错误处理
第一件事情,我们使用的就是Windows提供的SDK,常见的函数的返回的数据类型有VOID(不可能失败的函数,很少有函数的返回类型是VOID)BOOL(函数失败返回0,反之返回的是一个非0的值,一个好的办法是检查这个函数的返回值是不是False来断言他是否失败!PVOID(函数调用失败返回NULL,否则会标识一块内存)LONG/DWORD,这类函数请查看具体的SDK说明!一个好的办法就是立马查看GetLastError返回最近的一次错误!原创 2024-04-26 15:11:32 · 403 阅读 · 0 评论