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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何以编程方式在C ++或Python中列出DLL的依赖项?相关的知识,希望对你有一定的参考价值。

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

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

this site说,不可能显示比这更多的信息。

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

我已经找到this MSDN page on enumerating for a running process但是无法找到如何为非运行的.exe或卸载.dll。我最接近的是关于LoadLibraryEx函数*的MSDN文章。但是,我不能为我的生活弄清楚如何从返回的HMODULE获取依赖表。

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

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

*我会链接文章,但我的代表不够高,不能在一个问题中发布两个链接。 :)

答案

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

以上是关于如何以编程方式在C ++或Python中列出DLL的依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在核心数据中以编程方式创建超类/子类?

如何以非线性方式在C ++中保存矩阵

C# WPF 如何以编程方式设置控件的位置、宽度和高度?

如何以编程方式(Python)抓取流式实时股票图表代码数据及其指标

如何以编程方式在 ExtJS 4 中触发 keydown 事件

如何以编程方式检查视频或音频文件格式是不是可以在 iPhone 中播放?