2013-10-14 91 views
0

請您幫助我瞭解在本地/全局命名空間中是否可以有2個共享內存對象具有相同的名稱?我知道如果我們第一次創建了共享內存對象,那麼我們需要調用OpenFileMapping/MapViewOfFile來打開一個對象。如果我在已創建的對象上調用CreateFileMapping會發生什麼?我可以使用相同的名稱在本地命名空間中創建共享內存(使用CreateFileMapping)嗎?

例如 的CreateFileMapping(INVALID_HANDLE_VALUE,//使用分頁文件 NULL,//默認安全 PAGE_READWRITE,//讀/寫訪問 0,//最大對象大小 的sizeof(BackupData),//緩衝區大小
「共享存儲器」 ); //映射對象

感謝的名義,

+0

從[MSDN頁面](http://msdn.microsoft.com/zh-cn/library/aa366537%28VS.85%29.aspx):*如果對象在函數調用之前存在,則函數返回現有對象的句柄(使用當前的大小,而不是指定的大小),'GetLastError'返回'ERROR_ALREADY_EXISTS'。* –

+0

測試非常簡單,只需嘗試而不是詢問即可。 –

+0

@SeanCline - 謝謝 – HVar

回答

1

MSDN documentationCreateFileMapping告訴你,你需要知道到底是什麼:

msdn

所以你無法在同一使用相同的名稱名稱空間(全局或本地)。你甚至不能爲不同類型的內核對象使用相同的名稱。

如果您嘗試創建一個與現有文件映射具有相同名稱的新文件映射,它將嘗試打開現有文件映射(取決於您的頁面保護屬性)。如果這是成功的,那麼獲得對現有對象的句柄,但您還將從GetLastError得到返回值ERROR_ALREADY_EXISTS

如果你從邏輯上思考它,你可以在進程之間共享一個文件映射的唯一方法是使用相同的名稱,所以使用兩個不同的具有相同名稱的映射是毫無意義的!

+0

感謝您的解釋。完全同意創建具有相同名稱的共享對象沒有任何意義。只是爲了澄清,如果我不調用GetLastError並假定返回的句柄是已打開的對象,那麼MapViewFile會工作嗎? – HVar

+1

@HVar是的,只要它尊重最初創建的映射的大小,而不是您在「打開」時指定的大小。 –

+0

謝謝。請記住:) – HVar

相關問題