如何在 C++ 或 Python 中以编程方式列出 DLL 的依赖项?

How do I programmatically list a DLL's dependencies in C++ or Python?

本文关键字:DLL 方式列 依赖 编程 C++ Python      更新时间:2023-10-16

我目前正在使用Boost Python为C++项目编程Python接口。问题是,如果DLL丢失,Python会给我们一个非常无用的错误消息:

ImportError:DLL加载失败:找不到指定的模块。

根据这个网站,不可能显示比这更多的信息。

现在,大问题来了。我不能使用依赖walker或dumpbin,因为我们需要能够通过编程确定缺少哪个DLL。好消息是,我们只需要检查第一级的依赖关系。因此,如果my.exe依赖于a.dll、b.dll和c.dll,那么这是我们唯一感兴趣的dll集。如果a、b和c都在它们应该在的位置,那么我的工作就完成了。

我已经找到了这个关于枚举正在运行的进程的MSDN页面,但无法找到如何为未运行的.exe或卸载的.dll枚举。我最近看到的是一篇关于LoadLibraryEx函数*的MSDN文章。然而,我一辈子都不知道如何从返回的HMODULE中获取依赖关系表。

因此,64000美元的问题是:如何从HMODULE获得.exe/.dll依赖项?一个更好的问题是:这就是我获得依赖关系的地方吗?如果没有,我在哪里可以找到它?

最佳的解决方案是C++,但我们非常乐意拥有Python解决方案。如有任何帮助或建议,我们将不胜感激。谢谢

*我会链接这篇文章,但我的代表级别不够高,无法在一个问题中发布两个链接。:)

您需要读取模块的可移植可执行文件头(PE头)。这是一个描述导入、导出、重新定位、节、资源、代码、静态数据以及二进制文件所依赖的所有其他内容的结构。虽然它可以直接解析,但PE Header结构有很多不明显的怪癖和细微差别。我建议使用一个库,比如PeLib,来为你处理所有的事情。