Совместное использование HDC между различными процессами

Я пишу некоторую функциональность IPC и потребность передать определенные ресурсы от одного процесса до другого. Это работает хорошо на дескрипторы Канала и т.д., которые могут быть дублированы через DuplicateHandle. Теперь я должен передать HDC от одного процесса до другого. Это даже возможно? Если да: как?

Дополнительный вопрос: Я предполагаю, что передающие дескрипторы окна (HWND) от одного процесса до другого безопасны. Это предположение корректно?

7
задан Heinrich Ulbricht 18 November 2011 в 16:04
поделиться

3 ответа

Все дескрипторы GDI хранятся в таблице, которая отображается в каждый процесс. Записи в таблице содержат идентификатор процесса-владельца, и он проверяется при каждом доступе GDI к дескриптору.

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


Эта страница документирует сродство объектов GDI к процессу. Конечно, в качестве контраргумента стоит отметить, что некоторые функции COM и оконные сообщения, такие как WM_PRINT, не имеют никаких межпроцессных ограничений, и они проходят через HDC, поэтому они явно должны что-то делать за кулисами, чтобы маршалировать HDC из одного процесса. к следующему.

6
ответ дан 6 December 2019 в 11:47
поделиться

HWND могут быть разделены между процессами, иначе SendMessage () не будет работать. Однако они привязаны к определенному рабочему столу, рабочий стол связан с сеансом. Для каждого вошедшего в систему пользователя существует один сеанс. И сеанс 0 особенный, сеанс, в котором работают службы. И есть безопасный рабочий стол, тот, который вы видите при входе в систему или когда вы нажимаете Ctrl + Alt + Del, вы не можете связываться с полем ввода пароля. Но пока оба процесса работают на одном рабочем столе, у вас не будет никаких проблем.

HDC мутные, никогда не пробовал. Я бы не рекомендовал это. Вы всегда можете создать его из HWND с помощью GetDC ().

8
ответ дан 6 December 2019 в 11:47
поделиться

Предполагая, что вы хотите рисовать на HDC, принадлежащем одному процессу, из другого процесса (например, используя BitBlt), а затем, как указано nobugz и Chris Becke вы не можете совместно использовать этот HDC через границы процессов. Но, дополнительно предполагая, что HDC этого одного процесса принадлежит окну (и вы намерены, наконец, нарисовать это окно), вы можете передать этот дескриптор окна другому процессу и в этом процессе использовать GetDc для получения HDC. С помощью этого HDC вы можете рисовать в окне другого процесса.

3
ответ дан 6 December 2019 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: