CreateFileMapping以“磁盘空间不足”错误结束

我有一个理解如何使用API​​函数CreateFileMapping(...)

我一直在试图映射一个小文件,然后扭转它的内容。 它只有大约1 Kb,但我一直得到“没有足够的内存”的错误。

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

然后我打电话给:

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

我怀疑问题是传递fileSize + 1作为fileSize + 1fileSize + 1 ,但我很难理解我应该传递给它。

任何提示都非常感谢!

dwFileOffsetHighdwFileOffsetLow是两个32位值,它们组合形成一个64位值。 这个函数是以这种方式实现的,因为它在64位编译器上支持广泛的编译器。

我认为你的误解是相信高低意味着上限和下限。

在你的情况下,你的值(假设fileSize约为1KB) fileSize不需要64位,所以你应该通过fileSize+1fileSize+10fileSize+1

但是,如果您试图映射整个文件,则可以简单地将两个参数都传递给0

从文档 :

dwMaximumSizeHigh [in]

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

dwMaximumSizeLow [in]

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

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

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

您正试图创建一个非常大的文件映射。 dwFileOffsetHightdwFileOffsetLow是64位积分的高32位和低32位分量。 而是使用GetFileSizeEx来获取文件大小的两个组件。