К сожалению, * нет поддерживаемого способа совместного использования дескрипторов 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, принадлежащему другому процессу.