Совместное использование HDC между различными процессами - PullRequest
7 голосов
/ 23 марта 2010

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

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

Ответы [ 3 ]

8 голосов
/ 23 марта 2010

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

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

6 голосов
/ 23 марта 2010

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

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


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

3 голосов
/ 30 марта 2010

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

...