Вы отображаете представление со смещением файла 0, игнорируя параметр pos
, который предположительно является желаемым смещением файла.
MapViewOfFile()
принимает 64-битное смещение в качестве входных данных, разбитое на 32-битные низкие и высокие значения , size_t
может быть 32-битным или 64-битным типом, в зависимости от компилятора и платформы. Сначала вы можете поместить желаемое смещение в ULARGE_INTEGER
, что даст вам низкие и высокие значения, которые вы можете затем присвоить MapViewOfFile()
.
Обратите внимание, что смещение файла, которое вы задаете для MapViewOfFile()
, должно быть кратность гранулярности системы распределения. См. Создание представления в файле на MSDN для получения подробной информации о том, как с этим справиться.
Попробуйте что-то вроде этого:
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD SysGran = SysInfo.dwAllocationGranularity;
...
const std::vector<BYTE>& ReadFile(size_t pos)
{
size_t MapViewStart = (pos / SysGran) * SysGran;
DWORD MapViewSize = (pos % SysGran) + bufferSize;
DWORD ViewDelta = pos - MapViewStart;
ULARGE_INTEGER ulOffset;
ulOffset.QuadPart = MapViewStart;
memory = Mapper_Winapi_Uptr{ static_cast<BYTE*>(MapViewOfFile(mapping, FILE_MAP_READ, ulOffset.HighPart, ulOffset.LowPart, bufferSize)) };
if (!memory.get()) {
// error handling ...
}
std::memcpy(&data[0], &(memory.get())[ViewDelta], bufferSize);
return data;
}