2012-01-02 95 views
2

如何在Windows中使用win32/mfc在機器上運行的所有進程之間共享設備獨立位圖?跨進程共享位圖

尋找在Windows XP/7機器上的所有進程之間共享DIB的最佳和最快的方式。進程應該能夠鎖定位圖的內容並在該位圖上繪圖,其他進程也可以使用該位圖進行讀取。

例如,最初這個DIB將由主應用程序創建。當其他進程想要在此進程上繪製某些內容時,可以鎖定此DIB的內容並在此位圖上繪製。如果其他進程想要讀取該位圖的內容,可以鎖定位圖並讀取位圖。

請在時間複雜度和空間複雜度方面提出一個最佳方法。空間複雜性意味着,想要在該位圖上繪製內容的過程不需要複製本地內存中的所有內容並繪製,它應該直接能夠在設備上下文中獲取該位圖並繪製位圖。

回答

3

不幸的是,在進程之間共享GDI句柄(比如位圖)沒有支持的方式。

但是有一種支持的方式可以獲得多個位圖(在多個進程中)共享相同的存儲。

在您的主進程中,使用CreateFileMapping API創建一個內存部分。

您可以通過多種方式來獲得部分手柄的各種過程 -

其中最簡單的(如Hans Passant指出的)是調用的CreateFileMapping時......然後使用OpenFileMapping簡單地命名節。 如果您有一個啓動其他進程的主進程,請確保使用SECURITY_ATTRIBUTES的bInheritHandle設置爲TRUE來創建該段,並且該句柄將自動複製到任何子進程中 - 通常會在命令行上傳遞句柄值的新過程。 否則使用DuplicateHandle函數將句柄複製到其他進程中 - 但您仍然需要其他類型的IPC來獲取進程的句柄。

然而,它發生 - 您可以在每個進程中調用CreateDIBSection來創建由同一內存部分支持的GDI位圖。請注意關於同步對位圖的訪問的註釋。如果您有多個進程嘗試寫入位圖,則可能需要對該級別的訪問進行序列化。

  • 作爲一個具有諷刺意味的說明:由於Win32的是基於Win16的也有很多,與窗口消息,並期望HBITMAP的是從多個進程使用那些實際上剪貼板處理Win16的傳統的API。此外,Windows NT 5.x和6.x位圖上的(作爲實現細節)由內核模式驅動程序從單個系統範圍的句柄表中分配,因此在任何進程中都是技術上有效的 - 但是,GDI也會存儲每個進程的進程ID該表中的GDI對象和GDI API調用顯式檢查進程ID,如果在屬於另一進程的GDI句柄上調用,則會失敗。
+1

您可能應該提及CreateFileMapping的lpName參數,可在OpenFileMapping中使用,以使分享變得簡單。 – 2012-01-02 13:40:45

+0

感謝您提醒我簡單的方法。有時候我可以成爲一個idjit。 – 2012-01-02 14:43:57

+0

如何在每個進程中將相同的緩衝區傳遞給CreateDIBSection的每個調用。 – vicky 2012-01-03 14:22:02