Does LoadLibraryEx
函数使用并排清单?我有带有嵌入式 SxS 清单的 bar.dll,该清单描述了该 bar.dll 的版本,其他 dll 文件 foo.dll 具有将 bar.dll 列为依赖项的清单,并具有指定的版本。但是当我尝试从 foo.dll 加载 bar.dll 时LoadLibraryEx("bar.dll", NULL, 0)
我看到(启用带有 gflags 的 sls)它会忽略这些清单,并加载它在搜索路径中看到的 bar.dll 的第一个版本,如果我定义ISOLATION_AWARE_ENABLED
并使用LoadLibrary
它找到了正确的版本,但是这个ISOLATION_AWARE_ENABLED
不影响行为LoadLibraryEx
,我需要加载正确的版本LoadLibraryEx
因为LoadLibraryEx
隐式用于 dll 的延迟加载。是LoadLibraryEx
应该像这样工作,还是我的项目配置有问题?
foo dll
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="foo" version="0.1.2.3" type="win32"/>
<dependency>
<dependentAssembly>
<assemblyIdentity name="bar" version="0.1.2.3" type="win32" />
</dependentAssembly>
</dependency>
<file name="foo.dll">
</file>
</assembly>
bar.dll
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="bar" version="0.1.2.3" type="win32"/>
<file name="bar.dll">
</file>
</assembly>
LoadLibrary
使用调用线程的活动激活上下文。但这个上下文是什么?为什么它一定是来自你的foo.dll
?为什么不从xyz.dll
或者来自exe?实际上,大多数时候活动激活上下文正是来自 exe。
如果 dll 有自己的清单 - 系统为此 dll 创建激活上下文并保存它(直到 dll 将被卸载)但不使其处于活动状态。这很明显 - 我们正在处理多个 dll,但活动上下文只有一个 - 从哪个 dll 选择它?从 exe.但是,系统在调用它的入口点之前激活(使其当前处于活动状态)dll 激活上下文。并在入口点返回后将其停用。但是说在另一个 dll 函数中 - (谁调用了它?)上下文已经不是来自您的 dll。
所以解决方案必须是下一个:
在dll中定义2个全局变量:
BOOL gActCtx;
HANDLE ghActCtx
on DLL_PROCESS_ATTACH
保存当前激活上下文(来自 dll 清单)
gActCtx = GetCurrentActCtx(&ghActCtx);
释放它DLL_PROCESS_DETACH
if (gActCtx) ReleaseActCtx(ghActCtx);
当你需要负载时bar.dll
接下来做:
if (gActCtx)
{
ULONG_PTR Cookie;
if (ActivateActCtx(ghActCtx, &Cookie))
{
LoadLibraryExW(L"bar.dll", NULL, 0);
DeactivateActCtx(0, Cookie);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)