如何在地图文件视图中设置 dwFileOffsetHigh 和 dwFileOffsetLow 值?

How to set dwFileOffsetHigh & dwFileOffsetLow values in a map file view?

我是内存映射的新手,我想做的是在多个线程之间共享一个映射文件,为此我需要创建映射文件并使用函数:MapViewOfFile 所以每个线程可以访问文件的一部分,当然我需要将视图的偏移量发送到尊重分配粒度的每个线程。但我不明白的部分是:dwFileOffsetHigh & dwFileOffsetLow。 MSDN 说:

The combination of the high and low offsets must specify an offset within the file mapping.

那么我如何设置这两个参数的值才能指定正确的偏移量。我是否需要进行任何计算或只使用变量并由系统处理其余部分(查找偏移量)?,我真的坚持这个,每次尝试都会出现异常。因此,假设我知道每个视图的偏移量和大小,我怎么可能知道这些参数的值呢?一个例子值得一千个解释。以下是对我正在尝试做的事情的解释:

// The main thread create map file and specify the view for every worker thread:
WorkerThreads[i] := WorkerThread.create(...,bloc_offset,bloc_size,...); // So each worker writes in a specified view.
//The worker thread then opens the view and writes data in:
data := mapViewOfFile(mapfileH, FILE_MAP_WRITE, dwFileOffsetHigh, dwFileOffsetLow, blocSize);`

感谢您的回答。

如果您的文件大小 <= 2GB,您可以将所需的偏移量作为 DWORD 传递给每个线程,然后每个线程可以将其偏移量直接分配给 dwFileOffsetLow 并设置 dwFileOffsetHigh 到 0.

pView := MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, offset, size);

如果您的文件大小大于 2GB,将所需的偏移量作为 Int64UInt64 传递给每个线程,然后使用 ULARGE_INTEGER 变量分解值分为低和高分量,然后可以将其分配给 dwFileOffsetLowdwFileOffsetHigh.

var
  ul: ULARGE_INTEGER;

ul.QuadPart := offset;
pView := MapViewOfFile(hMapping, FILE_MAP_WRITE, ul.HighPart, ul.LowPart, size);