Общая память не означает отправку и получение данных. Это память, созданная для ряда процессов без нарушений. Для этого вы должны следовать некоторым механизмам, таким как блокировки, чтобы данные не были повреждены.
В процессе 1:
CreateFileMapping()
: он создаст блок общей памяти с именем, указанным в последнем параметре, если он еще не существует, и вернет дескриптор (вы можете назвать его указателем), если он будет успешным.
MapViewOfFile()
: он отображает (включает) этот общий блок в адресном пространстве процесса и возвращает дескриптор (опять же, вы можете сказать указатель).
С этим указателем, возвращаемым MapViewOfFile()
, только вы можете получить доступ к этому общему блоку.
В процессе 2:
OpenFileMapping()
: Если блок общей памяти успешно создан с помощью CreateFileMapping()
, вы можете использовать его с тем же именем (имя, используемое для создания блока общей памяти).
UnmapViewOfFile()
: он не отобразится (вы можете удалить блок совместно используемой памяти из адресного пространства этого процесса). Когда вы закончите использовать разделяемую память (то есть доступ, изменение и т. Д.), Вызовите эту функцию.
Closehandle()
: наконец, чтобы отсоединить блок совместно используемой памяти от процесса, вызовите это с аргументом, дескриптор возвращается OpenFileMapping () или CreateFileMapping ().
Хотя эти функции выглядят простыми, поведение сложно, если флаги не выбраны правильно.
Если вы хотите читать или записывать общую память, укажите PAGE_EXECUTE_READWRITE
в CreateFileMapping()
.
Если вы хотите получить доступ к общей памяти после ее успешного создания, используйте FILE_MAP_ALL_ACCESS
в MapViewOfFile()
.
Лучше указать FALSE
(не наследовать дескриптор от родительского процесса) в OpenFileMapping()
, чтобы избежать путаницы.