我经常遇到长文件名的 DLL,就这样。例如只有两个:"api-ms-win-appmodel-runtime-l1-1-1.dll"
或 "api-ms-win-appmodel-identity-l1-2- 0.dll"
。显然微软称它们为“umbrella libraries”。
我最初的理解是它们只是具有新文件名的新 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");
最佳答案
这是“虚拟 DLL”名称。加载程序,当我们调用 LoadLibrary
(LdrLoadDll
) 检查众所周知的名称前缀(比如 api-
),如果名称以此开头 - 使用 ApiSetSchema mechanism用于将虚拟 dll 名称(即 api-ms-win..
)转换为真实的 dll 名称(文件名,如 kernel32.dll
、kernelbase.dll
等)。此映射在 system32 文件夹中的 ApiSetSchema.dll 中实现。
关于内部实现——阅读 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/