c – LoadLibraryEx忽略并排清单

LoadLibraryEx函数是否使用并排清单?我有带有嵌入式SxS清单的bar.dll,并且该清单描述了这个bar.dll的版本,其他dll文件foo.dll有清单,它将bar.dll列为依赖项,具有指定版本.但是当我尝试使用LoadLibraryEx(“bar.dll”,NULL,0)从foo.dll加载bar.dll时,我看到(启用带有gflags的sls)它会忽略这些清单,并加载bar.dll的第一个版本它在searchpath中看到,如果我定义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

在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);
    }
}
上一篇:【TcaplusDB知识库】RESTfulAPI. for Generic表-[PB] FieldGetRecord介绍


下一篇:【RuoYi-Vue-Plus】学习笔记 07 - 前端打包流程 + 通过 nginx 配置限制系统非正常请求操作(演示模式)