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

C++ 我是否可以在本地命名空间中使用相同的名称创建共享内存(使用CreateFileMapping)?,c++,windows,ipc,C++,Windows,Ipc,请您帮助我了解在本地/全局命名空间中是否可以有两个同名的共享内存对象?我知道如果我们第一次创建了一个共享内存对象,那么我们需要调用OpenFileMapping/MapViewOfFile来打开一个对象。如果我对已经创建的对象调用CreateFileMapping,会发生什么 e、 g forCreateFileMapping准确地告诉您需要知道的内容: 因此,不能在同一命名空间(全局或本地)中使用相同的名称。您甚至不能对不同类型的内核对象使用相同的名称 如果尝试创建与现有文件映射同名的新文件

请您帮助我了解在本地/全局命名空间中是否可以有两个同名的共享内存对象?我知道如果我们第一次创建了一个共享内存对象,那么我们需要调用
OpenFileMapping/MapViewOfFile
来打开一个对象。如果我对已经创建的对象调用
CreateFileMapping
,会发生什么

e、 g

for
CreateFileMapping
准确地告诉您需要知道的内容:

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

如果尝试创建与现有文件映射同名的新文件映射,它将尝试打开现有文件映射(取决于页面保护属性)。如果此操作成功,您将获得现有对象的句柄,但您还将从
GetLastError
中获得一个返回值ERROR\u ready\u EXISTS


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

从:如果在函数调用之前存在对象,则函数返回现有对象的句柄(其当前大小不是指定的大小),并且
GetLastError
返回
ERROR\u exists
。测试非常简单,只是尝试一下,而不是询问。文档中是否有特定部分不清楚在这种情况下会发生什么?@RaymondChen-被“如果在函数调用之前存在对象,函数将返回现有对象的句柄(使用其当前大小,而不是指定的大小)”所迷惑,GetLastError返回错误“已存在”。在打开(MapViewFile)对象之前,我们不会调用GetLastError()。因此,我想知道它是否返回一个现有的对象句柄,并且存在一个错误,那么MapViewFile会工作吗?文件映射已经存在的情况是成功/失败混合的情况。它成功地创建了句柄(“函数返回句柄”),但也未能创建新对象(因为对象已经存在)。因此,文档不能说在这种情况下调用“成功”(这只是部分成功)。
GetLastError
的返回值允许您区分这种情况,如果您愿意的话。大多数人都不在乎,只要检查一下手柄就行了,如果你对重用现有对象没意见的话,也可以。谢谢你的解释。完全同意使用相同的名称创建共享对象没有任何意义。只是澄清一下,如果我不调用GetLastError并假设返回的句柄是打开的对象,那么MapViewFile会工作吗?@HVar yes,只要它尊重最初创建的映射的大小,而不是“打开”时指定的大小如果我们想在需要为没有管理员权限的用户运行的应用程序中使用CreateFileMapping,那么解决方案是什么?
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