2011-10-17 138 views
3

我在理解如何使用API​​函數CreateFileMapping(...)時遇到問題。CreateFileMapping以「磁盤空間不足」結束

我一直在試圖映射一個小文件,然後扭轉它的內容。它只有大約1Kb,但我一直得到「內存不足」的錯誤。

我已打開該文件,請致電CreateFile,並通過GetFileSize瞭解它的尺寸。

然後我打電話:

CreateFileMapping(fileHandle, 
        NULL, 
        PAGE_READWRITE | SEC_RESERVE, 
        fileSize + 1, 
        fileSize + 1, 
        NULL); 

我懷疑問題是經過fileSize + 1dwFileOffsetHighdwFileOffsetLow,但我有一個很難理解我應該怎麼傳遞給它來代替。

任何提示,非常感謝!

回答

5

dwFileOffsetHighdwFileOffsetLow是兩個32位值組合形成一個單一的64位值。這個函數是用這種方式實現的,因爲它在64位數據庫中支持廣泛的編譯器。

我認爲你的誤解是認爲高低意味着上限和下限。

在你的情況你的價值(假設fileSize約爲1KB)是隔靴搔癢,需要64位,所以你應該通過fileSize+1dwFileOffsetLow0dwFileOffsetHigh

但是,如果您試圖映射整個文件,則可以簡單地通過0這兩個參數。

documentation

dwMaximumSizeHigh [IN]

的 文件映射對象的最大尺寸的高階DWORD。

dwMaximumSizeLow [IN]

的 文件映射對象的最大尺寸的低階DWORD。

如果此參數和dwMaximumSizeHigh爲0(零),則文件映射對象的最大大小 等於hFile標識的文件 的當前大小。

嘗試映射長度爲0(零)的文件失敗,並顯示錯誤 代碼ERROR_FILE_INVALID。應用程序應測試長度爲0(零)的文件,並拒絕這些文件。

+0

謝謝,我認爲這是沿着這些線。我讀過它,但無法理解它。謝謝你讓我清楚! –

0

您正試圖創建一個非常大的文件映射。 dwFileOffsetHightdwFileOffsetLow是64位積分的高和低32位分量。改爲使用GetFileSizeEx來獲取文件大小的兩個組件。

相關問題