CreateFileMapping的MSDN翻譯和使用心得 (轉)
測試建立和開啟對映的時候老是得到"控制程式碼無效"的錯誤, 仔細看了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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於 Service 設計初步(MSDN節選翻譯) (轉)
- 翻譯的未來:翻譯機器和譯後編譯編譯
- 翻譯 | 開始使用 TypeScript 和 ReactTypeScriptReact
- 翻譯:EJB in a Nutshell (轉)
- 經譯者同意,轉發《網際網路創業啟示錄》翻譯心得:一點激動創業
- [譯] 使用 Flutter 製作 3D 翻轉動畫Flutter3D動畫
- 轉:LogMiner安裝和使用的一些心得
- 使用google翻譯 api 翻譯中文成其他語言GoAPI
- MOSES翻譯系統的訓練,調優和使用
- Yurii談翻譯(十一)怎樣翻譯更地道:and不是“和”
- 【翻譯】使用React、 Redux 和 SVG 開發遊戲(三)ReactReduxSVG開發遊戲
- 【翻譯】使用React、 Redux 和 SVG 開發遊戲(一)ReactReduxSVG開發遊戲
- Python 使用白嫖網易翻譯 API 進行翻譯PythonAPI
- 轉載:翻譯的寧靜工程 (節選)
- Delphi6的新特性[翻譯] (轉)
- Yurii談翻譯(五)怎樣翻譯更地道:so…that…的翻譯
- 使用 JavaScript 壓縮和翻轉圖片JavaScript
- 轉載10gocp翻譯Go
- [譯] 使用 Nexmo 和微軟語音翻譯 API 構建 Babel Fish微軟APIBabel
- Win Form 的 Splitter 使用心得 (轉)ORM
- Yurii談翻譯(九)怎樣翻譯更地道:冠詞a的翻譯
- Yurii談翻譯(十)怎樣翻譯更地道:最高階的翻譯
- 淺談計算機圖書的翻譯——“增值翻譯”的幾個參考例子 (轉)計算機
- ExoPlayer的使用與解析(官方文件翻譯)
- [翻譯] 使用JavaScript實現自己的PromisesJavaScriptPromise
- Kerberos的元件和術語(翻譯和註解)ROS元件
- 保持一個最新的ports樹[翻譯](轉)
- 有關RFC文件的翻譯說明 (轉)
- Yurii談翻譯(六)怎樣翻譯更地道:“as somebody said…”的翻譯AI
- Yurii談翻譯(十三)怎樣翻譯更地道:It is…that…句型諺語的翻譯
- Yurii談翻譯(十四)怎樣翻譯更地道:否定句的翻譯
- 翻譯:展示元件和容器元件元件
- 有趣的翻譯
- 痛苦的翻譯
- 轉一下新浪使用redis的心得Redis
- 看這位“翻譯官-DNS”如何轉換域名和IP地址DNS
- 微信AI翻譯功能使用方法 微信AI翻譯功能在哪?AI
- (翻譯)給iOS開發者的GCD使用手冊iOSGC