Windows:更改Exe的DLL搜索顺序

时间:2009-10-23 16:54:00

标签: c++ windows dll exe

我在应用程序目录中有一个C ++ Exe,它包含它使用的DLL。现在,出于某些测试目的,我需要修改现有的DLL并使用它而不是原始的DLL。但是为了不修改现有的安装,我无法备份现有的DLL并将其替换为已修改的DLL或将现有的DLL移动到其他位置。我也无法改变Exe。 2个DLL需要并排存在。唯一的变化应该是Exe应该透明地加载修改后的DLL,它在某个其他文件夹中,而不是与Exe在同一文件夹中的现有DLL。有一些优雅的方式吗?

我查看了一些MSDN文章,但找不到这样做的方法。该解决方案应适用于Windows XP及更高版本。

4 个答案:

答案 0 :(得分:2)

Windows每个进程最多只会加载一个版本的每个DLL名称。如果它加载HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs中列出的DLL,它将不会在以后加载类似命名的DLL。但是在AppInit_DLLs中,您可以列出具有显式路径的DLL,从而覆盖正常的LoadLibrary()顺序。

因此,暂时将测试DLL放在AppInit_DLLs中,它将覆盖任何其他具有相同名称的DLL。

答案 1 :(得分:1)

根据MSDN,它总是从应用程序目录开始(除非你用备用搜索顺序方法修改它......)所以它似乎很难。您仍然可以将可执行文件及其他依赖项复制到其他位置。但它并不那么优雅。

或者,您可以从原始目录启动已在其他位置复制的可执行文件以及新DLL。根据搜索顺序,它也应该有效,但我必须承认我从未尝试过。

答案 2 :(得分:0)

您可以从头开始挂接LoadLibrary()调用。当您的修补版本的LoadLibrary()看到您的DLL时,它会使用修改后的DLL路径调用原始LoadLibrary()。即使您不使用LoadLibrary()调用来加载DLL,Windows CRT也可以。所以这种技术必须有效。

答案 3 :(得分:-1)

我知道的唯一方法是使用LoadLibrary API,包括路径,但是你说你不能改变exe。