4

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

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

4

4 回答 4

2

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

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

于 2009-10-26T12:03:18.567 回答
1

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

或者,您可以从原始目录启动您在其他地方复制的可执行文件以及新的 DLL。根据搜索顺序,它也应该可以工作,尽管我必须承认我从未尝试过。

于 2009-10-23T17:10:17.250 回答
0

您可以从一开始就为您的进程挂钩 LoadLibrary() 调用。当您修补的 LoadLibrary() 版本看到您的 DLL 时,它会使用修改后的 DLL 路径调用原始 LoadLibrary()。即使您不使用 LoadLibrary() 调用来加载您的 DLL,Windows CRT 也会这样做。所以这项技术必须奏效。

于 2009-10-25T01:50:08.573 回答
-1

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

于 2009-10-23T16:57:40.020 回答