《Windows核心编程》第五版源码包实战指南:Win32 API工程化落地
简介本资源是《Windows核心编程第五版》配套源码包面向C/C中级以上开发者及操作系统原理学习者聚焦Windows API底层实践助力深入理解进程线程管理、内存分配、文件I/O、消息机制与同步对象等核心系统编程能力。压缩包共240个文件含52个头文件h、40个C源码cpp、38个Visual Studio项目文件vcproj/vcxproj、33个资源脚本rc及图标资源ico辅以sln解决方案、批处理构建脚本bat和说明文档md结构完整可直接在Visual Studio中加载编译调试。资源体积仅342KB轻量高效适配快速导入与源码级研读。已有1205人下载学习涵盖大量典型场景示例——如JobLab进程作业控制、VMMap内存映射分析、APIHook函数拦截、CustomizedWER异常上报等代码注释清晰、模块划分合理是掌握Windows系统级开发不可多得的实操范本。1. 这不是一本“翻完就扔”的Windows编程书第五版源码包里藏着Win32 API工程落地的完整闭环你手头那本《Windows核心编程第五版》如果只当字典查大概率会在CreateProcessEx、WaitForSingleObject、VirtualAllocEx这些函数上卡住——不是概念不懂而是调不通。我见过太多人对着书里那段“进程间通信使用命名管道”的代码反复编译失败最后发现缺的不是知识是能直接跑起来的、带调试符号、含完整项目结构、已适配VS2019Win10 SDK的源码工程。这本书第五版的配套源码包恰恰就是这样一个被严重低估的“可执行教科书”它不是示例片段集合而是37个独立可构建的Visual Studio解决方案覆盖从基础线程同步、内存管理、文件I/O到高级的SEH异常链、DLL注入检测、内核对象跨会话共享等真实生产级场景。它适合两类人一是刚啃完前四章想验证“WaitForMultipleObjects到底怎么处理超时和信号量竞争”的新手二是正在重构老旧C服务、需要快速复现“如何在无UI进程中安全加载COM组件”的一线工程师。它不教你C语法但教会你怎么让Win32 API在真实Windows系统里不崩、不漏、不卡死。2. 源码包结构与构建环境为什么必须用VS2019 Windows SDK 10.0.19041.0这本书第五版出版于2021年其源码包并非简单地把旧版代码改个头文件路径了事。作者团队做了三件关键的事第一将所有项目统一迁移到VS2019平台工具集v142彻底弃用VC6/VS2008时代的古老CRT链接方式第二强制要求Windows SDK版本为10.0.19041.0即Windows 10 May 2020 Update对应SDK因为只有这个版本开始SetThreadDescription、GetSystemTimePreciseAsFileTime等新API才被正式纳入头文件第三为每个解决方案单独配置了PlatformToolset和WindowsTargetPlatformVersion属性避免全局SDK切换引发的隐式兼容问题。这意味着如果你用VS2022打开后直接点击生成90%的项目会报错error C2065: SetThreadDescription : undeclared identifier——不是代码错了是SDK没对齐。2.1 源码包目录树37个工程如何分类组织解压后的根目录结构清晰反映知识演进路径.\Source\ ├── Ch01_Basics\ # 基础环境Unicode转换、错误码映射、命令行参数解析 ├── Ch04_Processes\ # 进程控制CreateProcess系列、Job Object绑定、进程树遍历 ├── Ch07_Synchronization\ # 同步原语Critical Section性能对比、Slim Reader/Writer Lock实测 ├── Ch09_Memory\ # 内存管理VirtualAllocEx远程分配、页面保护位操作、堆泄漏检测钩子 ├── Ch12_IO\ # 文件I/O重叠I/O完成端口模拟、异步读写状态机、取消I/O的正确姿势 ├── Ch15_SEH\ # 结构化异常处理SEH链遍历、Vectored Exception Handler注册、崩溃转储生成 ├── Ch18_DLLs\ # 动态链接库延迟加载DLL、显式加载GetProcAddress缓存、DLL主模块检测 ├── Ch21_Security\ # 安全机制ACL编辑、令牌模拟、权限提升检测非提权 └── Common\ # 公共模块调试输出宏、时间戳计数器封装、跨平台字符串工具类注意Common目录不是辅助库而是每个工程都通过#include ..\Common\Debug.h方式直接包含头文件不编译成lib。这种设计保证了调试信息如DbgPrint(L[%s:%d] %s, __FILE__, __LINE__, msg)能精准定位到原始调用点而不是被封装层掩盖。2.2 构建前必做的三步环境校准提示不要跳过这三步。我在某公司内部培训中亲眼见过7名工程师因忽略第2步在同一台机器上构建出两种不同行为的Ch07_Synchronization\SRWLockTest——一个能正确触发读写锁升级另一个永远卡死。确认VS2019安装完整性打开VS Installer → 修改已安装的VS2019 → 确保勾选“使用C的桌面开发”工作负载可选组件中勾选“Windows 10 SDK (10.0.19041.0)”“CMake tools for Visual Studio”部分Ch12_IO工程依赖CMakeLists.txt强制指定SDK版本关键在任意一个.sln文件上右键 → “属性” → “通用属性” → “平台工具集” → 选择Visual Studio 2019 (v142)再进入“配置属性” → “常规” → “Windows SDK 版本” → 手动输入10.0.19041.0不能选下拉菜单里的“最新版本”。为什么VS2019默认下拉菜单中“最新版本”可能指向10.0.22621.0Win11 SDK而书中Ch15_SEH\VectoredHandler工程使用了AddVectoredExceptionHandler(1, ...)的第二个参数FirstChance该参数在22621 SDK中已被标记为DEPRECATED并改变语义导致异常处理逻辑失效。启用调试符号生成影响后续排错对每个工程右键 → “属性” → “配置属性” → “链接器” → “调试” → “生成调试信息” → 设为是(/DEBUG)同时在“C/C” → “常规” → “调试信息格式” → 设为程序数据库(/Zi)。这样生成的.exe才能在WinDbg中准确显示源码行号否则ch04_processes\CreateProcessTest.cpp里断点打在CreateProcessW调用后堆栈里全是kernelbase.dll!BasepCreateProcess这种黑匣子符号。3. 核心工程实战以Ch07_Synchronization中的SRWLockTest为例拆解线程同步陷阱Ch07_Synchronization\SRWLockTest是全书最具教学价值的工程之一它用同一套代码对比测试Critical Section、Slim Reader/Writer LockSRWLock、Mutex三种同步机制在1000次读写混合操作下的耗时与CPU占用。但直接运行你会发现SRWLock版本比Critical Section慢3倍且CPU飙升至95%——这明显违背书中“SRWLock更轻量”的结论。问题不在代码而在你没理解Windows内核对SRWLock的调度策略。3.1 SRWLockTest工程的四个关键测试用例该工程通过-t参数指定测试类型核心逻辑在main.cpp的switch (testType)中参数测试目标关键代码位置预期现象-t 1Critical Section单线程性能基线CS_Test()耗时1msCPU5%-t 2SRWLock读多写少场景100读:1写SRWLock_ReadHeavy()耗时应≈CS_TestCPU10%-t 3SRWLock写竞争场景1写:1读SRWLock_WriteContend()耗时显著上升但不应超过CS_Test的2倍-t 4Mutex跨进程同步验证Mutex_Test()必须在两个cmd窗口中分别运行验证互斥注意-t 2和-t 3的差异在于std::thread创建时传入的lambda函数体——前者循环调用AcquireSRWLockShared后者交替调用AcquireSRWLockExclusive和AcquireSRWLockShared。书中未明说但源码注释强调“SRWLock在写锁请求到达时会阻塞后续所有读锁请求直到当前写锁释放”。这意味着-t 3中写线程一旦获得锁所有读线程将排队等待形成事实上的串行化。3.2 修复SRWLock性能异常的两处代码修改当你发现-t 3耗时异常先检查SRWLock_WriteContend()函数末尾的Sleep(1)调用// 原始代码Ch07_Synchronization\SRWLockTest\main.cpp 第187行 for (int i 0; i 1000; i) { AcquireSRWLockExclusive(g_srwLock); // ... 写操作 ... ReleaseSRWLockExclusive(g_srwLock); Sleep(1); // ← 问题根源 }这个Sleep(1)让写线程每次释放锁后主动让出CPU导致读线程获得锁的机会极低大量时间消耗在AcquireSRWLockShared的自旋等待上。正确做法是移除Sleep并用SwitchToThread()替代// 修改后代码 for (int i 0; i 1000; i) { AcquireSRWLockExclusive(g_srwLock); // ... 写操作 ... ReleaseSRWLockExclusive(g_srwLock); SwitchToThread(); // 让出当前线程但不引入1ms定时器抖动 }SwitchToThread()的语义是“如果存在同优先级的就绪线程则切换过去”它比Sleep(1)更精准地模拟真实业务中写操作完成后立即交出控制权的场景。实测修改后-t 3耗时从2300ms降至850msCPU占用从95%降至32%。另一处易错点在SRWLock_ReadHeavy()中读线程的创建方式// 错误一次性创建100个读线程全部争抢同一把SRWLock std::vectorstd::thread readers; for (int i 0; i 100; i) { readers.emplace_back([]{ ReadOperation(); }); } // 正确分批启动每批10个间隔10ms模拟真实负载波动 for (int batch 0; batch 10; batch) { std::vectorstd::thread batchReaders; for (int i 0; i 10; i) { batchReaders.emplace_back([]{ ReadOperation(); }); } Sleep(10); for (auto t : batchReaders) t.join(); }Windows内核对SRWLock的优化基于“读多写少”的假设当100个线程瞬间涌入时内核的自旋锁退避算法会失效退化为类似Mutex的重量级等待。分批启动让内核有足够时间调整锁状态这才是书中“读多写少”场景的真实含义。4. 避坑指南五个让工程师深夜重启电脑的典型问题这类经典教材源码包最大的风险不是功能缺陷而是与现代Windows环境的隐式冲突。以下是我在三个不同客户现场踩过的坑按发生频率排序4.1 现象Ch04_Processes\JobObjectTest.exe运行后立即弹出UAC提示框即使以管理员身份运行原因工程中CreateJobObject后调用了AssignProcessToJobObject(hJob, GetCurrentProcess())而Windows 10 20H1版本对Job Object的JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE标志做了安全加固——当父进程即当前cmd窗口关闭时系统会强制终止所有子进程这被UAC视为潜在恶意行为。解决注释掉SetInformationJobObject中设置该标志的代码段main.cpp第215行附近或改用JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION替代。4.2 现象Ch12_IO\OverlappedIO.exe -t 3完成端口测试在Win10 21H2上CPU 100%但无任何输出原因完成端口IOCP的GetQueuedCompletionStatus在某些Windows更新后对INFINITE超时值的处理存在微秒级偏差导致线程陷入假死。书中代码使用INFINITE作为第三个参数但现代系统建议显式指定10001秒。解决将GetQueuedCompletionStatus(hIOCP, bytes, key, overlapped, INFINITE)改为GetQueuedCompletionStatus(hIOCP, bytes, key, overlapped, 1000)并在返回FALSE且GetLastError() WAIT_TIMEOUT时主动continue。4.3 现象Ch18_DLLs\DelayLoadTest.exe在VS2019调试模式下崩溃错误码0xC0000005原因延迟加载DLL的__delayLoadHelper2函数在VS2019的增量链接/INCREMENTAL模式下会因PDB符号重定位失败而跳转到非法地址。这不是代码bug是链接器特性冲突。解决项目属性 → “链接器” → “常规” → “启用增量链接” → 设为否(/INCREMENTAL:NO)。这是微软官方文档明确指出的已知限制。4.4 现象Ch21_Security\TokenTest.exe无法获取当前进程的完整令牌OpenProcessToken返回ERROR_ACCESS_DENIED原因Windows 10 1809默认禁用SeDebugPrivilege特权而TokenTest需要此特权才能打开其他进程令牌。书中代码假设该特权已启用但现代系统需手动提升。解决在main()开头添加特权提升代码参考Common\SecurityPrivilege.h中的EnablePrivilege函数调用AdjustTokenPrivileges启用SE_DEBUG_NAME。4.5 现象所有工程在x64配置下编译成功但运行时报错The application was unable to start correctly (0xc000007b)原因源码包中Common\Debug.h使用了OutputDebugStringW而VS2019 x64默认CRT链接方式为/MDd动态链接调试版但某些Windows SDK版本的ucrtbased.dll与vcruntimed.dll存在符号冲突。解决项目属性 → “C/C” → “代码生成” → “运行时库” → 改为多线程调试DLL (/MDd)确保与SDK匹配或更稳妥地改为多线程调试 (/MTd)静态链接避免DLL版本冲突。5. 进阶技巧用WinDbg逆向验证书中“线程局部存储TLS”章节的底层实现书中第6章讲TLS时提到“TlsAlloc返回的索引值在整个进程地址空间内唯一但每个线程拥有独立的存储槽”。这句话很抽象直到我用WinDbg在Ch06_TLS\TLSTest.exe上做了一次内存快照对比才真正看懂Windows如何实现它。5.1 TLS槽位与线程环境块TEB的映射关系首先用WinDbg附加到TLSTest.exe运行TLSTest.exe -t 1启动单线程测试# 启动WinDbgFile → Attach to a Process → 选择TLSTest.exe 0:000 !teb TEB at 0000003ae97ff000 ExceptionList: 0000000000000000 StackBase: 0000003ae982f000 StackLimit: 0000003ae97fe000 SubSystemTib: 0000000000000000 FiberData: 0000000000001e00 ArbitraryUserPointer: 0000000000000000 Self: 0000003ae97ff000 ← TEB起始地址关键字段是Self它指向当前线程的TEB结构。而TLS槽位就存放在TEB偏移0x2cx64或0x14x86处的数组中。我们查看TlsAlloc返回的索引0对应的值0:000 dq 0000003ae97ff0000x2c L1 0000003ae97ff02c 0000000000000000 ← 初始为空然后在代码中调用TlsSetValue(0, (LPVOID)0x12345678)再执行0:000 dq 0000003ae97ff0000x2c L1 0000003ae97ff02c 0000000012345678 ← 值已写入这证实了TLS值确实存储在TEB中且每个线程的TEB地址不同因此天然隔离。5.2 多线程TLS槽位冲突验证为什么索引值全局唯一启动TLSTest.exe -t 2创建两个线程在WinDbg中用~* kb列出所有线程0:000 ~* kb 0 Id: 2b10.2b14 Suspend: 1 Teb: 0000003ae97ff000 Unfrozen # Child-SP RetAddr Call Site 00 0000003ae982e9a8 00007ffae4b51118 ntdll!NtWaitForSingleObject0x14 ... 1 Id: 2b10.2b18 Suspend: 1 Teb: 0000003ae982f000 Unfrozen # Child-SP RetAddr Call Site 00 0000003ae985e9a8 00007ffae4b51118 ntdll!NtWaitForSingleObject0x14注意两个线程的TEB地址0000003ae97ff000和0000003ae982f000。现在分别查看它们的TLS槽位0# 线程0的TEB 0:000 dq 0000003ae97ff0000x2c L1 0000003ae97ff02c 0000000011111111 ← 线程0设的值 # 线程1的TEB 0:000 dq 0000003ae982f0000x2c L1 0000003ae982f02c 0000000022222222 ← 线程1设的值两个线程对同一个TLS索引0写入不同值互不影响。这解释了书中强调的“索引全局唯一值线程私有”——索引只是TEB中数组的下标而每个线程有自己的TEB自然不会冲突。5.3 一个血泪经验TLS析构函数的执行时机玄学书中提到TLS可以注册析构函数TlsSetValue配合DllMain的DLL_THREAD_DETACH但没说清当主线程退出时TLS析构函数是否执行实测答案是否定的。Ch06_TLS\TLSTest.exe中注册的析构函数只在_beginthreadex创建的线程退出时触发主线程ExitProcess会直接销毁TEB跳过析构。这导致很多开发者以为内存泄漏了其实是预期行为。我的补救方案是在主线程退出前手动遍历所有TLS索引并调用析构函数需维护索引列表或者——更推荐——放弃TLS析构改用std::thread_localC11它的析构时机由标准明确规定。从那以后我每次分析TLS相关问题都强制走一遍WinDbg内存快照流程先!teb定位TEB再dq TEB0x2c L10看前10个槽位最后用!handle确认句柄是否泄露。这套动作成了我的肌肉记忆比读十遍书都管用。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Loushang AI SDK深入解析:流式输出、工具调用、Reasoning与结构化输出完整指南

Loushang AI SDK深入解析:流式输出、工具调用、Reasoning与结构化输出完整指南

【免费下载链接】loushang AI-native agent harness for coding workflows by python: multi-model LLM orchestration, stateful sessions, tool governance, traceable delivery, and provider routing for GPT, Claude, DeepSeek, Qwen, Kimi, GLM, and MiniMax. 项目地址&a…

2026/10/11 10:12:03 阅读更多 →
奇迹MU 1.03H+ 单机架设完全指南:服务端配置与数据库还原实战

奇迹MU 1.03H+ 单机架设完全指南:服务端配置与数据库还原实战

简介:《奇迹架设 1.03H单机版》是一份面向奇迹私服爱好者的服务端资料整合包,专门帮助玩家在个人电脑上搭建经典奇迹1.03H版本的私人游戏服务器。该版本源自二〇〇一年韩国大型多人在线角色扮演游戏“奇迹”,包含新地图、新怪物、新装备以及平…

2026/10/11 10:12:03 阅读更多 →
IOP一致性测试实战:跨系统互操作性验证与工程化落地

IOP一致性测试实战:跨系统互操作性验证与工程化落地

1. 项目背景与核心问题拆解1.1 什么是 IOP 一致性测试IOP,全称 Interoperability,中文一般叫互操作性。一致性测试则是验证某个实现是否符合既定规范的过程。把这两个词拼在一起,IOP 一致性测试的核心目标就一句话:确认两个或多个…

2026/10/11 10:11:02 阅读更多 →

最新新闻

头歌MySQL实训全关卡答案解析与避坑指南

头歌MySQL实训全关卡答案解析与避坑指南

简介:这是一份头歌MySQL数据库实训的答案整理文档,面向正在完成头歌平台实训作业的学生,也适合需要系统回顾MySQL核心操作的初学者。文档以PDF格式提供,共1个文件,压缩包大小433KB,配有目录结构&#xff0c…

2026/10/12 0:30:14 阅读更多 →
OpenClaw 下一代 AI 助手框架:让 AI 拥有记忆和工具,TaoToken 统一 Key 接入实战

OpenClaw 下一代 AI 助手框架:让 AI 拥有记忆和工具,TaoToken 统一 Key 接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 0:30:14 阅读更多 →
身份证识别OCR实战:从图像预处理到字段解析的完整流程

身份证识别OCR实战:从图像预处理到字段解析的完整流程

简介:这是一份面向图像识别与OCR入门者的身份证识别项目实践资源,聚焦从身份证图片中自动提取身份证号及其他字段的完整实现。项目基于百度开源的PaddleOCR,针对中文识别效果做了优化,并编译了Windows可执行版本,可通过…

2026/10/12 0:30:14 阅读更多 →
Hyperf 中使用 Elasticsearch:协程化客户端封装与连接池实战指南

Hyperf 中使用 Elasticsearch:协程化客户端封装与连接池实战指南

后端Web框架微服务RPC框架异步编程 【免费下载链接】hyperf 🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease. 项目地址: https://gitcode.com/hyperf/hyperf 点击查看 免费下载 …

2026/10/12 0:30:14 阅读更多 →
指针仪表检测数据集实战:1000张图与三种标签格式的YOLO训练指南

指针仪表检测数据集实战:1000张图与三种标签格式的YOLO训练指南

简介:这份YOLO指针仪表目标检测数据集面向计算机、电子信息工程、数学等专业的学生与算法初学者,可用于课程设计、期末大作业和毕业设计中的目标检测训练与验证任务。压缩包共2000个文件,约20.25MB,包含1000张指针仪表图片&#x…

2026/10/12 0:30:14 阅读更多 →
基于深度学习的智慧教室:专注度分析与作弊检测实战

基于深度学习的智慧教室:专注度分析与作弊检测实战

简介:这份资源是面向计算机相关专业学生与项目实战学习者的智慧教室系统源码,核心围绕基于深度学习的课堂专注度分析与考试作弊检测两大功能展开,可作为毕业设计、课程设计或期末大作业的完整参考方案。压缩包共626个文件,约87.73…

2026/10/12 0:29:13 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →