Файлы с отображением памяти - сопоставить структуру, а не файл?

Я очень новичок в файлах с отображением памяти, и я немного потерялся в чем-то.

Я знаю, что если бы у меня был файл, я мог бы загрузить его и получить к нему доступ из разных процессов сразу с помощью MMaps.

Но в моей ситуации я создаю DLL, прикрепленную к процессу A, и этой DLL был присвоен указатель на cSurface, подготовленный процессом A. Мне нужно поделиться данными этого cSurface с процессом B. Я действительно не хочу вызывать пустой MMap и копировать в него поверхность моего процесса A только для того, чтобы снова скопировать ее в процессе B.

Можно ли сопоставить мою поверхность, как если бы это был файл, чтобы MMap уже указывал на данные поверхности при ее создании (как если бы я загружал SomeTextFile.txt)?

Мой план, теоретически, состоял бы в том, чтобы получить указатель на поверхность в Proc A, указать окнам совместно использовать память этой поверхности с заданным именем и использовать мьютексы для координации доступа — идея в том, что оба процесса считывают одну и ту же физическую копию поверхность без громоздкого копирования.

Это возможно?


person Chris D    schedule 12.01.2012    source источник
comment
Просто решил сделать свой пост немного яснее. Предположим, у меня есть огромный буфер с именем char buffer[SUPER_MASSIVE] и огромный файл с именем hSuperMassiveFile. Я мог бы поделиться SuperMassiveFile, выполнив CreateFileMapping( hSuperMassiveFile, ... ), но я хотел бы сделать то же самое со своим буфером. Есть ли способ вместо этого сделать CreateFileMapping( (HANDLE) buffer, ...) и поделиться моим буфером без необходимости запрашивать пустую карту, а затем CopyMemory() в нее мой буфер?   -  person Chris D    schedule 12.01.2012


Ответы (2)


Да, все это есть в документации CreateFileMapping.

Вы можете дать имя файлу с отображением памяти. Если другой процесс откроет mmap с тем же именем, он будет указывать на ту же память. Если дескриптор в CreateFileMapping помещается в INVALID_HANDLE_VALUE, он сохраняет его исключительно в памяти. Ознакомьтесь с документацией по CreateFileMapping

person Community    schedule 12.01.2012
comment
Насколько я знаю, моя проблема заключается в том, что MMap начинает содержать мои данные. Если бы мои данные были в файле и я сделал CreateFileMapping( hMyFile, ... );, то карта автоматически содержала бы содержимое MyFile. Но мои данные находятся в памяти, и они огромны. Если я сделаю CreateFileMapping( INVALID_HANDLE_VALUE, ...);, то я верну указатель на неинициализированную пустошь, в которую я затем должен скопировать свой массивный буфер, что потребует времени. Я бы предпочел, чтобы был способ заставить карту начинать указывать на мой буфер с момента его создания. - person Chris D; 12.01.2012
comment
Я создаю DLL, а буфер создается родительским приложением. Родитель дает мне указатель на буфер и его размер в качестве параметров функции. Итак, из того, что я вижу, у меня есть варианты либо скопировать буфер в область MMapped, либо каким-то образом отобразить область, в которой уже находится буфер. - person Chris D; 12.01.2012

Спасибо за все ваши комментарии.

Я провел дополнительное исследование и нашел ответ.

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

person Chris D    schedule 14.01.2012