☰
Windows 10 下 DependenciesGui 依赖分析环境配置与 DLL 缺失排查
2026/10/27 22:36:05 网站建设 项目流程

简介:DependenciesGui-windows10-depends 是面向 Windows 10 用户的依赖关系分析工具包,适合需要排查程序加载失败、定位缺失 DLL 或梳理可执行文件组件依赖的普通用户与开发者。解压后可获得 Releasex64 目录及图形化主程序,借助直观界面加载待分析文件,查看依赖项及其版本、路径等信息,并可用于了解应用程序打包部署所需的组件构成。压缩包共 35 个文件,包含 12 个 dll 动态库、4 个 exe 可执行程序、13 个 pdb 调试符号、4 个 config 配置文件和 2 个 xml 文档,整体约 1.78MB,体积轻便,便于本地留存和随取随用。已有 690 人学习或下载,说明其在依赖诊断场景中具有一定参考价值。对于希望快速上手依赖检查、理解 DLL 与驱动程序关联关系,并积累排错思路的读者,这份工具包提供了可直接运行的图形界面与配套组件,能作为日常开发调试和系统问题定位的辅助材料。

1. depends 工具的坑,多半不在工具本身

上周排查一个自研 exe 在 Windows 10 上双击报「无法启动此程序,因为计算机中丢失 xxx.dll」的问题。我第一反应是用老牌 depends 工具依赖分析器看导入表,结果那玩意儿在高版本系统上打开就卡死,进程直接无响应。后来换成 DependenciesGui,解压、双击、拖进文件,三秒钟树状图就出来了,问题定位到一个 32 位进程里混进了 64 位 DLL。这类事很常见:下载「DependenciesGui-windows10-depends」这套包的人,十个里有八个第一关其实卡在环境——解压不完整、缺 VC++ 运行库、Qt 插件目录被安全软件清掉,工具还没开始干活就先挂了。它适合所有需要在 Windows 10 上排查 DLL 缺失、版本冲突、位数不匹配的开发者和运维;不适合想把它当纯绿色单文件 exe 到处拷贝的人。

2. 环境先列清:x64 包、x86 包和那个绕不开的运行库

在 Windows 10 上装 DependenciesGui,失败率最高的一步不是解压,而是「以为解压完就完事了」。这个工具是用 Qt 写的原生程序,Release 压缩包里除了主程序,还塞了一整套 Qt 运行库和平台插件。你可以把它理解成一个带行李箱的房客:exe 是房客,Qt 的 DLL 是行李,platforms目录是房门钥匙,少一样都进不去。所以动手之前,先把三件事定下来——下哪个包、运行库齐不齐、解压到哪。

2.1 DependenciesGui 与 Dependencies CLI 是同一个包里的两个 exe

很多人在下载页看到一堆压缩包就懵了,其实结构很简单:每个 Release 包解压后同时包含图形界面和命令行两个入口。图形界面叫DependenciesGui.exe,命令行叫Dependencies.exe,两者共用同一套分析核心,区别只是一个给你看树状图,一个给你吐文本或 JSON。选包时按目标文件的位数来决定,而不是按你系统的位数来决定:

场景该用的包原因
排查 64 位 exe / dll 的依赖x64 Release 包与目标模块位数一致,导入表解析最完整
排查 32 位老程序、老控件x86 Release 包x64 版打开 32 位模块会提示位数不匹配,部分导入项显示不全
需要脚本化、接入流水线任一包的Dependencies.exe支持-json输出,便于二次处理
只在自己的开发机上临时看x64 包绝大多数现代程序都是 64 位

我的习惯是两个包都留着,解压到两个平行目录,用的时候按目标位数选,别指望一个版本通吃。位数不匹配这件事很隐蔽:界面能打开、树也能出,但某些转发函数和延迟加载的导入项会显示成红色缺失,你会误以为是目标程序的问题,实际上是分析器自己看错了位数。这种误判比直接报错更麻烦,因为报错你还会怀疑一下,红色标记你直接就信了。

2.2 VC++ 运行库:先查有没有,再谈装不装

DependenciesGui 是用 MSVC 编译的,依赖 VC++ 2015-2022 的运行库。Windows 10 出厂时不一定带,尤其是精简版镜像和某些云主机镜像。装之前先花十秒确认一下,比装完再对着「找不到 vcruntime140.dll」发呆划算得多。

# 检查 x64 运行库核心文件是否存在(正常应输出 True) Test-Path "$env:SystemRoot\System32\vcruntime140.dll" Test-Path "$env:SystemRoot\System32\msvcp140.dll" # 顺带看一眼系统版本号,1809 之后的镜像基本不用管 UCRT [System.Environment]::OSVersion.Version

vcruntime140.dll是 C 运行时,msvcp140.dll是 C++ 标准库,两个缺一个都起不来。注意路径是System32,即使在 64 位系统上,64 位的运行库也确实放在System32,32 位的放在SysWOW64,这个命名反直觉但别改。如果输出False,去装 Microsoft 官方的 VC++ 2015-2022 可再发行组件包,x64 和 x86 两个架构都装上——因为你可能用 x86 包去分析 32 位程序,那时候吃的就是 x86 运行库。

早期 Windows 10 版本(1507、1607 这种)还缺 Universal C Runtime,需要额外补丁;1809 之后 UCRT 已经是系统组件,不用管。这一条我在老内网机器上踩过,装完 VC++ 还是报api-ms-win-crt-runtime-l1-1-0.dll缺失,补了系统更新才通。

注意:不要为了省事去网上随手抓一个vcruntime140.dll丢进工具目录。版本对不上会出现更诡异的加载失败,而且这种方式在合规审计里是过不去的。

2.3 解压位置:别放 Program Files,也别放中文路径

目录规划看着是小事,实际上是后面一堆玄学的源头。我一般固定解压到D:\Tools\Dependencies\x64\和D:\Tools\Dependencies\x86\,理由有三条。

第一,不要放C:\Program Files。Qt 程序加载插件时按相对路径找platforms\qwindows.dll,某些情况下会回退到当前工作目录;放在需要管理员权限的目录里,双击时被 UAC 拦一下,工作目录可能变成System32,插件就找不到了。第二,路径里别带中文和空格。老版本 Qt 对非 ASCII 路径的处理不稳,插件加载失败时给的报错还特别含糊,你根本不会往路径上想。第三,别在压缩包里直接双击运行。Windows 会给从网络下载的文件打上「来自其他计算机」的标记,从压缩软件里临时解压到%TEMP%再执行,杀软和行为监控的反应会更激烈。

解压工具也要留意:用系统自带的资源管理器解压长路径文件可能中途失败但不报错,结果就是少几个 DLL。我通常用 7-Zip 解压,解完核对文件数量,这一步后面还会讲。

3. 安装落地:从解压到界面出树,四步走完

这套工具没有安装程序,所谓「安装」其实是把文件摆对、把运行库补齐、把搜索路径配好。听起来简单,但每一步都有具体的核对动作,跳过去就会在后面的某一步翻车。下面按我实际的顺序写,你照着走一遍,正常情况十分钟内能看到第一棵树。

3.1 解压后核对目录结构,platforms目录丢了必炸

先看解压出来的目录长什么样。不同时期的 Release 包内容略有差别,但骨架是一致的:

D:\Tools\Dependencies\x64\ ├── DependenciesGui.exe # 图形界面主程序 ├── Dependencies.exe # 命令行版本,同目录 ├── Qt5Core.dll # Qt 核心库(新版包可能是 Qt6 前缀) ├── Qt5Gui.dll ├── Qt5Widgets.dll ├── platforms\ │ └── qwindows.dll # Windows 平台插件,缺了必启动失败 ├── imageformats\ # 图标格式插件,缺了界面能开但图标空白 └── styles\ # 控件样式插件

核对方法很土但有效:数一下platforms目录里有没有qwindows.dll,imageformats里有没有qico.dll、qsvg.dll之类。这两个目录是最容易被安全软件当成可疑文件删掉的,因为它们的文件名不带程序名,看着像来路不明的 DLL。我遇到过杀软只删platforms\qwindows.dll不删主程序的情况,表现就是双击 exe 弹一个英文错误框,很容易误判成「包下坏了」。

如果你是从压缩包里「按需解压」某一个 exe 出来的,那 100% 会缺文件。这套工具必须整包解压,不能挑着拿。

3.2 首次启动:让主界面正常出现,并把搜索路径配好

双击DependenciesGui.exe。正常情况下出现的窗口分三块:左边是模块树,中间是选中模块的导入/导出列表,下面是属性面板。如果窗口起来了但树是空的,那是还没打开文件,不是故障。

打开目标文件有三种方式,我按使用频率排:把 exe 或 dll 直接拖进窗口(最快)、File → Open选文件(最稳)、以及带参数从命令行启动(适合批处理里串起来)。第一次用建议走File → Open,选一个系统目录里的常见 DLL,比如C:\Windows\System32\kernel32.dll,看看树能不能正常展开。

接下来配置搜索路径,这是决定分析质量的关键一步。工具需要知道去哪里找依赖的 DLL,默认只查目标文件所在目录和系统目录,遇到第三方组件散落在别处的项目就会大量误报缺失。打开设置里的路径配置项(不同 release 的菜单文案略有差别,通常在Options或Edit下面),把项目依赖的目录加进去:

  • 目标程序自己的输出目录(bin/out)
  • 第三方库目录(比如某个 SDK 的lib\x64)
  • 打包后的安装目录(C:\Program Files\你的程序\)

每加一条就立刻重开一次目标文件看效果,别一次性加十几条再回头看。加多了以后哪条起作用、哪条是噪音,你分不清。

提示:如果只是想快速看某个单文件的依赖,不改搜索路径也能看个大概,但系统 DLL 之外的项目内依赖会大面积飘红,别急着下结论。

3.3 命令行版 depends:-modules、-imports、-json三条命令

图形界面适合人工排查,命令行适合留证据和接自动化。同一个目录下的Dependencies.exe就是命令行入口,常用参数这么用:

# 切到工具目录,避免每次都写全路径 cd D:\Tools\Dependencies\x64 # 只看直接依赖的模块列表,最常用的一条 .\Dependencies.exe -modules "C:\Program Files\某程序\app.exe" # 看导入函数明细,排查「某个函数从哪个 DLL 里来的」 .\Dependencies.exe -imports "C:\Program Files\某程序\app.exe" # 递归展开整棵依赖树,输出 JSON 便于脚本处理 .\Dependencies.exe -recursive -json "C:\Program Files\某程序\app.exe" > deps.json

-modules只列一层,速度快,适合先摸底;-recursive会一层层往下钻,遇到大程序能跑出几百上千个节点,输出量很大,所以配合-json重定向到文件更合适;-imports是查函数级来源的,比如你要确认GetProcAddress的调用方到底从哪个 DLL 拿符号,这条最直接。路径里有空格必须加引号,PowerShell 里尤其注意,不加引号会被解析成多个参数,工具会报一个看起来毫不相关的文件不存在错误。

参数集合以.\Dependencies.exe -help的实际输出为准,不同 release 之间会增删几个开关,别照着老博客抄。

4. 配置细节:让 depends 认得出系统 DLL 和第三方组件

工具能启动只是及格线,能不能给出可信的结论,取决于搜索路径、系统转发 DLL 的处理方式和显示设置。这一章讲的三件事都属于「不配也能用,配了少走弯路」的类型,但在真实项目里,它们决定了你是十分钟定位问题,还是花两小时怀疑人生。

4.1 额外搜索目录与系统转发 DLL 的处理

Windows 的System32里有一大批「转发 DLL」,比如各种api-ms-win-*.dll,它们本身没有实现,只是把调用转发到真正的实现模块。这类文件在依赖树里经常显示成缺失或者解析不全,属于正常现象,不是你程序的问题。遇到大片红色先看名字,凡是api-ms-win-、ext-ms-开头的,基本可以直接忽略。

真正要处理的是第三方依赖找不到。除了在 GUI 里加搜索目录,还可以用环境变量临时指定,适合在脚本里控制:

# 只在当前会话生效,不污染系统环境变量 $env:PATH = "D:\Projects\某图像处理Demo\bin\x64;" + $env:PATH # 然后再跑分析,让工具优先从项目输出目录找依赖 .\Dependencies.exe -modules "D:\Projects\某图像处理Demo\bin\x64\demo.exe"

把项目输出目录插到PATH最前面,工具解析依赖时会优先命中你编译出来的那批 DLL,而不是系统目录里的同名旧版本。这一招在排查「明明编译了新版但运行还是老行为」时特别好使——十有八九是加载了System32或者别的目录里的旧 DLL。

还有一个容易忽略的点:32 位版本的工具在 64 位系统上访问C:\Windows\System32会被文件系统重定向到SysWOW64。如果你要分析一个 64 位系统 DLL 的依赖,必须用 x64 版工具,否则看到的是 32 位视图,结论完全是另一回事。这个坑我在帮人看一个 shell 扩展问题时踩过,对着SysWOW64里的文件分析半天,一直奇怪为什么导入表对不上。

4.2 高 DPI 与 Qt 环境变量:界面糊成一团怎么救

在高分屏笔记本上,这套工具默认可能显示得很小或者很糊。这是 Qt 5 时代的老问题,跟工具本身的功能无关,但会影响你看树状图的心情。设两个环境变量就能改善:

# 开启自动缩放,让 Qt 跟随系统 DPI 设置 $env:QT_AUTO_SCREEN_SCALE_FACTOR = "1" # 需要手动微调时用这个,1.25 表示放大 25%,按自己屏幕试 $env:QT_SCALE_FACTOR = "1.25" # 启动插件调试模式,插件加载失败时会在控制台打出具体原因 $env:QT_DEBUG_PLUGINS = "1" .\DependenciesGui.exe

前两个是显示相关的,按自己屏幕调到舒服为止;第三个是排查神器,QT_DEBUG_PLUGINS=1之后从命令行启动 GUI,控制台会把「尝试加载哪个插件、为什么失败」一条条打出来。比起对着一个「could not find or load the Qt platform plugin」的弹窗干瞪眼,这个输出能直接把原因指到具体路径上。

想长期生效就把变量写进用户环境变量,但我不建议——这些变量会影响机器上所有 Qt 程序,某天别的软件界面错乱了你根本不会联想到是这里改的。我的做法是写一个start-gui.bat放在工具目录里,双击它启动,变量只在这个进程里有效:

@echo off REM 只对本次启动生效的 Qt 环境变量,不污染系统 set QT_AUTO_SCREEN_SCALE_FACTOR=1 set QT_DEBUG_PLUGINS=1 start "" "%~dp0DependenciesGui.exe" %*

%~dp0是这个 bat 文件所在目录,用它拼路径的好处是不管你从哪儿双击,工作目录都是工具目录,插件相对路径不会错。%*把 bat 收到的参数原样转给 GUI,这样还能实现「拖文件到 bat 上直接打开」。

4.3 接进右键菜单:把常用排查动作压缩到一次点击

排查 DLL 问题是高频动作,每次都要开工具、找文件、点打开太慢。我一般给.exe和.dll加个右键菜单项,注册表操作如下,改成自己的路径再执行:

@echo off REM 在当前用户下注册右键菜单,不需要管理员权限 reg add "HKCU\Software\Classes\exefile\shell\AnalyzeWithDependencies" /ve /d "用 DependenciesGui 分析" /f reg add "HKCU\Software\Classes\exefile\shell\AnalyzeWithDependencies\command" /ve /d "\"D:\Tools\Dependencies\x64\DependenciesGui.exe\" \"%%1\"" /f reg add "HKCU\Software\Classes\dllfile\shell\AnalyzeWithDependencies" /ve /d "用 DependenciesGui 分析" /f reg add "HKCU\Software\Classes\dllfile\shell\AnalyzeWithDependencies\command" /ve /d "\"D:\Tools\Dependencies\x64\DependenciesGui.exe\" \"%%1\"" /f

关键点在HKCU而不是HKLM:写在当前用户下不需要提权,改坏了也容易清理。%%1在 bat 里表示那个被右键选中的文件路径,双百分号是批处理的转义写法,直接写%1会被 bat 自己吃掉。引号包住%1是为了扛住带空格的路径,这个不加,路径里有空格就直接失效。

要撤销就把reg add换成reg delete,路径参数不变。这个菜单项我只在自己机器上配,不会塞进团队的统一环境里——它改的是资源管理器行为,出问题时的排查成本比省下的几秒钟高。

5. 常见问题排查:depends 装完打不开的五个翻车现场

这套工具装坏的方式高度集中,基本上就下面五种。我把现象、原因、解决按顺序写清楚,遇到了直接对号入座。

5.1 双击弹「找不到 Qt5Core.dll」

现象:双击DependenciesGui.exe,系统弹框说计算机中丢失Qt5Core.dll(或者Qt6Core.dll,看你下的哪个包),程序根本起不来。

原因:只解压了 exe,或者解压过程中断,Qt 运行库没跟着出来。另一种情况是解压到%TEMP%后被清理工具扫掉了,你以为是同一个目录,其实文件已经没了。

解决:重新整包解压到固定目录,解压完核对Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll三个文件在不在主程序旁边。注意别去网上单独下这几个 DLL 补进去——Qt 各版本之间二进制不兼容,版本对不上会变成下一节那种插件加载失败,更难查。

5.2 弹「could not find or load the Qt platform plugin windows」

现象:程序能启动,但立刻弹一个英文错误框说找不到或加载不了 Qt 平台插件windows,然后退出。

原因:platforms\qwindows.dll不存在,或者存在但是位数不对,或者它依赖的其他 DLL 缺失导致加载失败。最常见的是杀软把这个文件单独隔离了,因为它名字不带程序名。

解决:先确认platforms目录和qwindows.dll在不在。不在就重新解压并把工具目录加进杀软白名单。在的话用QT_DEBUG_PLUGINS=1从命令行启动,看控制台输出的具体失败原因——是文件找不到、还是位数不符、还是它自身依赖缺失,这三种情况报错文案不一样,别猜。位数不符通常是因为混用了 x64 主程序配 x86 插件,检查是不是从两个包里各拷了一部分文件拼在一起。

5.3 界面正常,但一打开 DLL 就满屏红

现象:工具跑起来了,打开目标文件后依赖树一大片红色,「not found」刷满屏。

原因:九成不是目标程序真的缺依赖,而是搜索路径没配。工具不知道你的第三方库放在哪,自然全判缺失。剩下的一成里,大部分是api-ms-win-*这类转发 DLL 的正常表现。

解决:先把所有api-ms-win-、ext-ms-开头的红色项排除掉,它们不参与实际判断。剩下的按名字看,如果是项目自己的 DLL 或第三方 SDK 的 DLL,把对应目录加进搜索路径再重新分析。还有一种情况是目标文件本身是 32 位,你用 x64 版工具打开了,这种也会大面积飘红,换 x86 版重试。

5.4 打开 32 位模块提示架构不匹配

现象:拖进一个 32 位 exe,工具提示位数不一致,或者树能出来但部分导入项明显不合理。

原因:用 64 位分析器看 32 位模块。加载器本身不会崩,但导入表解析、转发解析的路径是按 64 位逻辑走的,结果不可信。

解决:备一份 x86 包,遇到 32 位目标就换过去。判断目标位数最简单的办法是看文件属性,或者用 PowerShell 读 PE 头:

# 读 PE 头判断目标文件是 32 位还是 64 位 $path = "C:\Path\To\Target.exe" $bytes = [System.IO.File]::ReadAllBytes($path) $peOffset = [BitConverter]::ToInt32($bytes, 0x3C) $machine = [BitConverter]::ToUInt16($bytes, $peOffset + 4) switch ($machine) { 0x014c { "x86 (32 位)" } 0x8664 { "x64 (64 位)" } default { "其他架构: 0x{0:X}" -f $machine } }

0x3C位置存的是 PE 头偏移,PE 头往后 4 个字节是 Machine 字段,0x014c是 x86,0x8664是 x64。这段脚本我塞在一个小工具函数里,遇到不确定的文件先跑一下,比开两个版本的 GUI 来回试快。

5.5 杀毒软件把Dependencies.exe直接删了

现象:解压完还在,过一会儿文件没了,或者双击直接被拦。

原因:PE 分析类工具的行为特征(读取其他进程的 PE 结构、解析导入导出表)和某些恶意软件的分析手法重合,启发式引擎容易误判。

解决:把整个工具目录加进白名单,注意是目录不是单个文件,因为 Qt 那一堆 DLL 也可能被单独盯上。加白名单之前先确认包来源可靠,这一步不能省——白名单意味着你主动放弃了对这个目录的防护。企业环境里加白名单通常要走审批,提前把用途说清楚比事后解释省事。

6. 装完怎么验证:三个动作确认 depends 真能干活

装完不验证,等于没装。我判断这套环境是否可用,固定跑三个动作,任何一个不过就回去查。

第一个动作是拿系统 DLL 做基准测试。打开C:\Windows\System32\kernel32.dll,正常情况下模块树应该能干净展开,导入项能列出一大串来自ntdll.dll的函数,几乎没有红色。这一步验证的是工具本身和系统目录访问是否正常。如果这里就一片红,说明搜索路径或者位数选错了,别急着分析自己的程序。

第二个动作是用命令行导一份 JSON,验证非 GUI 路径可用:

cd D:\Tools\Dependencies\x64 # 导出一份依赖快照,同时统计节点数 .\Dependencies.exe -recursive -json "C:\Windows\System32\notepad.exe" > notepad-deps.json # 解析并统计模块数量,能读出数字说明 JSON 结构完整 $deps = Get-Content .\notepad-deps.json -Raw | ConvertFrom-Json ($deps | Get-Member -MemberType NoteProperty).Count

ConvertFrom-Json能成功解析,说明输出没被截断、没混进错误信息。模块数量是个粗略的健康指标,数量为 0 或者解析直接抛异常,基本就是参数写错或者路径没引号。这份 JSON 还有个额外用处:可以存进项目的问题排查记录里,下次同类问题直接对比依赖差异。

第三个动作最有说服力——造一个缺 DLL 的程序,看工具能不能指到点上。做法很简单:找一个随手编译的小 exe,把它依赖的某个 DLL 改名,然后放着别动。

验证项期望结果不通过说明什么
打开kernel32.dll树正常展开,红色极少工具环境或位数选错
-json输出可解析模块数大于 0命令行参数或路径引号有问题
打开缺 DLL 的 exe明确标出缺失的那个 DLL搜索路径配错,或分析的不是同一份文件

第三项我当时是用一个模拟项目的测试程序做的,把它依赖的一个第三方 DLL 改名为.bak,再用工具打开。能准确在树上把那个 DLL 标红,并且导入列表里显示「无法解析」的符号,这套环境就算真正可用了。要是它什么都显示正常,那才是最大的问题——说明你打开的可能不是磁盘上那份文件,或者搜索路径命中了别处的同名旧 DLL。

从那以后我每次在新机器上装这套工具,都强制走一遍这三个动作,尤其是第三个。因为前两个只能证明「工具能启动」,只有造一个真实的缺失场景,才能证明「工具的结论可信」。工具给出错误结论比给不出结论危险得多,前者会让你在错误的方向上越走越远。这份 DependenciesGui 的 Windows 10 包我按上面的目录结构整理好了,解压、补运行库、配路径三步走完就能用,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询