如何检测应用程序所需的DLL?

时间:2008-12-12 12:03:37

标签: winapi dll

简而言之:我想做同样的事情“Dependency Walker”。

是否有可以枚举EXE和/或DLL文件依赖关系的Win32 API函数?

有没有安全的方法来检测ActiveX类的依赖? (我怀疑这是可能的,但谁知道......)

编辑:我知道提供相同核心功能的可用工具(Dependency Walker,ProcessExplorer,AQTime,...)但我想创建自己的程序来转储文本文件包含所需的模块。

7 个答案:

答案 0 :(得分:7)

以下命令转储some.exe的直接依赖项:

dumpbin /imports some.exe

它也适用于DLL。

这不会列出依赖项,例如在应用程序启动时加载的插件(通过LoadLibrary调用)。对于COM依赖项也是如此,因为它们以相同的方式工作(据我所知)。

如果您需要知道正在运行的程序使用的所有DLL,请使用ProcessExplorer。

答案 1 :(得分:6)

findstr -i .dll exe.exe |更多| findstr -i .dll |更多

rem:)

答案 2 :(得分:3)

运行应用程序,Process Explorer已在运行,并设置为过滤应用程序.exe名称。

在没有运行可执行文件的情况下,无法检测可执行文件的所有COM依赖项。

答案 3 :(得分:2)

似乎Dependency Walker源代码本身是由Microsoft通过MSJ提供的。请 看看 Re: [DUG]: Dependency Walker

您需要引用其他网站进行下载,因为此邮件路径中的链接无效。

请检查 MSJ Source Code Updates :由于我没有时间,我没有检查它是否包含源代码或仅包含EXEfoæes。

答案 4 :(得分:1)

用户@blue ...被Dependency Walker所吸引。使用Dependency Walker时,打开文件后,您可以看到使用的基本要求。只有在执行程序并执行其所有功能时,才能找到所有动态加载的DLL。

有时,如果可以,最好的办法是询问开发人员需要哪些DLL。应用程序可能只在绝对需要时加载一些DLL。例如加载faultrep.dll,用于自定义Windows错误报告,当它即将崩溃时。

答案 5 :(得分:1)

您可能需要遍历可执行文件的文件结构以编程方式执行此操作。因此,像这里提到的'PE Dump'计划: http://msdn.microsoft.com/en-gb/magazine/cc301808.aspx将是一个很好的起点。您可以在此处找到所需的实际代码: http://www.wheaty.net/downloads.htm

答案 6 :(得分:0)

您可以编写一个控制台应用程序来包装它,使用它创建一个PowerShell脚本,或者像我通常最终做的那样,因为我只需要在蓝色月亮中执行一次,将以下内容添加到您的代码中以便快速完成检查:

    private static HashSet<string> ReferencedAssemblies = new HashSet<string>();

    ...
    OutputDependencies(Assembly.GetAssembly(typeof(Program)), 0);
    ...

    static void OutputDependencies(Assembly assembly, int indent)
    {
        if (assembly == null) return;

        Console.WriteLine(new String(' ', indent * 4) + assembly.FullName);
        if (!ReferencedAssemblies.Contains(assembly.FullName))
        {
            ReferencedAssemblies.Add(assembly.FullName);

            foreach (var childAssembly in assembly.GetReferencedAssemblies())
            {
                OutputDependencies(Assembly.Load(childAssembly.FullName), indent + 1);
            }
        }
    }