- Windows 7 计算机
- QtCreator 4.8.0
- Qt 5.12.0
- MSVC2015 64 位
- 编译器 MSVC C++ 14.0 (x86_amd64)
我正在尝试创建一个非常简单的程序,我想与我的同事分享。他们没有安装 Qt,需要一个可执行文件。我没有成功,因为 exe 有许多我无法找到的依赖项。
为了调试这个问题,我从头开始使用一个 Qt Widgets 应用程序,它没有什么(即仅头文件、main.cpp 和 mainWindow.cpp)。当我在 QtCreator 中运行该程序时,它成功构建并以代码 0 退出。创建了一个可执行文件,通过运行 windeployqt,所有必需的 Qt dll 都复制到了目录中。但是,windows dll 丢失了。使用依赖项遍历器,我可以看到缺少一整列 windows dll。我不明白为什么一个什么都不做的程序需要这么多 dll。我能够在 x64\ilc\lib\MSCRT\ 目录中找到一些 dll,但大多数所需的 API-MS-WIN-CORE-xxx-xxx.dll 都不可用。我读过关于类似问题的帖子,但无法将提出的解决方案与我的情况联系起来。任何建议都值得感激,这是一台工作笔记本电脑,因此重新安装 windows 不是一个选择。DependencyWalker 屏幕。
編輯运行 Qt 可执行文件时......(下面的屏幕截图链接) 第一条错误消息
答案1
这些 DLL 曾经也让我困惑不已,所以我借此机会一劳永逸地揭开这个谜团。
DLLAPI-MS-*
并非真的丢失 - 问题出在依赖项遍历器上。这些伪造的 DLL 是在 2007 年的 Windows Vista 中添加的,而依赖项遍历器则始于 2006 年,此后从未更新过。
尼尔软件 分析了这些 DLL,发现它们非常小,基本不包含任何有用的代码。当 Windows 加载它们时,它们的导入条目将被替换为对 Windows 内核中真实函数的调用。
文章 关于 API-MS-WIN-XXXXX.DLL 和其他 Dependency Walker 故障 将它们称为“Api Sets”,并给出了以下历史视角:
在 Vista 开发周期中,有一次明微开始:本质上,聪明的人开始移动功能,希望简化操作系统架构。为了保护无数组件在更改期间不被破坏,最终的解决方案是:一个额外的间接层。这一层就是 Api Sets。
例如,API 集是包含 5 个 API 、、和 的
api-ms-win-core-fibers-l1-1-1.dll
功能“原子” (这种“原子”非常小)。所有使用光纤功能的应用程序都声明依赖于此 API 集,因此对实现的确切位置不敏感(可能在操作系统版本之间发生变化)。在加载期间,操作系统会搜索某个地方,并自动将调用路由 到此操作系统版本中实现它们的位置。FlsAlloc
FlsFree
FlsGetValue
FlsSetValue
IsThreadAFiber
api-ms-win-core-fibers-l1-1-1.dll
实际的每个操作系统版本的重定向数据位于一个名为 的特殊文件中
ApiSetSchema.dll
。从技术上讲,它是一个 DLL(符合 PE 规范),但不是可执行文件 - 重定向数据位于宏.apiset
中提到的名为 的专门部分中apiset.h
。塞巴斯蒂安雷诺做了一些出色的逆向工作,并描述了它包含的重定向数据的布局。
依赖遍历器的更现代版本也是免费的,可以在以下位置找到: Github 依赖项,并且可以更好地揭露这些 DLL: