[visual-studio]确定为 Dll 的加载的路径

标签: Visual-Studio dll
发布时间: 2014/2/28 21:14:23
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想有我的应用程序中的以下结构。

Exe
 |
 |----- DLL\DLL.dll, DLL\common.dll 
 |
 |----- DLL2\DLL2.dll, DLL2\common.dll

我 EXE 将加载的 Dll 通过

LoadLibraryEx(_T("DLL\\DLL.dll"), 0, 0);
LoadLibraryEx(_T("DLL2\\DLL2.dll"), 0, 0);

DLL.dllDLL2.dll 项目将链接的 common.dll 通过 lib 文件。将有 2 个不同版本的 common.dll 虽然。

然而,在执行期间 Exe 预期我放置 common.dll 相同的目录 Exe ,但不是相同的目录 DLLDLL2 。有没有我可以解决这件事的任何办法能够有上述的目录结构。然而,仍然使用 lib 链接, DLL/DLL2common

解决方法 1:

  1. 您想要将具有相同名称 (common.dll) 两个不同的 Dll 加载到相同的过程。

    这似乎像坏的主意。是真的有必要吗?其中之一可以重命名吗?

  2. 确保您加载的 Dll 可以找到其他 Dll 而不是在搜索路径中。

    (如果你不动态加载 DLL.dll 和 DLL2.dll,然后我不知道什么会。幸运的是,我看到你。:))

    如果要动态地加载 DLL.dll 和 DLL2.dll (也就,在运行时,而不是链接到他们的.lib 文件在生成时使用 LoadLibrary),然后可以调用SetDllDirectory事先明确将 DLL 或 DLL2 的目录添加到搜索路径。你会想要一次以确保正确 common.dll 被加载的路径中仅有一个目录。

    请注意它是好的做法,除非它打破一个不善写组件,以在您的当前工作目录中删除的程序开始时调用 SetDllDirectory("") (该程序的目录中,不要担心) 从 DLL 搜索路径。这会降低到加载的 Dll,可以欺骗您的代码的安全问题。但也请注意,如果您重置的调用 SetDllDirectory(NULL) 的搜索路径,然后您需要再次之后调用 SetDllDirectory("")。

所以你会有这样的代码:

SetDllDirectory(NULL); // Reset.
SetDllDirectory(""); // Plug "binary planting" security hole. `
SetDllDirectory("C:\MyExePath\DLL");
LoadLibrary("C:\MyExePath\DLL\DLL.dll");

SetDllDirectory(NULL); // Reset.
SetDllDirectory(""); // Plug "binary planting" security hole.
SetDllDirectory("C:\MyExePath\DLL2");
LoadLibrary("C:\MyExePath\DLL2\DLL2.dll");

SetDllDirectory(NULL); // Reset.
SetDllDirectory(""); // Plug "binary planting" security hole.

(未经测试所以歉意的任何错误或缺少的参数。应该给你这个想法,不过)。

(你应该计算在运行时 C:\MyExePath。Hard-coding 它会很糟糕,很明显.)

(我假设 DLL.dll 和 DLL2.dll 隐式加载其 common.dll。如果他们正在加载通过调用 LoadLibrary common.dll 那么问题就是变得更加方便: 只是让他们计算自己的路径,然后将传递 LoadLibrary 的完整路径到 common.dll.)

要当心: SetDllDirectory 会影响您的整个过程。如果您的过程有多个线程应确保 SetDllDirectory 调用是隔离的对方,以及其他任何可能触发 LoadLibrary 调用。之前你产卵任何其他线程,如果可能的话,例如加载库在启动时。

赞助商