2010-05-20 78 views
2

我需要一種方法來暫時存儲某處的值,例如進程A.進程A可以在將值存儲在內存中後退出。過了一段時間後,進程B訪問內存的相同位置並讀取值。我需要存儲在內存中,因爲我不希望數據在重新啓動時保持不變。但只要系統啓動,它就不受過程影響,數據必須可以訪問。我在Windows中嘗試MailSlots和Temporary文件,兩者似乎都有問題,其中過程引用計數下降到零,實體不會在內存中保留。在Windows中最好使用Win32 API的適合的機制是什麼?將值存儲在獨立於進程的內存中

  • Ganesh神

回答

4

編寫在引導時啓動的服務,並讓它產生一些共享內存。 然後可以通過進程A填充此共享內存,然後進程B可以在之後讀取它。

如果您的系統重新啓動,共享內存不見了,並且您擁有全新的共享內存。 確保您的服務正確'初始化'共享內存。

+0

我可以這樣做...... Windows本身是否提供了一些共享服務/設施/ API,讓我存儲的價值,而不是我寫我的共享服務? – Ganesh 2010-05-20 13:10:30

+0

不是我所知道的。 – Patrick 2010-05-20 19:05:01

+0

Windows提供了兩種相關的服務來實現類似的功能 - 在進程結束後,您可以使用註冊表或文件系統來存儲事物。 – Stewart 2010-05-21 05:42:47

1

當ProcessA退出時,數據必須駐留在內存中,而不是存儲在磁盤上的某個地方嗎?我問你提到臨時文件應該工作,除非ProcessA以意想不到的方式失敗。

根據您的需要,提供共享/快速/原子數據的一個好方法是通過ESENT API

0

請嘗試以下操作。我不能說我知道這個作品,但它似乎是合理的。

使用OpenFileMapping在全局名稱空間中創建共享內存文件。然後調用Duplicatehandle,併爲目標進程句柄使用某個進程比活動進程A壽命更長。您可能能夠將句柄添加到winlogon.exe這應該會停止共享內存在進程A終止時被銷燬。然後在進程B中,您可以查找共享內存文件。

+0

將句柄複製到WinLogon中是一個有風險的想法。僅僅因爲有一個叫做winlogon的進程今天一直運行,我不認爲這實際上是記錄在案的。如果它消失,你的應用程序將被破壞。另外,將東西注入到您無法控制的進程中,特別是作爲窗口一部分的進程,通常看起來很危險。 – Stewart 2010-05-21 05:48:05

+0

代碼注入是Windows API的一部分 - 請檢查SetWindowsHookEx。使用Process Explorer我看到KACE Networks和Check Point軟件都已將自己注入到我的機器上的winlogon.exe中。向另一個進程添加句柄是合法的。我的主要觀點是將句柄添加到比進程A生存更長的進程A – 2010-05-21 12:03:52

+0

內存映射文件是一個很好的解決方案。下面是關於創建內存映射文件的MSDN參考以及如何從不同的過程中讀取。它有代碼示例。 http://msdn.microsoft.com/en-us/library/ms810613.aspx – dlb 2010-05-25 20:11:26

0

嗯,我設法創建了一個不會退出的進程上的MailSlot,另外兩個進程可以讀寫客戶端的郵件服務器......即使客戶端退出,Mailslot仍然會有數據... MailSlot服務器使我可以將數據存儲在易失性內存中,只要MailSlot服務器進程已啓動..或操作系統已啓動並在操作系統重新引導時消失...感謝所有想法和幫助... :)