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

问题描述 投票:3回答:1

我目前正在使用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解决方案。任何帮助或建议将不胜感激。谢谢。

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

python c++ dll
1个回答
2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.