【发布时间】:2011-01-30 18:23:12
【问题描述】:
我正在编写某种 IPC 功能,需要将某些资源从一个进程传递到另一个进程。这适用于可以通过 DuplicateHandle 复制的管道句柄等。现在我需要将 HDC 从一个进程传递到另一个进程。这甚至可能吗?如果是:如何?
子问题:我假设将窗口句柄 (HWND) 从一个进程传递到另一个进程是安全的。这个假设正确吗?
【问题讨论】:
我正在编写某种 IPC 功能,需要将某些资源从一个进程传递到另一个进程。这适用于可以通过 DuplicateHandle 复制的管道句柄等。现在我需要将 HDC 从一个进程传递到另一个进程。这甚至可能吗?如果是:如何?
子问题:我假设将窗口句柄 (HWND) 从一个进程传递到另一个进程是安全的。这个假设正确吗?
【问题讨论】:
HWND 可以在进程之间共享,否则 SendMessage() 将无法工作。然而,它们仅限于特定桌面,桌面与会话相关联。每个登录用户都有一个会话。会话 0 是特殊的,服务运行的会话。还有一个安全桌面,您在登录时或按 Ctrl+Alt+Del 时看到的桌面,您不会弄乱密码输入框。但只要这两个进程在同一个桌面上运行,你就不会有任何问题。
HDC 很模糊,从未尝试过。我不会推荐它。您始终可以使用 GetDC() 从 HWND 创建一个。
【讨论】:
所有 GDI 句柄都存储在映射到每个进程的表中。表中的条目包含拥有进程的进程 ID,并且在每次 GDI 访问句柄时都会对其进行检查。
因此,(具有讽刺意味的是)GDI 句柄(包括 HDC)在系统范围内有效。但只能从创建它们的进程中使用。
This Page 记录 GDI 对象的进程亲和性。当然,作为一个反驳点,值得注意的是,一些 COM 函数和窗口消息(如 WM_PRINT)没有任何进程间限制,并且它们通过 HDC,因此它们显然必须在幕后做一些事情来从一个进程编组 HDC到下一个。
【讨论】:
假设您想从另一个进程(例如通过使用 BitBlt)绘制属于一个进程的 HDC,那么正如 nobugz 和 Chris Becke 指出的那样,您不能跨进程边界共享该 HDC。但是,进一步假设该进程的 HDC 属于一个窗口(并且您的意图是最终绘制到该窗口上),那么您可以将该窗口句柄传递给另一个进程,并在此过程中使用 GetDc 获取 HDC。使用此 HDC,您可以在其他进程的窗口上进行绘制。
【讨论】: