Winapi 如何检测应用程序所需的DLL?
简而言之:我想做和“依赖步行者”一样的事情 是否有任何Win32 API函数可以枚举EXE和/或DLL文件的依赖项 有没有安全的方法来检测ActiveX类的依赖关系?(我怀疑这是可能的,但谁知道…)Winapi 如何检测应用程序所需的DLL?,winapi,dll,Winapi,Dll,简而言之:我想做和“依赖步行者”一样的事情 是否有任何Win32 API函数可以枚举EXE和/或DLL文件的依赖项 有没有安全的方法来检测ActiveX类的依赖关系?(我怀疑这是可能的,但谁知道…) 编辑:我知道提供相同核心功能的可用工具(Dependency Walker、ProcessExplorer、AQTime等),但我想创建自己的程序,转储包含所需模块的文本文件 运行已经运行的应用程序,并设置为筛选应用程序的.exe名称 如果不运行一个可执行文件,就无法检测它所具有的所有COM依赖关系
编辑:我知道提供相同核心功能的可用工具(Dependency Walker、ProcessExplorer、AQTime等),但我想创建自己的程序,转储包含所需模块的文本文件 运行已经运行的应用程序,并设置为筛选应用程序的.exe名称
如果不运行一个可执行文件,就无法检测它所具有的所有COM依赖关系。看来依赖性Walker源代码本身是由Microsoft通过MSJ提供的。请 看 您需要参考其他网站下载,因为此邮件线索中提供的链接不起作用
请检查:由于我没有时间,我没有检查它是否包含源代码或仅包含EXE foæes。以下命令转储某些.EXE的直接依赖项:
dumpbin /imports some.exe
它也适用于DLL
这不会列出依赖项,例如在应用程序启动时加载的插件(通过LoadLibrary调用)。COM依赖项也是如此,因为它们的工作方式相同(据我所知)
如果您需要知道正在运行的程序使用的所有DLL,请使用ProcessExplorer。User@blue。。。逃避。使用Dependency Walker时,打开文件后可以看到使用的基本需求。只有在执行程序并执行其所有功能时,才能找到所有动态加载的DLL
有时,如果可以的话,最好的办法是询问开发人员需要哪些DLL。应用程序只能在绝对需要时加载一些DLL。e、 g.加载faultrep.dll,用于自定义Windows错误报告,当它即将崩溃时。您可能需要遍历可执行文件的文件结构,以编程方式解决此问题。因此,这里提到的“PE转储”程序是一个很好的起点。您需要的实际代码可以在这里找到:findstr-i.dll exe.exe | more | findstr-i.dll | more
rem:)您可以编写一个控制台应用程序来完成此操作,用它创建一个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);
}
}
}
private static HashSet referencedsassemblies=new HashSet();
...
OutputDependencies(Assembly.GetAssembly(typeof(Program)),0);
...
静态void OutputDependencies(程序集、整型缩进)
{
if(assembly==null)返回;
Console.WriteLine(新字符串(“”,缩进*4)+assembly.FullName);
如果(!referencedAssemblys.Contains(assembly.FullName))
{
referencedAssemblys.Add(assembly.FullName);
foreach(assembly.getReferencedAssemblys()中的var childAssembly)
{
OutputDependencies(Assembly.Load(childAssembly.FullName),缩进+1);
}
}
}
<>代码>您可以考虑更改问题的标题。如果您想知道如何通过Win32 API执行此操作,应在标题中说明。这不仅仅是吹毛求疵;其他人稍后可能会尝试查找相同的信息,您的标题可能会告诉他们您的问题解决了此问题。即使如此,您仍然希望注意,如果您需要确保记录所有使用的文件,可能需要执行应用程序的所有功能。不正确,请重新延迟加载DLL,它们和普通DLL一样位于exe的导入部分。但我同意,要找到动态加载的DLL,您必须钩住LoadLibrary()并在exe中执行所需的代码路径。第一个链接已断开,第二个链接仅指向一个可执行文件。在stackoverflow上不鼓励只链接的答案。完全虚假的答案会产生左侧和右侧的误报和误报。将单方面报告碰巧包含“.dll”的字符串的依赖项,而不确定该字符串的使用位置。无法说明在运行时加载的DLL(例如,在实例化ActiveX控件时调用LoadLibrary
)。对此答案的一厢情愿。。。只需一次搜索即可轻松完成。打开VS 201x的开发者命令提示符即可执行dumpbin。这可以从Windows按钮访问,向下滚动到Visual Studio 201x文件夹。