2010-03-23 119 views
6

我正在編寫某種IPC功能,需要將某個資源從一個進程傳遞到另一個進程。這適用於可以通過DuplicateHandle複製的Pipe手柄等。現在我需要將HDC從一個進程傳遞到另一個進程。這甚至有可能嗎?如果是,如何?在不同進程之間共享HDC

子問題:我假設從一個進程到另一個進程的窗口句柄(HWND)是安全的。這個假設是否正確?

回答

6

所有GDI句柄都存儲在映射到每個進程的表中。表中的條目包含擁有進程的進程ID,並且在每次GDI對句柄的訪問時都會檢查這些進程。 (具有諷刺意味的是,)包括HDC在內的GDI句柄在系統範圍內是有效的。但只能從創建它們的過程中使用。


This Page記錄了GDI對象的進程關聯性。當然,作爲一個相反點,值得注意的是,一些COM函數和WM_PRINT之類的窗口消息沒有任何進程間限制,並且它們通過了HDC,所以顯然他們必須在幕後做一些事情來從一個進程中編組HDC到下一個。

+0

我認爲你和nobugz都強調,我的問題可以被看作是共享GDI資源。我在這裏找到一個相關的帖子:http://stackoverflow.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

8

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

2

假設您想要從另一個進程(例如,通過使用BitBlt)繪製屬於一個進程的HDC,那麼nobugz和Chris Becke指出,您不能跨進程邊界共享該HDC。但是,進一步假設該進程的HDC屬於一個窗口(並且您的意圖是最終繪製到該窗口上),那麼您可以將該窗口句柄傳遞給另一個進程,並在此過程中使用GetDc獲取HDC。有了這個HDC,你就可以畫到另一個過程的窗口上。