CreateFileMapping 函数出现“磁盘空间不足”错误。

3

我在使用API函数CreateFileMapping(...)时遇到了问题。

我一直在尝试映射一个小文件,然后反转它的内容。它只有约1KB大小,但我一直收到“内存不足”的错误提示。

我通过调用CreateFile打开了文件,并使用GetFileSize获取了文件的大小。

然后我调用:

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

我怀疑问题出在将fileSize + 1作为dwFileOffsetHighdwFileOffsetLow传递时,但我很难理解应该传递什么。任何提示都将不胜感激!
2个回答

5

dwFileOffsetHighdwFileOffsetLow是两个32位的值,它们组合成一个64位的值。这种实现方式是因为在广泛使用64位值的编译器之前就已经存在了。

我认为你误解了高和低的意思,以为它们代表上限和下限。

在你的情况下,假设fileSize大约为1KB,你的值远远不需要64位,因此应该将fileSize+1传递给dwFileOffsetLow,并将0传递给dwFileOffsetHigh

但是,如果你要尝试映射整个文件,可以直接将两个参数都传递为0

来自文档

dwMaximumSizeHigh [in]

文件映射对象的最大大小的高位DWORD。

dwMaximumSizeLow [in]

文件映射对象的最大大小的低位DWORD。

如果此参数和dwMaximumSizeHigh都为0(零),则文件映射对象的最大大小等于hFile所标识的文件的当前大小。

尝试映射长度为0(零)的文件将失败,并返回ERROR_FILE_INVALID错误代码。应用程序应该测试长度为0(零)的文件并拒绝这些文件。


谢谢,我觉得大概就是这样。我读了它,但不知怎么就是理解不了。感谢您为我澄清! - Alexandar Živkovič

0
您正在尝试创建一个非常大的文件映射。 dwFileOffsetHightdwFileOffsetLow 是 64 位整数的高位和低位 32 位组件。请改用 GetFileSizeEx 来获取文件大小的两个组件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接