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”名称。加载程序,当我们调用 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/

相关文章:

c++ - WINAPI:静态对话框项的彩色边框

c++ - 在 Windows 上编译 NodeJS C++ 模块?

.net - 学习Win32开发GUI应用程序

c++ - CreateDialog 失败,但为什么 GetLastError 返回 0?

c++ - 处理 PVP 游戏中的延迟问题

c++ - 覆盖现有的已使用集群

c++ - 调用 SetEvent 后调用 CloseHandle

windows - 使用了哪些dll?

c++ - 逆向工程 C++ DLL

c++ - DllRegisterServer 错误 0xc0000005,(C++ COM Dll)。如何在 Visual Studio 2008 中调试我的 DllRegisterServer 函数?