如何在 C++ 或 Python 中以编程方式列出 DLL 的依赖项?
How do I programmatically list a DLL's dependencies in C++ or Python?
我目前正在使用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,来为你处理所有的事情。
- 挂起和取消挂起一个文件DLL
- 如何在c++中为模板函数实例创建快捷方式
- DLL共享数据的推荐方式是什么
- 散列顶点的最佳方式
- 如何在不同的目标平台上以编程方式智能注册 32 位 COM/DLL 组件
- 以编程方式验证已签名的 dll 的C++
- 如何以编程方式检测 DLL 是在 .NET 中编译为 32 位还是 64 位
- 导入 DLL 的工作方式不同(VS2003 到 VS2010,多线程到多线程 DLL)
- 多列中的C++对齐方式
- 我能否以编程方式对 wxDataViewCtrl 的列重新排序
- 从Unity3d调用本机DLL的最佳方式是什么
- 如何在 C++ 或 Python 中以编程方式列出 DLL 的依赖项?
- dll导出函数指针(提供导出函数挂钩的最佳方式)
- 我是否可以以可以在加载时删除 dll 的方式加载它?
- 在c++中以编程方式从DLL中获取DLL版本-再次
- 通过元编程或其他方式自动注册dll模块中的静态对象工厂
- QTableView如何以编程方式选择多列
- 以可移植方式将类导出到 dll,而无需使用接口
- 以编程方式自定义 DLL 搜索目录
- 与dll相互通信的最佳方式是什么?