多个静态链接的DLL的DLL重定向

问题描述 投票:0回答:1

我正在尝试在VS2010 C ++项目(x32配置)上加载同一DLL的多个实例。

所以我有主DLL-与其他一些kids.dll(kid1.dll,kid2.dll等...,kid8.dll)复合的Parent.dll静态链接-当我加载Parent.dll时, kids.dll会自动加载(它们位于同一路径,因此可以成功加载)。

在我的代码中,我使用LoadLibraryEx(Path,NULL,LOAD_WITH_ALTERED_SEARCH_PATH)加载Parent.dll实例。我尝试创建Parent.dll的多个实例时发生我的问题:我将所有DLL的副本复制到另一个路径中,将其他DLL的名称重命名为Parent Name(例如,Parnet_1.dll),因为它们是静态链接的,因此无法重命名。 (我无法访问Parnet.dll源代码并将其更改为动态加载)。

具有1个实例-Parent.dll及其所有孩子都成功加载。当我尝试加载另一个实例Parent_1.dll时,Parent_1.dll已成功加载,但其他子DLL未加载:它们具有从第一个实例加载的完全相同的名称-这就是导致我的程序崩溃。

我想做的是动态加载Parent.dll的多个实例,每个Parent将加载自己的kids.dll。

我一直在互联网上搜索,找不到适合我的情况的解决方案。我在那里看到了这篇文章:https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-redirection并尝试了MyCode.exe.local,但它不起作用。

我也尝试了使用清单文件进行DLL重定向,但不明白如何正确执行。

感谢您的大力帮助!

c++ redirect dll
1个回答
0
投票

只要文件相同就不会起作用。

一个DLL在整个进程中共享,如果一个DLL已经被加载,则对LoadLibrary的新调用将仅返回对该已加载模块的引用。这样做会破坏DLL的作用。

如果绝对必须具有不同的负载,则可以重命名文件(尽管这样很快就会变得笨拙(即使那样,我也不确定是否可以正常工作(库的名称编码为二进制文件的一部分,我不确定如果新文件是LoadLibrary,并且内部名称与已加载的库的名称匹配,则Windows将继续加载。

如果您可以使用它,以便在加载parent2.dll之前先卸载parent1.dll(以及所有子级,那么以上都不应该起作用。

© www.soinside.com 2019 - 2024. All rights reserved.