Winapi 有没有办法通过编程检查EXE的依赖关系?

Winapi 有没有办法通过编程检查EXE的依赖关系?,winapi,language-agnostic,Winapi,Language Agnostic,我有一个特定的项目,我建立并分发给用户。我有两个构建配置,调试和发布。显然,调试是我在调试中使用的,但是还有一个额外的缺点:调试配置使用一个特殊的调试内存管理器,它依赖于一个外部DLL 有几次,我意外地构建并分发了一个带有调试配置的安装程序包,但由于用户没有特殊的DLL,安装后它就无法运行了。我希望将来能避免这种情况发生 我知道我可以通过运行Dependency Walker获得程序中的依赖项,但我正在寻找一种通过编程实现的方法。具体地说,我有一种在创建安装程序时运行脚本的方法,我想在安装程序脚

我有一个特定的项目,我建立并分发给用户。我有两个构建配置,调试和发布。显然,调试是我在调试中使用的,但是还有一个额外的缺点:调试配置使用一个特殊的调试内存管理器,它依赖于一个外部DLL

有几次,我意外地构建并分发了一个带有调试配置的安装程序包,但由于用户没有特殊的DLL,安装后它就无法运行了。我希望将来能避免这种情况发生


我知道我可以通过运行Dependency Walker获得程序中的依赖项,但我正在寻找一种通过编程实现的方法。具体地说,我有一种在创建安装程序时运行脚本的方法,我想在安装程序脚本中放入一些东西,以检查程序是否依赖于此DLL,如果是,则导致安装程序创建过程失败并出现错误。我知道如何创建一个简单的CLI程序,该程序将两个文件名作为参数,并且可以运行
DependsOn
函数并根据其结果创建输出,但我不知道在
DependsOn
函数中放什么。有人知道我该怎么写吗?

您可以阅读PE导入表,了解加载时需要哪些DLL。这就是Dependency Walker所做的,也是Microsoft平台SDK附带的
dumpbin
工具(由Visual Studio安装,也可以单独下载)。一些debughelp API提供了对PE头信息的访问,但是为什么不调用
dumpbin
工具并检查其输出呢?因为它是基于文本的非交互式的,所以集成到安装程序构建过程中应该非常简单

如果您确实需要在没有任何其他工具帮助的情况下检索信息,那么该函数是一个很好的起点。另外,这里有一个问题显示了如何手动执行此操作(但请改用ImageHlp,它了解PE格式的所有变体):


您可以阅读PE导入表,了解加载时需要哪些DLL。这就是Dependency Walker所做的,也是Microsoft平台SDK附带的
dumpbin
工具(由Visual Studio安装,也可以单独下载)。一些debughelp API提供了对PE头信息的访问,但是为什么不调用
dumpbin
工具并检查其输出呢?因为它是基于文本的非交互式的,所以集成到安装程序构建过程中应该非常简单

如果您确实需要在没有任何其他工具帮助的情况下检索信息,那么该函数是一个很好的起点。另外,这里有一个问题显示了如何手动执行此操作(但请改用ImageHlp,它了解PE格式的所有变体):


@MasonWheeler:
dumpbin
实际上是Windows SDK的一部分,因此您可以在不使用Visual Studio的情况下免费获得它。或者,如果我知道您使用的是什么工具链,我可能知道是否有与之捆绑的工具。@Mason:对不起,我不熟悉与Delphi捆绑的工具。但事实证明,Dependency Walker有一个命令行模式,它以CSV或列式文本格式输出导入列表。这很有趣,但是看起来没有任何方法可以让它实际输出到控制台,而不是一个文件。这让事情变得更加棘手。但是ImageHlp解决方案非常有用!那么,如果您使用的是Delphi呢。您最好也了解MS工具的使用方法。@MasonWheeler:
dumpbin
实际上是Windows SDK的一部分,因此您可以在不使用Visual Studio的情况下免费获得它。或者,如果我知道您使用的是什么工具链,我可能知道是否有与之捆绑的工具。@Mason:对不起,我不熟悉与Delphi捆绑的工具。但事实证明,Dependency Walker有一个命令行模式,它以CSV或列式文本格式输出导入列表。这很有趣,但是看起来没有任何方法可以让它实际输出到控制台,而不是一个文件。这让事情变得更加棘手。但是ImageHlp解决方案非常有用!那么,如果您使用的是Delphi呢。您最好也了解MS工具的使用方法。为什么不自动化您的构建过程呢。这样做很简单,节省了很多时间,也意味着你不会犯错误。花时间研究依赖关系解决了错误的问题。真正的问题是你没有一个可重复的构建过程。为什么不自动化你的构建过程呢。这样做很简单,节省了很多时间,也意味着你不会犯错误。花时间研究依赖关系解决了错误的问题。真正的问题是您没有可重复的构建过程。