什么是“api-ms-win-*-*-lx-x-x.dll”伞库?

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

我不断遇到具有长文件名的 DLL。仅两个例如:

"api-ms-win-appmodel-runtime-l1-1-1.dll"
"api-ms-win-appmodel-identity-l1-2-0.dll"
。显然微软称它们为“伞库”。

我最初的理解是它们只是具有新文件名的新DLL,但后来我尝试搜索这些文件。好吧,我在磁盘上找不到它们作为物理文件......

所以我很好奇,它们是不是磁盘上不存在的某种虚拟 DLL 文件名?

WCHAR buff[MAX_PATH];
buff[0] = 0;
GetSystemDirectory(buff, MAX_PATH);
StringCchCat(buff, MAX_PATH, L"\\api-ms-win-appmodel-runtime-l1-1-1.dll");

HMODULE hModule = LoadLibrary(buff);
//'hModule' is NULL & error code is ERROR_MOD_NOT_FOUND

但是以下方法有效:

HMODULE hModule = LoadLibrary(L"api-ms-win-appmodel-runtime-l1-1-1.dll");
c++ winapi dll uwp
1个回答
26
投票

这些是“虚拟 DLL”名称。当我们调用

LoadLibrary
时,Windows 加载程序(例如
LdrLoadDll
)将检查众所周知的名称前缀(例如
api-
),如果名称以其中之一开头 - 它将使用 ApiSetSchema 机制将虚拟 dll 名称(即
api-ms-win..
)转换为真实 dll 名称(例如,文件名,如
kernel32.dll
kernelbase.dll
等)。此映射在位于 system32 文件夹中的 ApiSetSchema.dll 中实现。

关于内部实现 - 阅读 运行时 DLL 名称解析:ApiSetSchema - 第二部分 API Set Schema

您还可以参考 Microsoft 的 API Set Schemas 原始文档,美国专利出版物 “US 2014/0366045 A1”,其中涵盖了该技术的原始动机以及 Microsoft 实现的总体设计。

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