я могу создать общую память (используя CreateFileMapping) в локальном пространстве имен с тем же именем?

0

Пожалуйста, помогите мне понять, могут ли быть два объекта общей памяти с тем же именем в локальном/глобальном пространстве имен? Я знаю, что если мы сначала создали объект общей памяти, нам нужно вызвать 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
Теги:
ipc

1 ответ

1

В документации MSDN для CreateFileMapping вы точно знаете, что вам нужно знать:

Изображение 174551

Поэтому вы не можете использовать одно и то же имя в одном и том же пространстве имен (глобальное или локальное). Вы даже не можете использовать одно и то же имя для разных типов объектов ядра.

Если вы попытаетесь создать новое сопоставление файлов с тем же именем, что и существующее сопоставление файлов, оно попытается открыть существующее сопоставление файлов (с учетом ваших атрибутов защиты страницы). Если это будет успешным, вы получите дескриптор существующего объекта, но вы также получите возвращаемое значение ERROR_ALREADY_EXISTS из GetLastError.

Если вы думаете об этом логически, единственный способ совместного использования сопоставления файлов между процессами - использовать одно и то же имя, поэтому бессмысленно иметь два разных сопоставления с одним и тем же именем!

  • 0
    Спасибо за объяснение. Полностью согласен, что нет никакого смысла в создании общего объекта с тем же именем. Просто чтобы уточнить, если я не вызову GetLastError и предположу, что возвращаемый дескриптор имеет открытый объект, то будет ли MapViewFile работать?
  • 1
    @HVar Да, если он учитывает размер первоначально созданного отображения, а не размер, который вы указали при его «открытии».
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню