Windows中利用共享內存來實現不同進程間的通信


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則負責將用戶的指令傳入到內存中,這樣就實現交互了。

 

四、注意事項:

  1. 參數一定要細心別寫錯了。
  2. 如果實現兩進程之間的交流問題,比如 A <--> B相互發消息,建議開辟兩塊內存,一塊 A-->B,另一塊 B-->A,否則可能被占用或修改(起碼至少要用鎖來同步)。在其余通信開發時這個問題也應該注意到。

五、源代碼:

  參考下面博客,注意其在B進程也調用CreateFileMapping()來創建一個已經存在的內核對象,此時,其會返回該內核對象(並不會出錯,同時GetLastError()函數返回ERROR_ALREADY_EXISTS值。

  https://blog.csdn.net/stpeace/article/details/39534361

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM