CreateFileMapping以“没有足够的磁盘空间”错误结束

时间:2011-10-17 21:40:30

标签: c windows api mapping

我在理解如何使用API​​函数CreateFileMapping(...)时遇到了问题。

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

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

然后我打电话给:

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

我怀疑问题在于将fileSize + 1作为dwFileOffsetHighdwFileOffsetLow传递,但我很难理解应该将其传递给它。

非常感谢任何提示!

2 个答案:

答案 0 :(得分:5)

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

我认为你的误解是相信高低平均上限和下限。

在您的情况下,您的值(假设fileSize大约为1KB)远远不需要64位,因此您应该fileSize+1 dwFileOffsetLow0 dwFileOffsetHigh }}

但是,如果您尝试映射整个文件,则只需为0传递两个参数。

来自documentation

  

dwMaximumSizeHigh [in]

     

最大尺寸的高阶DWORD   文件映射对象。

     

dwMaximumSizeLow [in]

     

最大尺寸的低阶DWORD   文件映射对象。

     

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

     

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

答案 1 :(得分:0)

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