c++ - 什么是 "api-ms-win-*-*-lx-x-x.dll"伞形库?

标签 c++ winapi dll uwp

因此,我不断遇到具有长文件名的 DLL。例如只有两个:"api-ms-win-appmodel-runtime-l1-1-1.dll""api-ms-win-appmodel-identity-l1-2- 0.dll”。显然微软称它们为“umbrella libraries”。

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

所以我很好奇,它们是不是磁盘上不存在的某种虚拟 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");

最佳答案

这是“虚拟 DLL”名称。 loader,当我们调用 LoadLibrary (LdrLoadDll) 检查众所周知的名称前缀(比如 api- ),如果名称以此开头 - 使用 ApiSetSchema mechanism用于将虚拟 dll 名称(即 api-ms-win.. )转换为真实 dll 名称(文件名,如 kernel32.dllkernelbase.dll等)。此映射在 system32 文件夹中的 ApiSetSchema.dll 中实现。

enter image description here

关于内部实现 - 阅读 Runtime DLL name resolution: ApiSetSchema - Part II The API Set Schema

关于c++ - 什么是 "api-ms-win-*-*-lx-x-x.dll"伞形库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47529106/

相关文章:

internet-explorer - IWebBrowser2 Ctrl+C等快捷键支持

c - 无法运行已编译的C + Gtk + -3软件

c# - 如何在 Unity3D 中使用 C++ dll?

c++ - 为什么要避免根据 ISO C++ 在 new 之后检查 null

c++ - C++ 中仅 gRPC 的 Tensorflow Serving 客户端

c++ - QAbstractItemModel 动态项目插入

c++ - 空指针算术

c++ - 需要精确的线程 sleep 。最大 1ms 错误

创建一个带有向下箭头图标的按钮

c# - 构建 FFmpeg.NET .dll