我有一个理解如何使用API函数CreateFileMapping(...)
。
我一直在试图映射一个小文件,然后扭转它的内容。 它只有大约1 Kb,但我一直得到“没有足够的内存”的错误。
我通过调用CreateFile
打开文件,并GetFileSize
的大小。
然后我打电话给:
CreateFileMapping(fileHandle, NULL, PAGE_READWRITE | SEC_RESERVE, fileSize + 1, fileSize + 1, NULL);
我怀疑问题是传递fileSize + 1
作为fileSize + 1
和fileSize + 1
,但我很难理解我应该传递给它。
任何提示都非常感谢!
dwFileOffsetHigh
和dwFileOffsetLow
是两个32位值,它们组合形成一个64位值。 这个函数是以这种方式实现的,因为它在64位编译器上支持广泛的编译器。
我认为你的误解是相信高低意味着上限和下限。
在你的情况下,你的值(假设fileSize
约为1KB) fileSize
不需要64位,所以你应该通过fileSize+1
为fileSize+1
和0
为fileSize+1
。
但是,如果您试图映射整个文件,则可以简单地将两个参数都传递给0
。
从文档 :
dwMaximumSizeHigh [in]
文件映射对象的最大大小的高位DWORD。
dwMaximumSizeLow [in]
文件映射对象的最大大小的低位DWORD。
如果此参数和dwMaximumSizeHigh为0(零),则文件映射对象的最大大小等于hFile标识的文件的当前大小。
尝试映射长度为0(零)的文件失败,错误代码为ERROR_FILE_INVALID。 应用程序应测试长度为0(零)的文件并拒绝这些文件。
您正试图创建一个非常大的文件映射。 dwFileOffsetHight
和dwFileOffsetLow
是64位积分的高32位和低32位分量。 而是使用GetFileSizeEx
来获取文件大小的两个组件。