我正在编写某种IPCfunction,需要将某个进程的某些资源从一个进程传递到另一个进程。 这对于可以通过DuplicateHandle复制的pipe道手柄等很好。 现在我需要将HDC从一个进程传递到另一个进程。 这甚至有可能吗? 如果是,如何?
子问题:我假设从一个进程到另一个进程的窗口句柄(HWND)是安全的。 这个假设是否正确?
所有GDI句柄都存储在映射到每个进程的表中。 表中的条目包含拥有进程的进程ID,并在每个GDI对该句柄的访问时进行检查。
所以(具有讽刺意味的是,)GDI处理(包括HDC)在系统范围内是有效的。 但只能从创建它们的过程中使用。
本页记录了GDI对象的进程关联性。 当然,值得一提的是,一些COM函数和WM_PRINT之类的窗口消息没有任何进程间的限制,而且它们都通过了HDC,所以显然他们必须在幕后做一些事情来把HDC从一个进程到下一个。
HWND可以在进程之间共享,否则SendMessage()将不起作用。 然而,它们被限制在特定的桌面,桌面与会话相关联。 每个登录用户都有一个会话。 会话0是特殊的,服务运行的会话。 还有一个安全的桌面,你在登陆时看到的那个,或者当你按Ctrl + Alt + Del时,你不能混淆密码输入框。 但只要两个进程在同一个桌面上运行,就不会有任何问题。
HDCs是阴暗的,从来没有尝试过。 我不会推荐它。 您始终可以使用GetDC()从HWND创建一个。
假设你想从属于另一个进程的一个进程的HDC(例如使用BitBlt)绘制,那么nobugz和Chris Becke指出,你不能跨进程边界共享该HDC。 但是,进一步假设这个进程的HDC属于一个窗口(并且您的意图是最终绘制到该窗口上),那么您可以将该窗口句柄传递给另一个进程,并且在此过程中使用GetDc来获得HDC。 有了这个HDC,你就可以画到另一个过程的窗口上。