Windows中利用共享內存來實現不同進程間的通信
一、msdn詳細介紹
https://docs.microsoft.com/zh-cn/windows/win32/memory/sharing-files-and-memory
二、實現思路講解:
在A進程,我們通過 CreateFileMapping()函數來創建一個文件映射對象(使用 INVAILD_HANDLE_VALUE 來不指定文件句柄),然后調用MapFileOfView()函數來將文件映射對象映射到本進程中,利用copymemory來進行內存讀寫。
在B進程,我們通過 OpenFileMapping()來打開,然后調用MapFileOfView()函數來將文件映射對象映射到本進程中,利用copymemory來進行內存讀寫。
三、應用場景:
兩進程間的數據交換,比如,我們將游戲外掛代碼注入到Game.exe進程中,我們另起一個外掛控制台.exe來控制外掛,此時我們就可以使用共享內存,Game.exe開辟一線程,循環讀取該內存數據並標記,而console.exe則負責將用戶的指令傳入到內存中,這樣就實現交互了。
四、注意事項:
- 參數一定要細心別寫錯了。
- 如果實現兩進程之間的交流問題,比如 A <--> B相互發消息,建議開辟兩塊內存,一塊 A-->B,另一塊 B-->A,否則可能被占用或修改(起碼至少要用鎖來同步)。在其余通信開發時這個問題也應該注意到。
五、源代碼:
參考下面博客,注意其在B進程也調用CreateFileMapping()來創建一個已經存在的內核對象,此時,其會返回該內核對象(並不會出錯,同時GetLastError()函數返回ERROR_ALREADY_EXISTS值。
https://blog.csdn.net/stpeace/article/details/39534361