2013-04-24 86 views
1

静态链接不是一个选项。依赖于其他DLL的DLL?

假设我有一个依赖于DLL的可执行文件。一种解决方案是将DLL与可执行文件一起发布到相同的文件夹中。现在我们假设我需要将DLL注入到依赖于DLL的进程中。由于DLL被注入,我会在哪里放置它依赖的DLL?在同一个文件夹中?或者在注入进程的目录中?

回答

4

取决于一个或多个其他DLL的DLL并不是特别的。即使是一个微不足道的DLL也会依赖于驻留在其他DLL中的Windows共享组件。这些“共享组件”的一个很好的例子是Kernel32.dll和CRT DLL如MSVCR80.DLL

你可以找出究竟哪些其他的DLL你的DLL或EXE通过调用Dependency Walker要求上。为此,只需从Visual Studio命令提示符运行depends.exe,然后将感兴趣的DLL拖放到出现的窗口中即可。如果您没有可用的依赖性助手,可以从上面的链接下载它。

我不确定DLL注入的东西,但它应该通常是足够的,如果您将所有(其他DLL)依赖项放在与您的DLL相同的文件夹中,这将是EXE加载这些文件夹DLL驻留。

例如:如果需要C:\test\foo.exebar.dll(这又要求baz.dll,假设baz.dll不是一个标准窗口共享组件),那么你将置于C:\testbar.dllbaz.dll

操作系统如何确定要加载哪个DLL还有很多,因为同一个DLL的多个版本可能存在于不同的位置,并且MSDN在动态链接库的搜索顺序上有一个有用的article

+0

是的,将它们放在同一个文件夹中是标准做法。如果您绝对需要将它们放在其他地方,请调用SetDllDirectory函数来修改应用程序的默认搜索顺序。很好的答案! – 2013-04-24 04:41:44