Хорошо, похоже, что файлы и каналы с отображением в памяти - правильный путь. Это не так уж плохо, потому что два процесса уже совместно используют MMF и два канала (для двунаправленной связи). Единственное, что осталось решить - как передать данные с минимальным количеством операций копирования.
Дизайн, который работает довольно хорошо, выглядит следующим образом (последовательный поток):
Процесс 1 (требуется изображение)
- подать сигнал процессу 2 (через канал 1) на сохранение изображения в общей памяти
- иди спать и жди ответа (блокировка чтения из канала 2)
Процесс 2 (предоставляет изображения)
- при получении сигнала (по каналу 1) просыпается и сообщает аппаратному устройству выполнить запись в HDC 1 (это поддерживается общей памятью, см. Ниже)
- подать сигнал процессу 1 (по трубопроводу 2)
- иди спать и жди новой работы (по трубе 1)
Процесс 1 (требуется изображение)
- при сигнале (по каналу 2) просыпаются и рисуют из разделяемой памяти в пункт назначения HDC 2
Теперь для передачи изображения через разделяемую память (моей целью было использовать не более одной дополнительной операции копирования):
Процесс 2 создает HBITMAP
через CreateDIBSection
и предоставляет дескриптор сопоставления файла и смещение отображенного представления. Таким образом, данные изображения живут в общей памяти. Это создает HBITMAP
, который выбирается в HDC 1 (который также создается процессом 2) и который теперь будет использоваться процессом 2.
Процесс 1 использует StretchDIBits
с указателем на память отображенного представления (как описано здесь ). Это, кажется, единственная функция для получения битов из памяти непосредственно в другой HDC (в данном случае HDC 2). Другие функции сначала скопируют их в некоторый промежуточный буфер, прежде чем вы сможете перенести их оттуда в конечный HDC.
Так что в итоге кажется, что биты, которые нужно передать, примерно вдвое больше, чем в начале. Но я думаю, что это так же хорошо, как и до тех пор, пока не будет возможно совместное использование дескрипторов GDI между процессами.
Примечание: я использовал каналы вместо сигналов, потому что мне тоже нужно передать некоторые дополнительные данные.