什么是 OpenFileMapping?
OpenFileMapping 是 Windows API 中的一个函数,用于打开一个已存在的命名文件映射对象(file mapping object)。它常用于多个进程之间共享内存,是实现高效进程间通信(IPC)的重要手段之一。
该函数通常与 CreateFileMapping 和 MapViewOfFile 配合使用。
函数原型
HANDLE OpenFileMappingW( [in] DWORD dwDesiredAccess, [in] BOOL bInheritHandle, [in] LPCWSTR lpName );
参数说明:
- dwDesiredAccess:指定对映射对象的访问权限,如 FILE_MAP_READ、FILE_MAP_WRITE 等。
- bInheritHandle:是否允许子进程继承此句柄。
- lpName:映射对象的名称(必须与创建时一致)。
使用示例(C++)
#include <windows.h>
#include <iostream>
int main() {
HANDLE hMap = OpenFileMapping(FILE_MAP_READ, FALSE, L"MySharedMem");
if (hMap == NULL) {
std::cerr << "OpenFileMapping failed: " << GetLastError() << std::endl;
return 1;
}
LPVOID pData = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
if (pData) {
std::cout << "Data: " << static_cast<char*>(pData) << std::endl;
UnmapViewOfFile(pData);
}
CloseHandle(hMap);
return 0;
}
常见用途
- 多进程共享配置数据
- 高性能日志系统
- 跨进程缓存机制
- 大型文件的快速读取(避免频繁 I/O)
安全注意事项
⚠️ 使用命名内存映射对象时,需注意以下安全风险:
- 恶意程序可能通过猜测名称访问敏感数据;
- 建议使用强随机名称或 ACL(访问控制列表)限制访问权限;
- 不要在映射内存中存储未加密的密码或密钥。
常见问题(FAQ)
Q:OpenFileMapping 返回 NULL 怎么办?
A:通常是因为指定的 lpName 不存在,或当前进程无权限访问。请检查名称拼写,并确认已有进程调用 CreateFileMapping 创建了该对象。
Q:可以跨用户会话使用吗?
A:默认不行。若需跨会话(如服务与桌面应用通信),需在名称前加 Global\ 前缀(例如 L"Global\\MyMap"),并确保有足够的权限。