c00*_*0fd 6 c++ dll winapi uwp
我一直在运行具有长文件名的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
Run Code Online (Sandbox Code Playgroud)
但以下工作:
HMODULE hModule = LoadLibrary(L"api-ms-win-appmodel-runtime-l1-1-1.dll");
Run Code Online (Sandbox Code Playgroud)
RbM*_*bMm 13
这是"虚拟DLL"的名称.装载机,当我们调用LoadLibrary(LdrLoadDll)检查众所周知的名称前缀(说api-),如果名称以此开头-使用ApiSetSchema机制的转换虚拟DLL名称(即api-ms-win..)实际DLL名称(文件名,如kernel32.dll,kernelbase.dll等).此映射在位于system32文件夹中的ApiSetSchema.dll中实现.
关于内部实现 - 读取运行时DLL名称解析:ApiSetSchema - 第二部分和API集架构
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |