2012-09-27 103 views
1

我想了解一些關於HGLOBAL的事情,因爲我剛發現我認爲是錯的。如何與其他應用程序共享HGLOBAL?

在應用程序A I GlobalAlloc()數據(與GMEM_SHARE|GMEM_MOVABLE)並將字符串​​放在其中。現在,我可以向另一個應用程序提供哪些數據?

我雖然(錯誤地!)那HGLOBAL s爲在所有的進程,這顯然是錯誤的有效的,因爲HGLOBALHANDLE到全局數據,而不是指向全局數據(這就是我說的「天上!「)。

那麼我怎麼能通過HGLOBAL到另一個應用程序?

注意:我想只傳遞一個「指針」到數據,而不是數據本身,就像在剪貼板中一樣。

非常感謝! :-)

+1

您可以先閱讀關於Windows上的IPC。 – rkosegi

+4

'HGLOBAL'是來自16位Windows的保留。他們再也沒有什麼「全球化」了。 –

回答

0

閱讀文檔。隨着32位處理的引入,GlobalAlloc()實際上不再分配全局內存。

要與另一個進程共享一個內存塊,可以使用GlobalAlloc()分配該塊並將其放在剪貼板上,然後讓其他進程檢索它。或者,您也可以使用CreateFileMapping()MapViewOfFile()來分配一個共享內存塊。

2

每個進程「認爲」它擁有計算機上可用的全部內存空間。沒有進程可以「看到」另一個進程的內存空間。因此,通常,另一個流程不能看到流程存儲。

由於可能需要在進程之間傳遞信息,因此存在某些機制來提供此功能。

一種方法是消息傳遞;一個進程向另一個進程發送消息,例如通過管道或套接字或Windows消息。

另一個是共享內存,其中一個給定的內存塊可用於兩個或更多進程,以使其他進程可以看到任何一個進程寫入。

1

(這只是一個很長的批評是對別人已經解釋的Win32採取不同的方法來存儲共享。)

我要說的是,你正在閱讀到Windows上編程的書籍(或教程),這是相當因爲Win16在很長一段時間內幾乎已經死亡。 (3.x)不具有32位(及更高版本)Windows版本提供的內存隔離(或虛擬/平面/地址空間)的概念。內存曾經被分爲本地(進程)和全局部分,它們都生活在同一個全局地址空間中。描述符如HGLOBAL被用來允許內存塊在物理內存中移動並且仍然正確訪問,儘管它們在地址空間中的新位置(在用LocalLock()/正確固定之後)。 Win32使用指針,因爲可以移動物理內存頁面而不影響它們在虛擬地址空間中的位置。由於兼容性的原因,它仍然提供所有的Global*Local* API函數,但不應再使用它們,而應使用通常的堆管理(例如C中的malloc()或C++中的new運算符)。在Win16上還存在幾種不同類型的指針,以反映x86上可用的幾種不同尋址模式 - 接近(相同段),遠(段:偏移量)和巨大(標準化段:偏移量)。您仍然可以在舊版Win16代碼中看到諸如FARPTR之類的東西,這些代碼已移植到Win32,但它們被定義爲空字符串,因爲只有在使用指針時才處於平面模式。

相關問題