Che*_*eng 3 c++ windows dll visual-studio
我希望我的应用程序在以下结构中.
Exe
|
|----- DLL\DLL.dll, DLL\common.dll
|
|----- DLL2\DLL2.dll, DLL2\common.dll
Run Code Online (Sandbox Code Playgroud)
我的EXE将加载DLL
LoadLibraryEx(_T("DLL\\DLL.dll"), 0, 0);
LoadLibraryEx(_T("DLL2\\DLL2.dll"), 0, 0);
Run Code Online (Sandbox Code Playgroud)
DLL.dll和DLL2.dll项目将common.dll通过lib文件链接.虽然会有2个不同的版本common.dll.
但是,在执行期间,Exe我希望将common.dll同一目录放在同一目录中Exe,但不能DLL和DLL2.有没有办法解决这个问题,能够拥有上述目录结构.然而,仍然使用LIB来链接DLL/DLL2用common.
您希望将两个具有相同名称(common.dll)的不同DLL加载到同一进程中.
这对我来说似乎是一个坏主意.真的有必要吗?其中一个可以重命名吗?
确保加载的DLL可以找到不在搜索路径中的其他DLL.
(如果你没有动态加载DLL.dll和DLL2.dll那么我不确定它会是什么.幸运的是,我看到你了.:))
如果您正在动态加载DLL.dll和DLL2.dll(即,在运行时使用LoadLibrary而不是在构建时链接到其.lib文件),那么您可以事先调用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.
Run Code Online (Sandbox Code Playgroud)
(未经测试,对于任何错误或遗漏的论点都要道歉.但是,应该给你这个想法.)
(你应该在运行时计算C:\ MyExePath.显然硬编码会很糟糕.)
(我假设DLL.dll和DLL2.dll隐式加载了他们的common.dll.如果他们通过LoadLibrary调用加载common.dll,那么问题就更容易了:只需让他们计算自己的路径,然后传递LoadLibrary common.dll的路径.)
注意:SetDllDirectory会影响整个过程.如果您的进程有多个线程,则应确保SetDllDirectory调用彼此隔离,以及可能触发LoadLibrary调用的任何其他调用.例如,如果可能,在生成任何其他线程之前,在启动时加载库.
这是行不通的。您无法将“DLL2\DLL2.dll”链接到“DLL2\common.dll”。DLL2.dll 将链接到“DLL\common.dll”。当加载“DLL2.dll”时,内存中将会有一个“common.dll”,因此 DLL2.dll 的导入将根据该 DLL 进行解析。
请注意,诸如PATH或 之类的建议SetDllDirectory不起作用。它们影响如何LoadLibrary查找“common.dll”,但LoadLibrary("common.dll")对于 DLL\DLL.dll 仅调用一次。
| 归档时间: |
|
| 查看次数: |
4591 次 |
| 最近记录: |