CreateFileMapping

CreateFileMapping函式用於創建一個檔案映射核心對象

基本介紹

  • 中文名:CreateFileMapping
  • 頭檔案: Winbase.h
  • 創建:新的檔案映射核心對象
  • Function :CreateFileMapping
  • ByValSECURITY_ATTRIBUTES
聲明,說明,返回值,參數表,詳細說明,

聲明

Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, lpFileMappigAttributes As SECURITY_ATTRIBUTES, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long.
HANDLE WINAPI CreateFileMapping(_In_HANDLE hFile,_In_opt_LPSECURITY_ATTRIBUTES lpAttributes,_In_DWORD flProtect,_In_DWORD dwMaximumSizeHigh,_In_DWORD dwMaximumSizeLow,_In_opt_LPCTSTR lpName);

說明

創建一個新的檔案映射核心對象

返回值

Long,新建檔案映射對象的句柄;零意味著出錯。會設定GetLastError。即使函式成功,但倘若返回的句柄屬於一個現成的檔案映射對象,那么GetLastError也會設定成ERROR_ALREADY_EXISTS。在這種情況下,檔案映射的長度就是現有對象的長度,而不是這個函式指定的尺寸。

參數表

hFile:Long,指定欲在其中創建映射的一個檔案句柄。0xFFFFFFFF(-1,即INVALID_HANDLE_VALUE)表示在頁面檔案中創建一個可共享的檔案映射。
lpFileMappigAttributes:SECURITY_ATTRIBUTES,它指明返回的句柄是否可以被子進程所繼承,指定一個安全對象,在創建檔案映射時使用。如果為NULL(用ByVal As Long傳遞零),表示使用默認安全對象。
flProtect:Long,下述常數之一:
PAGE_READONLY 以唯讀方式打開映射
PAGE_READWRITE 以可讀、可寫方式打開映射
PAGE_WRITECOPY 為寫操作留下備份
可組合使用下述一個或多個常數:
SEC_COMMIT 為檔案映射一個小節中的所有頁分配記憶體
SEC_IMAGE 檔案是個執行檔
SEC_RESERVE 為沒有分配實際記憶體的一個小節保留虛擬記憶體空間
dwMaximumSizeHigh:Long,檔案映射的最大長度的高32位。
dwMaximumSizeLow:Long,檔案映射的最大長度的低32位。如這個參數和dwMaximumSizeHigh都是零,就用磁碟檔案的實際長度。
lpName:String,指定檔案映射對象的名字。如存在這個名字的一個映射,函式就會打開它。用vbNullString可以創建一個無名的檔案映射。
調用CreateFileMapping的時候可能會出現的GetLastError的相應錯誤:
ERROR_FILE_INVALID (錯誤_檔案_無效)如果企圖創建一個零長度的檔案映射
ERROR_INVALID_HANDLE(錯誤_無效_處理) 記憶體空間的命名和現有的記憶體映射,互斥量信號量臨界區有同名
ERROR_ALREADY_EXISTS (錯誤或已經存在)表示記憶體空間命名已經存在
在調用CreateFileMapping()時,可以用GetLastError()來檢查其返回的錯誤信息。如果返回值為ERROR_ALREADY_EXISTS,則表示記憶體映射對象指定名字已經存在。有關其他返回值的意義見MSDN的詳細說明。

詳細說明

HANDLE CreateFileMapping(HANDLE hFile, //物理檔案句柄LPSECURITY_ATTRIBUTES lpAttributes, //安全設定DWORD flProtect, //保護設定DWORD dwMaximumSizeHigh, //高位檔案大小DWORD dwMaximumSizeLow, //低位檔案大小LPCTSTR lpName //共享記憶體名稱);
1) 物理檔案句柄
任何可以獲得的物理檔案句柄, 如果你需要創建一個物理檔案無關的記憶體映射也無妨, 將它設定成為 0xFFFFFFFF(INVALID_HANDLE_VALUE)就可以了。
如果需要和物理檔案關聯, 要確保你的物理檔案創建的時候的訪問模式和"保護設定"匹配,比如: 物理檔案唯讀, 記憶體映射需要讀寫就會發生錯誤。 推薦你的物理檔案使用獨占方式創建。
如果使用 INVALID_HANDLE_VALUE, 也需要設定需要申請的記憶體空間的大小, 無論物理檔案句柄參數是否有效, 這樣 CreateFileMapping 就可以創建一個和物理檔案大小無關的記憶體空間給你, 甚至超過實際檔案大小, 如果你的物理檔案有效, 而大小參數為0, 則返回給你的是一個和物理檔案大小一樣的記憶體空間地址範圍。 返回給你的檔案映射地址空間是可以通過複製, 集成或者命名得到, 初始內容為0。
2) 保護設定
就是安全設定, 不過一般設定NULL就可以了, 使用默認的安全配置。 在win2k下如果需要進行限制, 這是針對那些將記憶體檔案映射共享給整個網路上面的套用進程使用時, 可以考慮進行限制。
3) 高位檔案大小
親們, 我想目前我們的機器都是32位的東東, 不可能得到超過32位進程所能定址的私有32位地址空間, 一般還是設定0吧, 我沒有也不想嘗試將它設定超過0的情況。
4) 低位檔案大小
這個還是可以進行設定的, 不過為了讓其他共享用戶知道你申請的檔案映射的相關信息, 我使用的時候是在獲得的地址空間頭部添加一個結構化描述信息, 記錄記憶體映射的大小, 名稱等, 這樣實際申請的空間就比輸入的增加了一個頭信息結構大小了, 我認為這樣類似BSTR的方式應該是比較合理的。
如果為了對記憶體進行互斥訪問,設定了一個互斥句柄, 而名稱選擇和命名共享記憶體同名, 他們使用共同的namespace,會導致錯誤。
6) 調用CreateFileMapping的時候GetLastError的對應錯誤
ERROR_FILE_INVALID 如果企圖創建一個零長度的檔案映射, 應有此報
ERROR_INVALID_HANDLE 如果發現你的命名記憶體空間和現有的記憶體映射, 互斥量,信號量臨界區同名就麻煩了
ERROR_ALREADY_EXISTS 表示記憶體空間命名已經存在
7) 相關服務或者平台的命名保留Terminal Services:
命名可以包含 "Global" 或者 "Local" 前綴在全局或者會話名空間初級檔案映射。 其他部分可以包含任何除了()以外的字元, 可以參考 Kernel Object Name Spaces。

相關詞條

熱門詞條

聯絡我們