C++ 解释了dwFileOffsetHigh和dwFileOffsetLow

C++ 解释了dwFileOffsetHigh和dwFileOffsetLow,c++,64-bit,C++,64 Bit,我正在尝试将文件写入磁盘,但当我尝试写入大于4G字节的文件时,它会崩溃。我目前正在使用该呼叫: fileMap= CreateFileMapping( fileHandle, NULL, PAGE_READWRITE, 0, (DWORD)size, NULL ); 我相信这就是问题所在。在阅读文档时,它说我可以使用dwMaximumSizeHigh和dwMaximumSizeLow通过此调用保存64位大小的文件。我有点困惑,这些是如何工作的 这说明“dwFileOffsetHigh和dwFi

我正在尝试将文件写入磁盘,但当我尝试写入大于4G字节的文件时,它会崩溃。我目前正在使用该呼叫:

fileMap= CreateFileMapping( fileHandle, NULL, PAGE_READWRITE, 0, (DWORD)size, NULL );
我相信这就是问题所在。在阅读文档时,它说我可以使用dwMaximumSizeHigh和dwMaximumSizeLow通过此调用保存64位大小的文件。我有点困惑,这些是如何工作的

这说明“dwFileOffsetHigh和dwFileOffsetLow是两个32位的值,它们组合在一起形成一个64位的值。”


那么,我如何将一个值传递给这个函数,以便为一个64位文件创建一个足够大的文件映射呢?我试着为min和max输入两个(DWORD)大小,但仍然崩溃。如何使用此函数创建大于32位大小的文件?

按如下方式提取低部分和高部分:

uint64_t size = ...;
uint32_t sizeLow = size & 0xffffffff;
uint32_t sizeHigh = size >> 32;

按如下方式提取高低部分:

uint64_t size = ...;
uint32_t sizeLow = size & 0xffffffff;
uint32_t sizeHigh = size >> 32;

从64位整数中提取32位部分的最简单、最清晰的方法是使用或,如图所示:


从64位整数中提取32位部分的最简单、最清晰的方法是使用或,如图所示:


这不是复制品!我找到了那个帖子,不确定如何使用它来传递到这个函数中。请不要关闭。你问,“那么我如何形成一个64位的值呢?”它就在你最后一段的纯文本中。你是想问别的吗?我编辑了这个问题。你试着传递了什么值?对于您提供的尺寸,误差是否准确?这不是重复的!我找到了那个帖子,不确定如何使用它来传递到这个函数中。请不要关闭。你问,“那么我如何形成一个64位的值呢?”它就在你最后一段的纯文本中。你是想问别的吗?我编辑了这个问题。你试着传递了什么值?你提供的尺寸误差是否准确?我想你的意思是。我也不明白您为什么不喜欢使用实际的MSDN文档。@DavidHeffernan我认为使用示例比易于查找的union文档更有帮助。但是你关于未签名HighPart的观点非常值得修正。这非常有效,谢谢!虽然ULARGE_整数给出了一个高部分,它是一个DWORD,而大的_整数给出了一个长部分,它更适合该方法。@marsh不客气。但我不明白为什么一个
LONG
会更好,因为它需要两个
DWORD
值才能获得最大大小。是的,你说得很对,很抱歉,我刚才看到了我稍后使用的另一个函数。我想你的意思是。我也不明白您为什么不喜欢使用实际的MSDN文档。@DavidHeffernan我认为使用示例比易于查找的union文档更有帮助。但是你关于未签名HighPart的观点非常值得修正。这非常有效,谢谢!虽然ULARGE_整数给出了一个高部分,它是一个DWORD,而大的_整数给出了一个长部分,它更适合该方法。@marsh不客气。但我不明白为什么一个
LONG
会更好,因为它需要两个
DWORD
值才能获得最大大小。是的,你说得很对,很抱歉,我正在查看我稍后使用的另一个函数。