CreateFileMapping的MSDN翻譯和使用心得 (轉)

gugu99發表於2008-08-05
CreateFileMapping的MSDN翻譯和使用心得 (轉)[@more@]

測試建立和開啟對映的時候老是得到"控制程式碼無效"的錯誤, 仔細看了MSDN以後才發覺是認識不透, 這裡把相關的解釋翻譯出來

HANDLE CreateFileMap(
 HANDLE hFile, //物理檔案控制程式碼
 LPSECURITY_ATTRIBUTES lpAttributes, //設定
 D flProtect, //保護設定
 DWORD dwMaximumSizeHigh, //高位檔案大小
 DWORD dwMaximumSizeLow, //低位檔案大小
 LPCTSTR lpName //共享名稱
);

1) 物理檔案控制程式碼
 任何可以獲得的物理檔案控制程式碼, 如果你需要建立一個物理檔案無關的記憶體對映也無妨, 將它設定成為 0xFFFFFFFF(INVALID_HANDLE_VALUE)就可以了.

 如果需要和物理檔案關聯, 要確保你的物理檔案建立的時候的訪問和"保護設定"匹配, 比如: 物理檔案只讀, 記憶體對映需要讀寫就會發生錯誤. 推薦你的物理檔案使用獨佔方式建立.

 如果使用 INVALID_HANDLE_VALUE, 也需要設定需要申請的記憶體空間的大小, 無論物理檔案控制程式碼引數是否有效, 這樣 CreateFileMapping 就可以建立一個和物理檔案大小無關的記憶體空間給你, 甚至超過實際檔案大小, 如果你的物理檔案有效, 而大小引數為0, 則返回給你的是一個和物理檔案大小一樣的記憶體空間地址範圍. 返回給你的檔案對映地址空間是可以透過複製, 整合或者命名得到, 初始內容為0.

2) 保護設定
 就是安全設定, 不過一般設定NULL就可以了, 使用預設的安全. 在下如果需要進行限制, 這是針對那些將記憶體檔案對映共享給整個上面的應用程式使用是, 可以考慮進行限制.

3) 高位檔案大小
 弟兄們, 我想目前我們的機器都是32位的東東, 不可能得到超過32位程式所能定址的私有32位地址空間, 一般還是設定0吧, 我沒有也不想嘗試將它設定超過0的情況.
4) 低位檔案大小
 這個還是可以進行設定的, 不過為了讓其他共享知道你申請的檔案對映的相關資訊, 我使用的時候是在獲得的地址空間頭部新增一個結構化描述資訊, 記錄記憶體對映的大小, 名稱等, 這樣實際申請的空間就比輸入的增加了一個頭資訊結構大小了, 我認為這樣類似BSTR的方式應該是比較合理的.

5) 共享記憶體名稱
 這個就是我今天測試的時候碰壁的禍根, 因為為了對於記憶體進行互斥訪問, 我設定了一個互斥控制程式碼, 而名稱我選擇和命名共享記憶體同名, 之下就是因為他們使用共同的namespace導致了錯誤, 呵呵.

7) CreateFileMapping的時候GetLastError的對應錯誤
 ERROR_FILE_INVALID 如果企圖建立一個零長度的檔案對映, 應有此報
 ERROR_INVALID_HANDLE 如果發現你的命名記憶體空間和現有的記憶體對映, 互斥量, 訊號量, 臨界區同名就麻煩了
 ERROR_ALREADY_EXISTS 表示記憶體空間命名已經存在

8) 相關服務或者平臺的命名保留
 Tenal Services:
 命名可以包含 "Global" 或者 "Local" 字首在全域性或者會話名空間初級檔案對映. 其他部分可以包含任何除了()以外的字元, 可以參考 Kernel Name Spaces.

  2000 or later:
 如果 Terminal Services 沒有執行 "Global" 和 "Local" 字首的特殊含義就被忽略了


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1008539/,如需轉載,請註明出處,否則將追究法律責任。

相關文章