在不同进程之间共享HDC

时间:2010-03-23 11:37:04

标签: windows winapi ipc hdc

我正在编写某种IPC功能,需要将某些资源从一个进程传递到另一个进程。这适用于Pipe handle等,可以通过DuplicateHandle复制。现在我需要将HDC从一个进程传递到另一个进程。这甚至可能吗?如果是的话:怎么样?

子问题:我假设将窗口句柄(HWND)从一个进程传递到另一个进程是安全的。这个假设是否正确?

3 个答案:

答案 0 :(得分:8)

HWND可以在进程之间共享,否则SendMessage()将不起作用。然而,它们限定在特定桌面上,桌面与会话相关联。每个登录用户都有一个会话。会话0是特殊的,即运行服务的会话。还有一个安全的桌面,您在登录时看到的或者当您按Ctrl + Alt + Del时,您无法使用密码输入框。但只要两个进程在同一个桌面上运行,就不会有任何麻烦。

HDC是阴暗的,从未尝试过。我不推荐它。您始终可以使用GetDC()从HWND创建一个。

答案 1 :(得分:6)

所有GDI句柄都存储在映射到每个进程的表中。表中的条目包含拥有进程的进程ID,并在每次对句柄的GDI访问时检查。

因此,(具有讽刺意味的是),GDI处理 - 包括HDC - 在系统范围内是有效的。但只能从创建它们的过程中使用。


This Page记录了GDI对象的进程关联。当然,作为一个反点,值得注意的是一些COM函数和像WM_PRINT这样的窗口消息没有任何进程间限制并且它们都是通过HDC的,所以他们显然必须在幕后做一些事情来从一个进程封送HDC到下一个。

答案 2 :(得分:3)

假设您想要绘制属于来自另一个进程的一个进程的HDC(例如使用BitBlt),那么正如nobugz和Chris Becke所指出的那样,您无法跨进程边界共享该HDC。但是,进一步假设该进程的HDC属于一个窗口(并且您的意图是最终绘制到该窗口),那么您可以将该窗口句柄传递给另一个进程,并且在此过程中使用GetDc来获取HDC。使用此HDC,您可以在另一个过程的窗口上绘画。