Пожалуйста, помогите мне понять, могут ли быть два объекта общей памяти с тем же именем в локальном/глобальном пространстве имен? Я знаю, что если мы сначала создали объект общей памяти, нам нужно вызвать OpenFileMapping/MapViewOfFile
чтобы открыть объект. Что произойдет, если я вызову 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
В документации MSDN для CreateFileMapping
вы точно знаете, что вам нужно знать:
Поэтому вы не можете использовать одно и то же имя в одном и том же пространстве имен (глобальное или локальное). Вы даже не можете использовать одно и то же имя для разных типов объектов ядра.
Если вы попытаетесь создать новое сопоставление файлов с тем же именем, что и существующее сопоставление файлов, оно попытается открыть существующее сопоставление файлов (с учетом ваших атрибутов защиты страницы). Если это будет успешным, вы получите дескриптор существующего объекта, но вы также получите возвращаемое значение ERROR_ALREADY_EXISTS из GetLastError
.
Если вы думаете об этом логически, единственный способ совместного использования сопоставления файлов между процессами - использовать одно и то же имя, поэтому бессмысленно иметь два разных сопоставления с одним и тем же именем!