在不同进程之间共享HDC

问题描述:

我正在编写某种IPC功能,需要将某个资源从一个进程传递到另一个进程。这适用于可以通过DuplicateHandle复制的Pipe手柄等。现在我需要将HDC从一个进程传递到另一个进程。这甚至有可能吗?如果是,如何?在不同进程之间共享HDC

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

所有GDI句柄都存储在映射到每个进程的表中。表中的条目包含拥有进程的进程ID,并且在每次GDI对句柄的访问时都会检查这些进程。 (具有讽刺意味的是,)包括HDC在内的GDI句柄在系统范围内是有效的。但只能从创建它们的过程中使用。


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

+0

我认为你和nobugz都强调,我的问题可以被看作是共享GDI资源。我在这里找到一个相关的帖子:http://*.com/questions/133948/sharing-gdi-handles-between-processes-in-windows-ce-6-0 有人想分享HFONTs。也许这和HDC是同一个联盟。但如果有这张表映射到每个进程,那么我希望有一个简单的DuplicateGDIHandleFromThisTableForTheCurrentProcess函数... – 2010-03-23 16:10:07

+2

该表存在于所有进程中的事实是当前GDI实现的人为因素,而非设计特性。它可以消失。很多情况下,GDI对象都有指向用户模式数据结构的指针,因此即使句柄在系统范围内有效,实际的GDI对象也只能在单个进程中成功访问。 – 2010-03-23 18:35:53

+0

好吧,所以绝对不会工作的是使用相同的句柄,而无需进一步编组到另一个进程中。这留下了是否有公开可用的功能... – 2010-03-25 08:20:48

HWND可以在进程间共享,否则SendMessage()将无法工作。但是,它们的范围是特定的桌面,桌面与会话相关联。每个登录用户都有一个会话。会话0是特殊的,服务运行的会话。并且有一个安全的桌面,您在登录时看到的或您按Ctrl + Alt + Del时看到的桌面,您不能混淆密码输入框。但只要这两个进程在同一个桌面上运行,就不会有任何问题。

HDCs很模糊,从来没有尝试过。我不会推荐它。您始终可以使用GetDC()从HWND创建一个。

+0

SendMessage确实是一个很好的例子,它必须在进程间工作(并且我的进程将在同一个会话的同一台桌面上运行)。谢谢。所以我主要关心的仍然是HDC。你是对的,我可以通过HWNDs,但这意味着我将不得不重组我不想接触的代码。我只是多等一会儿,也许有人知道确切的是或否... – 2010-03-23 14:51:00

+0

你为什么不试试呢?如果你不需要重组代码,那么你会发现足够快。 – 2010-03-23 15:03:23

+1

你在这里有一个问题。但即使它工作了,我最好还是建立在记录的行为上,而不是巧合,这可能会使它在我的机器上工作,但打破了其他(它也必须在XP,Vista和7上工作)。但尝试绝对不会伤害。那么至少我可以知道它不起作用:) – 2010-03-23 15:12:18

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