我在理解如何使用API函数CreateFileMapping(...)
时遇到了问题。
我一直在尝试映射一个小文件然后反转它的内容。它只有大约1 Kb,但我不断收到“内存不足”错误。
我通过调用CreateFile
打开了该文件,并使用GetFileSize
获得了它的大小。
然后我打电话给:
CreateFileMapping(fileHandle,
NULL,
PAGE_READWRITE | SEC_RESERVE,
fileSize + 1,
fileSize + 1,
NULL);
我怀疑问题在于将fileSize + 1
作为dwFileOffsetHigh
和dwFileOffsetLow
传递,但我很难理解应该将其传递给它。
非常感谢任何提示!
答案 0 :(得分:5)
dwFileOffsetHigh
和dwFileOffsetLow
是两个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的代码。应用程序应使用a测试文件 长度为0(零)并拒绝这些文件。
答案 1 :(得分:0)
您正在尝试创建一个非常大的文件映射。 dwFileOffsetHight
和dwFileOffsetLow
是64位积分的高32位组件和低32位组件。请使用GetFileSizeEx
来获取文件大小的两个组件。