请帮助我了解本地/全局命名空间中是否有2个具有相同名称的共享内存对象?我知道如果我们第一次创建了共享内存对象,那么我们需要调用OpenFileMapping/MapViewOfFile
来打开一个对象。如果我在已创建的对象上调用CreateFileMapping
会发生什么?
e.g。
CreateFileMapping(INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // max. object size
sizeof(BackupData), // buffer size
"SharedMemory"); // name of mapping object
答案 0 :(得分:1)
CreateFileMapping
的{{3}}告诉您确切需要了解的内容:
因此不能在同一名称空间(全局或本地)中使用相同的名称。您甚至不能对不同类型的内核对象使用相同的名称。
如果您尝试使用与现有文件映射相同的名称创建新文件映射,它将尝试打开现有文件映射(取决于您的页面保护属性)。如果成功,将获取现有对象的句柄,但您还将从GetLastError
获得 ERROR_ALREADY_EXISTS 的返回值。
如果你从逻辑上考虑它,你可以在进程之间共享文件映射的唯一方法是使用相同的名称,所以有两个具有相同名称的不同的映射是没有意义的!