我可以在本地命名空间中使用相同的名称创建共享内存(使用CreateFileMapping)吗?

时间:2013-10-14 13:50:27

标签: c++ windows ipc

请帮助我了解本地/全局命名空间中是否有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

1 个答案:

答案 0 :(得分:1)

CreateFileMapping的{​​{3}}告诉您确切需要了解的内容:

msdn

因此不能在同一名称空间(全局或本地)中使用相同的名称。您甚至不能对不同类型的内核对象使用相同的名称。

如果您尝试使用与现有文件映射相同的名称创建新文件映射,它将尝试打开现有文件映射(取决于您的页面保护属性)。如果成功,获取现有对象的句柄,但您还将从GetLastError获得 ERROR_ALREADY_EXISTS 的返回值。

如果你从逻辑上考虑它,你可以在进程之间共享文件映射的唯一方法是使用相同的名称,所以有两个具有相同名称的不同的映射是没有意义的!