静态链接不是一种选择.
假设我有一个依赖于DLL的可执行文件.一种解决方案是将DLL与可执行文件放在同一文件夹中.现在让我们说我需要将一个DLL注入一个依赖于DLL的进程.因为注入了DLL,我将把它依赖的DLL放在哪里?在同一个文件夹中?或者在注入的进程的目录中?
依赖于一个或多个其他DLL的DLL并不是特别的.即使是一个普通的DLL也会依赖于驻留在其他DLL中的Windows共享组件.这些"共享组件"的一个很好的例子是Kernel32.dll
和CRT DLL等MSVCR80.DLL
.
通过调用Dependency Walker,您可以确切地找到DLL或EXE所需的其他DLL .为此,只需depends.exe
从Visual Studio命令提示符运行,然后将感兴趣的DLL拖放到出现的窗口中.如果您没有依赖walker,可以从上面的链接下载它.
我不确定DLL注入的东西,但是如果你将所有(其他DLL)依赖项放在与DLL相同的文件夹中,通常就足够了,这将是加载这些DLL的EXE所在的文件夹.
例如:如果C:\test\foo.exe
需要bar.dll
(这反过来要求baz.dll
,假设baz.dll
是不是一个标准的Windows共享组件),那么你就都放在bar.dll
和baz.dll
中C:\test
.
操作系统如何确定要加载哪个DLL还有很多,因为同一DLL的多个版本可能存在于不同的位置,MSDN 在动态链接库的搜索顺序上有一篇有用的文章.