news 2026/9/9 10:34:57

双击exe后发生了什么?从PE格式到DLL加载全流程解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
双击exe后发生了什么?从PE格式到DLL加载全流程解析

你双击一个exe,屏幕闪了一下,程序窗口出来了。整个过程快得你根本来不及反应,但就在这零点几秒里,操作系统做的事远比大多数人想象得多。这篇我就把“双击exe之后到底发生了什么”这件事从头到尾掰开讲清楚,顺便把和exe有关的那些高频问题——入口点报错、DLL缺失、打包失败、反编译、甚至麒麟系统下能不能跑exe——全部串起来说一遍。不管你是普通用户,还是写过几年代码的程序员,读完之后你再去双击任何一个exe,心态都会不一样。

1. 双击的一瞬间:谁在背后接住你的鼠标

1.1 双击这个动作,系统到底接收到的是什么

先别看双击之后程序怎么跑起来的,单看“双击”这两个字本身。

鼠标双击在Windows里是一个完整的输入事件序列:按下、抬起、按下、抬起,且两次点击之间的间隔和位移都要在系统设定的阈值范围内。这个事件首先被鼠标驱动变成硬件中断,经过系统内核的输入堆栈,最终交给图形界面层的窗口管理器。也就是说,你双击的那个桌面图标,背后其实是一个窗口消息的处理过程。

但这个事件不是发给图标本身的,而是发给承载图标的进程——资源管理器explorer.exe。explorer收到WM_LBUTTONDBLCLK消息后,会根据你点中的对象类型走不同的分支:

  • 如果双击的是桌面快捷方式(.lnk),explorer读取lnk文件里的目标路径、工作目录、参数和启动方式;
  • 如果双击的是exe文件本体,explorer直接提取这个exe的完整路径;
  • 如果双击的是程序关联的文档(比如.docx),explorer再去查注册表里“.docx”对应的ProgID,找到关联的启动程序。

无论哪种情况,最终都会调用Windows提供的一个关键API——ShellExecuteExW。这个函数负责把“路径”变成“进程”,里面还牵扯到文件关联、权限提升请求、应用程序感知设置等一堆判断逻辑。

多说一句,这个过程和你在命令提示符里敲notepad.exe回车还是有区别的。命令行启动相对更“裸”,直接调用CreateProcess;而双击走的ShellExecute则是Shell层级的全套流程,这也是为什么很多软件双击和命令行运行表现不一样——工作目录、环境变量继承、权限,都有可能不同。

1.2 exe是什么:不是所有exe都长一个样

再往下,我们必须先搞清楚exe这个文件格式本身。

exe是Windows平台下可执行文件的通用扩展名,底层格式叫PE(Portable Executable,可移植可执行文件)。这个格式最早来自Unix的COFF格式,微软在Windows NT时代做了大量扩展,后来一直沿用至今。

一个典型的PE文件,结构上大致分这么几块:

  • DOS头(MZ头),开头两个字节是“MZ”,用来让老掉牙的DOS系统能识别这是个DOS程序,同时里面藏着一个字段e_lfanew,指向真正的PE头位置;
  • PE头,里面记录了文件类型、机器架构、节区数量、时间戳、可选头大小等;
  • 可选头,虽然叫“可选”,但每个PE文件都要有。它包含程序入口点地址(AddressOfEntryPoint)、镜像基址、节区对齐、子系统类型(是窗口程序还是控制台程序)、DLL特性等关键信息;
  • 节区表,描述每个节(Section)的属性;
  • 各个节区本体,比如存放代码的.text、存放全局变量的.data、存放只读数据的.rdata、存放图标/对话框/版本信息的.rsrc等。

也就是说,exe并不只是“一堆机器码”,它是一套有完整结构的容器。操作系统加载exe的过程,本质上就是解析这套容器、把里面的代码和数据按指定方式映射到内存的过程。

这里有个容易忽略的点:Windows会根据PE头里的机器类型来识别这个exe是32位还是64位。64位系统可以运行32位exe是因为有WOW64兼容层;反过来,32位系统不能运行64位exe,系统直接提示“不是有效的Win32应用程序”。另外,ARM版Windows运行x86/x64程序,也需要额外的模拟层。很多时候你的exe双击打不开,问题就出在这个“子系统”和“架构”不匹配上。

2. 双击之后:进程是怎么一点点“活”起来的

2.1 加载器:像拆迁队一样有条不紊

ShellExecuteExW最终会调用NtCreateUserProcess进入内核态,但真正负责“把exe文件变成进程”的,是Windows的映像加载器(Image Loader)。

加载器的工作流程大致是:

  1. 打开exe文件,先读DOS头,确认MZ标志,通过e_lfanew找到PE头;
  2. 校验PE签名,检查机器类型、节区数量和文件大小是否合理;
  3. 根据PE头里的信息,在进程地址空间里保留一块虚拟内存区域,把exe文件的内容按节区映射进去;
  4. 解析导入表(Import Table),找到这个exe依赖的DLL列表;
  5. 逐个加载依赖的DLL,并且递归解析DLL自身的依赖,一直把所有依赖关系全部装完;
  6. 执行各种重定位操作,修正地址;
  7. 设置线程环境块(TEB)和进程环境块(PEB),把命令行参数、环境变量这些信息填进去;
  8. 找到入口点地址,让新线程从这个地址开始执行。

听起来很流畅对吧?但这一步是大量exe“双击没反应”或者“双击报错”的重灾区。其中第5步“加载依赖DLL”又是重灾区里的重灾区——缺一个DLL、DLL版本不对、DLL位数不匹配,全都会卡在这一步。

2.2 导入表:exe不是一个人在战斗

很多人以为exe是一个自给自足的文件,里面什么都有。错。

你见到的绝大多数exe,只包含了自己的那一部分代码,操作系统提供的功能全部通过DLL来完成。比如读写文件的kernel32.dll、创建窗口的user32.dll、绘制界面的gdi32.dll、网络相关的ws2_32.dll,等等。这些系统DLL为exe提供了“系统调用”的入口。

exe文件里有一张导入表(IAT,Import Address Table),它记录了这个程序需要从哪些DLL里导入哪些函数。加载器读取这张表之后,会去对应DLL中查找函数地址,然后把地址填到exe内存中的相应位置。程序运行到调用某个系统函数时,实际上是跳转到DLL里的代码去执行的。

这种设计有个巨大的好处:多个exe可以共享同一个DLL的内存副本,不需要每个exe都内置一份系统代码,从而大幅节省内存和磁盘空间。Windows系统目录下的DLL文件更新一下,所有用它的程序就都能享受到更新,不必重新编译。坏处就是你懂的——DLL地狱。一个程序在你机器上能跑,换台机器跑不了,大概率就是DLL环境不一样。

此外还有静态链接的概念。如果程序把所有库代码直接编进exe里,那它运行时就不再依赖对应的外部DLL,文件体积会显著变大,但兼容性也会更好。这也是后面讲“绿色软件”时很重要的一个思路。

2.3 入口点:Main函数之前还有一段路

从加载器跳到入口点地址的那一刻起,程序才算真正开始执行代码。但注意,这个入口点并不是你写的main()WinMain(),而是编译器帮你安插的一段启动代码,通常叫CRTStartup或者类似的名字。

这段启动代码干的活非常多:

  • 解析命令行参数,设置argc/argv;
  • 初始化C运行时库(CRT),包括堆管理器、标准输入输出、errno等;
  • 执行所有全局对象和静态对象的构造函数(C++里那些全局类的实例,就是在这里初始化);
  • 注册atexit退出函数;
  • 最后才是调用你写的main/WinMain。

等到你的main函数return之后,启动代码还会接管返回值,调用退出函数、执行全局析构、清理资源,再通知系统线程退出。

这也是为什么你写C++代码时,全局变量构造顺序问题那么难排查——它们全发生在main之前,你根本没法用断点挡住。

3. 同样是exe,包装方案天差地别

3.1 PyInstaller打包的exe:启动慢、体积大都是因为这个

热词里有一堆“python转exe、pyinstaller打包exe”,可见Python开发者打包exe的需求有多旺盛。

用PyInstaller打包出来的exe,原理和原生C/C++编译的exe完全不一样。PyInstaller会把你的.py文件编译成字节码(pyc),然后把这些字节码和Python解释器(python3xx.dll)、你安装的第三方库全部塞进exe里。运行时,exe里的引导程序(bootloader)会先把这些数据解压到一个临时目录(比如C:\Users\xxx\AppData\Local\Temp\_MEIxxxxxx),然后启动内置的Python解释器去执行你的字节码。

所以你会看到:

  • 打包出来的exe体积非常大——一个“Hello World”程序都能有十几MB甚至几十MB,因为整个Python运行时都塞进去了;
  • 启动速度相比纯C编写的exe慢很多——它要先解压文件、加载解释器;
  • 杀毒软件容易误报——因为它在临时目录里释放文件并执行代码,这个行为模式跟很多木马很像;
  • 程序退出后临时目录会被清理,但如果你强制杀进程,临时目录可能残留。

PyInstaller的--onefile模式就是把所有东西打包成单个exe,启动最慢;--onedir模式是把目录给你,相对启动快一点。如果你的程序对启动速度要求很高,可以考虑用Nuitka把Python代码编译成C再编译成exe,但配置复杂度会上一个台阶。

3.2 Java、Electron、GraalVM:那些“看着像exe”的exe

和Python一样,Java项目要变成exe,通常不是“编译成原生机器码”,而是用一个启动器(launcher)包一层。像exe4j、launch4j,本质是一个用C/C++写的小型引导程序,它负责找到系统上安装的JRE或JDK,再用Java命令去启动你的jar包。也就是说,这种exe只是“壳”,真正的业务逻辑还在jar里。

GraalVM走的是另外一条路:用Native Image技术,把Java字节码提前编译(AOT)成真正的原生可执行文件,运行时不再需要JVM。这样的exe启动快、内存占用低,但编译时间长、反射和动态代理支持需要额外配置。据我测试,一个普通的Spring Boot程序用GraalVM编译后,启动时间能从两三秒降到一两百毫秒,代价是构建难度翻倍。

Electron应用(代表就是VS Code)打包出的exe又是另一套逻辑:exe里面塞了一个Chromium内核和Node.js运行时,本质上就是“浏览器 + 网页程序”的组合。所以你用VS Code这种东西,会觉得每次启动都像开一个浏览器,内存吃掉几百MB都不奇怪。这也是为什么现在很多人转向Tauri,让Web前端直接调用系统WebView,打包体积能从几十MB降到几MB。

说句题外话,热词里有个“网页版程序打包成exe”,其实和Electron思路一样,就是把网页套进一个壳里,本质上还是浏览器在渲染,不是真的把HTML转成了机器码。

3.3 BAT转exe、exe转apk:哪些是真需求,哪些是伪需求

“bat to exe converter”也是个老话题。批处理文件转exe,逻辑上只是把一个文本脚本包到一个exe容器里,运行时调用cmd.exe去执行里面的脚本。这种转换本身没有把脚本编译成机器码,安全性也几乎没有提升。

有意思的是,很多人转bat成exe是为了“隐藏源代码”或者“让用户无法修改”。但事实上,市面上常见的bat-to-exe工具做出来的exe,只要用资源查看工具甚至直接拉到十六进制编辑器里找,多数能把里面的批处理内容捞出来。就算加密了,也抵不住临时目录监控——因为它终究要落盘或者通过管道喂给cmd执行。

至于“exe转apk安卓版”,这个基本可以判定为伪需求。exe是Windows的可执行文件,apk是Android的安装包,两者指令集、系统API、运行模型都完全不同,没有“转换”这回事。你能做的是重新写一个安卓版本,或者用跨平台框架(如Flutter、React Native)写一套代码同时打包两边的应用。市面上那些声称“exe转apk”的在线工具,基本都是噱头,要么是让你上传后人工帮你重写,要么就是骗下载量。

同理,“exe直接拿到银河麒麟系统上运行”也不行。这个我在第5章展开讲。

4. 双击之外:安装包、权限、环境和那些看不见的坑

4.1 MSI和EXE:同样是安装程序,差别在哪

热词里有个“怎么看软件是msi还是exe安装的”,这个其实问的是Windows下两种常见安装包形态的区别。

exe安装包是最常见的,由开发者用InstallShield、NSIS、Inno Setup这类工具制作。它是一个自解压+引导过程:运行后先释放临时文件,展示安装界面,然后把文件复制到Program Files、写注册表、创建开始菜单快捷方式。因为逻辑完全自定义,exe安装包“想干什么都行”,自由度极大,但也正因为自由,里面可以夹带私货——捆绑安装、修改浏览器主页,全是exe安装包的重灾区。

msi是Windows Installer专用的安装包格式,本质是一个数据库文件,里面的内容按照Windows安装服务规定的规则组织。它最大的特点是“事务性”:安装到一半失败,系统能回滚到之前的状态;支持按用户安装或按机器安装;支持广告式安装(点一下菜单,系统自动去装);卸载时也走统一流程,相对干净。微软自家的Office、Visual Studio的许多组件,用的都是msi。

区分两者很简单:右键看文件属性,类型一栏写“应用程序”的是exe,写“Windows Installer 程序包”的是msi;或者看图标,msi通常是那个盒子加一张纸的图标。但也不要刻板——现在很多安装包是exe包裹msi,先跑exe引导程序,里面再调起msi。

4.2 UAC、管理员权限与“双击后毫无反应”

有些exe双击之后没反应,任务管理器里一闪而过,一个典型原因就是权限不够。

Windows有一个叫UAC(用户账户控制)的机制。exe文件的清单(Manifest)里有个字段requestedExecutionLevel,有三种值:

  • asInvoker:以当前用户的权限运行,不弹UAC;
  • requireAdministrator:要求管理员权限,触发UAC弹窗;
  • highestAvailable:以当前用户可获得的最高权限运行。

如果一个需要管理员权限的程序,你双击后UAC弹窗被你点了“否”,程序直接退出,看起来就像“没反应”。还有种情况是程序以管理员权限运行,但你当前用户压根不在管理员组,系统直接拒绝。另外,exe如果放在桌面上双击和放在C:\Windows\system32下双击,行为也可能有差异——系统目录受保护,常规用户根本没写权限,程序如果尝试往自己所在目录写文件,就会失败。

所以“双击没反应”的第一排查思路不是怀疑exe坏了,而是先用管理员身份试试,再看事件查看器里的应用程序日志。

4.3 修改exe图标、VSCode里生成exe的真相

热词里还有“qt改exe图标代码”和“vscode保存exe”。

Qt程序的exe图标,是在编译链接阶段通过.rc资源文件嵌入的。.rc文件里写一行IDI_ICON1 ICON "app.ico",再在.pro或CMake中引用这个rc文件,编译出来的exe图标就会变成你指定的样子。如果你已经有编译好的exe但想改图标,就需要用工具直接改PE资源段,比如rcedit、Resource Hacker,或者Linux下的wrestool。这类工具的原理是定位到.rsrc节区里的图标资源,把里面的图标数据替换掉再重新计算校验。

而“vscode保存exe”这个说法,其实是把概念混了。VSCode是代码编辑器,它本身不负责编译。你写好的C/C++代码,要先用gcc、g++、MSVC或者CMake工具链编译链接,才会生成exe。VSCode里配置好tasks.json,能做到“按Ctrl+Shift+B就帮我调用编译器输出exe”,但这个exe是编译器生成的,不是VSCode“保存”出来的。如果你在VSCode里点了保存,结果文件就是.exe,那八成是你把语言的源码文件直接命名为xxx.exe了——里面存的是纯文本,根本不是可执行文件,双击必报错。

5. 双击之后“坏掉了”:常见问题排查实录

5.1 “无法定位程序输入点setthreaddescription于动态链接库”怎么解

热词里这个报错很有代表性:“解压出来的exe文件无法找到入口,说无法定位程序输入点setthreaddescription于动态链接库”。

这个报错说明程序在加载阶段,想从一个DLL里调用SetThreadDescription这个函数,但系统里那个DLL没有导出这个函数。SetThreadDescription是Windows 10 1607版本才引入的API,它位于kernel32.dll或kernelbase.dll里。如果你的系统还是Windows 7或者更老的Windows 10版本,自然找不到这个入口点。

这种问题常见于三种场景:

  • 软件版本太新,官方放弃了旧系统支持,你还在用老系统硬跑;
  • exe是从别的电脑直接拷过来的,而那台电脑的操作系统比你新;
  • DLL文件被第三方工具或恶意软件替换成了旧版本。

解决办法分等级:先把系统更新到最新补丁;如果还不行,升级到新版本操作系统;实在不能换系统,只能找该软件的旧版本。网上那些“下载一个kernel32.dll丢进系统目录”的操作,强烈不建议,很容易把系统搞坏。

顺便说一句,这种“找不到入口点”和“找不到DLL”是两种报错。“找不到入口点”说明DLL找到了但里面没有那个函数;“找不到DLL”则是文件本身没找到。排查方向完全不一样。

5.2 缺DLL、运行库缺失:最熟悉的陌生人vcruntime140.dll

另一种高频报错是“由于找不到vcruntime140.dll,无法继续执行代码”。

这个DLL属于Visual C++ Redistributable运行库。很多C++程序是用Visual Studio编译的,编译器会默认让程序去依赖一个叫Universal C Runtime的组件。这个组件不是Windows系统自带的(或者版本不够新),所以程序跑不起来。

解决办法不是去网上下载单个DLL扔到System32里,而是去微软官网下载对应版本的“Visual C++ Redistributable”安装包,把整个运行库装上。32位程序需要装x86版本,64位程序需要装x64版本,有的程序同时依赖两种,干脆两个都装。这个运行库是允许分发和重复安装的,装完基本就缓解了大部分“缺DLL”问题。

另一个思路是编译时静态链接CRT,这样生成出来的exe体积会大一些,但不再需要目标机器装运行库。很多免安装工具、绿色软件就是这么做的。

5.3 双击闪退、进程立即退出:先用事件查看器找证据

如果你的exe双击后窗口一闪就没了,不要凭感觉猜。Windows自带的事件查看器(eventvwr.msc)里,Windows日志 -> 应用程序,会记录程序报错信息。找到来源为“Application Error”的错误事件,里面会有崩溃模块名称、异常代码、偏移地址。这些信息能帮你判断是哪个DLL出问题、是哪类异常。

异常代码也值得记一下:

  • 0xC0000005:访问违规,程序读写内存超出权限;
  • 0xC0000135:加载DLL失败;
  • 0xC0000139:找不到入口点;
  • 0xE0434352:.NET运行时异常,托管代码崩了。

如果你看到的是.NET相关的崩溃,先确认目标机器有没有装对应版本的.NET运行时,以及程序的.config文件里声明的版本是否和已装版本匹配。

5.4 杀毒软件误报和SmartScreen拦截

PyInstaller、AutoIt打包的程序、以及很多加了壳的exe,双击时经常被SmartScreen或杀毒软件拦下来,提示“Windows已保护你的电脑”。

先分辨这是真威胁还是误报。看文件来源:如果你自己打包的exe,或者从正规官网下载的exe,大概率是误报;如果你从一个弹窗广告里下了个exe,那还是多长个心眼。

正规软件厂商会花钱购买代码签名证书,给exe做数字签名。签名的作用是证明“文件发行方的身份”以及“文件没有被篡改过”。在文件属性 -> 数字签名里能看到签名人信息。有签名的exE,SmartScreen拦截率会大幅降低。个人开发者也一样,搞一个OV代码签名证书,ewe打包的exe就没那么多误报了。

至于加壳工具,加壳的目的是压缩和隐藏真实代码。但壳的特征本身就会触发杀软的“启发式查杀”,因为病毒也爱加壳。如果你的exe被误报,最好在杀毒软件里添加信任,而不是关了杀毒软件裸奔。

5.5 银河麒麟系统能不能装exe:跨平台的那条路

热词里连续出现“银河麒麟系统怎么安装exe软件”“麒麟系统如何装exe软件”。这个问题不能说“装不了”就完事,要看具体场景。

银河麒麟系统的桌面版本基于Linux内核,普通exe是Windows的PE格式,Linux内核无法原生识别和执行。要在麒麟系统上运行exe,常见方案有这么几个:

  • Wine:一个兼容层,把Windows API调用翻译成Linux系统调用。装上Wine之后,部分exe是可以直接双击运行的。但Wine的兼容性因人而异,Office这类大型软件往往问题很多;
  • 虚拟机:在麒麟系统里装VirtualBox或VMware,再装一个Windows虚拟机,在虚拟机里运行exe。兼容性最好,但资源开销大;
  • 寻找Linux原生替代版:很多软件在官网同时提供Linux版本,比如WPS、QQ、钉钉,直接用Linux版体验要好得多。

我的建议是:先在麒麟系统里搜一下有没有原生Linux版软件,没有再看Wine,实在不行才上虚拟机。别指望一个exe在Linux下双击就跑起来,这个前提不成立。

6. 反编译:从exe“看到源码”到底可不可行

6.1 反编译出来的东西取决于开发语言

“exe反编译看到源码”是技术圈经久不衰的话题。答案很看情况。

如果是C/C++直接编译的exe,反编译出来是汇编代码,不是源代码。IDA Pro、Ghidra这类工具能帮你还原出伪代码,但离原始源码还差得很远——变量名、注释、类型信息基本都丢了,优化过的代码阅读难度极大。

如果是C#/.NET编写的exe,情况就完全不同了。.NET编译出来的不是机器码,而是IL中间语言,元数据里保留了大量信息。用dnSpy或ILSpy打开,还原出来的代码几乎跟源码一样,类名、方法名、字符串常量全都清晰可见。这就是为什么很多人强调“不要把敏感逻辑写进C#客户端”——它等于把代码送给了反编译者。

如果是Python打包成的exe,PyInstaller包里的pyc可以用pycdc、uncompyle6等工具反编译成接近的Python源码。但前提是没有加壳、没有用Cython保护。很多人就是靠这个方式把别人的小工具逆向成了源码,所以不要觉得“打成exe就安全了”。

6.2 分析exe的常驻操作:先从静态资源下手

不一定要用重型反汇编工具,很多信息用轻量工具就能看到。

先用Resource Hacker或类似工具看看exe的资源段,里面可能藏着图标、版本信息、位图、对话框模板、字符串表。字符串往往是信息量最大的地方:路径、URL、注册表键名、加密密钥样本,全都有可能出现在里面。

再用dumpbin或者Ghidra看一眼导入表,它能告诉你这个程序依赖哪些DLL和API函数。比如一个程序突然想调InternetOpenUrlURLDownloadToFile,你就该警觉它是不是会联网下载东西。

动态分析是另一个维度:在隔离环境(比如虚拟机)里运行exe,用Process Monitor监控它创建了哪些文件、改了哪些注册表、启动了哪些进程。Process Explorer和Wireshark能进一步看进程内部和网络行为。这套流程无论是排查自己的软件还是分析来路不明的exe,都非常实用。

最后提醒一句:反编译别人商业软件的源码,用于破解、二次分发,涉及法律问题。但你自己写的程序忘了源码、或者想搞明白某个老软件为什么会闪退,这些场景下手分析是完全正当的。

我个人在实际操作中养成了一个习惯:拿到任何一个来历不明的exe,绝不先双击,而是右键看一眼属性——数字签名有没有、文件版本是多少、原始文件名是什么。如果它有正常的签名和版本信息,风险就小很多;如果属性里什么都没有,或者是一个几十KB的“小不点”却说自己是安装包,那就要格外留神。你双击的从来不只是那个文件,而是它背后一串看不见的加载、解析和执行流程。搞明白这串流程之后,遇到exe报错你就不会再“瞎试”了——先看架构,再看依赖,然后查事件日志,按着这个顺序来,十有八九能快速定位问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 10:33:00

CameraQRCode工程拆解:Android扫码从相机适配到解码器选型

简介:这是一份基于C#实现的二维码综合应用示例项目,面向需要快速掌握二维码生成、解析及摄像头实时识别的中初级开发者。项目围绕ZXing.Net与AForge.NET展开,演示了如何通过BarcodeWriter生成二维码、BarcodeReader解析图像,并结合…

作者头像 李华
网站建设 2026/9/9 10:32:54

magnitude不是CLI命令,而是本地AI推理协议标准

1. “magnitude”不是命令行工具,而是本地AI推理服务的隐性枢纽最近在多个技术社区和开发者群聊里,频繁看到有人发问:“magnitude命令找不到”“unable to locate the magnitude binary”“magnitude cli install失败”,甚至有人把…

作者头像 李华
网站建设 2026/9/9 10:31:41

OpenClaw本地部署实战:Docker接入DeepSeek等国内大模型全攻略

OpenClaw最近的讨论热度一直在线,尤其是“本地部署”和“接国内大模型”这两个方向,大家问得最多。我自己把OpenClaw用Docker跑起来,再把DeepSeek这类国内模型接进去,前后折腾了一整天,踩了不少坑,也把整个…

作者头像 李华
网站建设 2026/9/9 10:31:28

ruflo是幻觉关键词:Claude Code与Codex真实部署指南

1. “ruflo”不是工具名,而是当前AI开发圈一个被误传的“幽灵关键词” 最近在多个技术社区、GitHub Issues、VS Code插件讨论区甚至私聊群组里,频繁看到有人提问:“ruflo怎么安装?”“ruflo和Claude Code冲突吗?”“ru…

作者头像 李华
网站建设 2026/9/9 10:31:15

ARM平台也能改BIOS隐藏项?gsetupmod双架构工具解析

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

作者头像 李华
网站建设 2026/9/9 10:30:33

手把手学Linux设备驱动开发:内核机制与实战指南

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

作者头像 李华