Общее растровое изображение в разных процессах - PullRequest
2 голосов
/ 02 января 2012

Как создать независимое от устройства растровое изображение в окнах с помощью win32 / mfc, которое будет использоваться всеми процессами, запущенными на компьютере?

В поисках лучшего и самого быстрого способа разделения DIB между всеми процессами на компьютере с Windows XP / 7. Процессы должны иметь возможность блокировать содержимое растрового изображения и делать рисование на этом растровом изображении, и другие процессы могут также использовать это растровое изображение для чтения.

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

Пожалуйста, предложите лучший способ как в отношении сложности времени, так и сложности пространства. Сложность пространства означает, что процесс, который хочет рисовать содержимое в этом растровом изображении, не должен копировать все содержимое в локальной памяти и рисовать, он должен иметь возможность напрямую принимать это растровое изображение в контексте устройства и рисовать в растровом изображении.

1 Ответ

3 голосов
/ 02 января 2012

К сожалению, * нет поддерживаемого способа совместного использования дескрипторов GDI (например, растровых изображений) между процессами.

Однако существует поддерживаемый способ получения нескольких растровых изображений (в нескольких процессах) для совместного использования.хранилище.

В основном процессе создайте раздел памяти с помощью API CreateFileMapping .

У вас есть несколько способов получить дескриптор раздела для различных процессов -

Самый простой из которых (как указывает Пассант Ганса ) - просто назвать раздел при вызове CreateFileMapping ... и затем использовать OpenFileMapping.Если у вас есть основной процесс, который запускает другие процессы, убедитесь, что раздел создан с параметром bInheritHandle SECURITY_ATTRIBUTES, установленным в значение ИСТИНА, и дескриптор будет автоматически продублирован во все подпроцессы - обычно для передачи значения дескриптора в командной строкеновый процесс.В противном случае используйте функцию DuplicateHandle , чтобы скопировать дескриптор в другие процессы - но вам все равно понадобится какой-то другой вид IPC, чтобы получить дескриптор процесса.

Как бы то ни было, вы можете затем вызвать CreateDIBSection в каждом процессе для создания растровых изображений GDI, которые поддерживаются одним и тем же разделом памяти.Обратите внимание на комментарии по синхронизации доступа к растровому изображению.Если у вас есть несколько процессов, пытающихся записать в растровое изображение, вам может потребоваться сериализовать доступ на этом уровне.

  • В качестве иронического примечания: поскольку Win32 основан на Win16, существует множество устаревших API-интерфейсов Win16, которыеиметь дело с оконными сообщениями и буфером обмена, которые на самом деле ожидают, что HBITMAP можно будет использовать из нескольких процессов.Кроме того (в качестве подробностей реализации) в Windows NT 5.x и 6.x растровые изображения выделяются драйверами режима ядра из единой общесистемной таблицы дескрипторов и, таким образом, технически допустимы в любом процессе. Однако GDI также хранит идентификатор процесса каждогоОбъект GDI в этой таблице и вызовы API GDI явно проверяют идентификатор процесса и выходят из строя при вызове по дескриптору GDI, принадлежащему другому процессу.
...