Низкое смещение файла карты памяти - PullRequest
3 голосов
/ 21 декабря 2011

Я пишу программу для Windows с C и Visual Studio.Я должен отобразить файл, а затем получить к нему доступ с 750-го байта.Я попытался

pFile = (char *) MapViewOfFile(hMMap,FILE_MAP_ALL_ACCESS,0,(DWORD) 750,0)

открыть файл с этим, но он возвращает ошибку 1132.

ERROR_MAPPED_ALIGNMENT 1132 (0x46C) Базовый адрес или указанное смещение файла не имеют правильного выравнивания.

Как можно решить эту проблему?

Ответы [ 3 ]

4 голосов
/ 21 декабря 2011

В документации MapViewOfFile довольно ясно, что смещение должно быть кратным гранулярности распределения (обычно я думаю, что это 64 КБ, но для получения истинного фактического значения, как указано в документации, вызывается GetSystemInfo).

Так как 750 меньше, чем гранулярность выделения, вам придется сопоставить файл с 0. Если вам действительно нужен указатель на 750-й байт, просто увеличьте указатель

pFile = (char *) MapViewOfFile(hMMap,FILE_MAP_ALL_ACCESS,0,(DWORD) 0,0);
char* pBuffer = pFile + 750;

Вам понадобится второй буфер, потому что вам нужно будет передать pFile в UnmapViewOfFile

2 голосов
/ 21 декабря 2011

Я предполагаю, что вам нужно получить доступ к файлу с его 750-го байта, а не то, что вы должны создать карту с этим смещением. Как вы обнаружили, вы не можете сделать это, потому что смещение, которое вы передаете MapViewOfFile, должно быть кратным системной "гранулярности распределения", которую вы можете получить из GetSystemInfo, но, как правило, должно быть не менее 4 КБ, IIRC.

Вы можете создать представление файла, который начинается с байта 0 и просто считывается с 750 байтов после возвращенного адреса.

1 голос
/ 21 декабря 2011

Смещение в файле должно быть кратным 4 КБ (поэтому 750 не работает)

Вам, вероятно, будет лучше сопоставить файл с 0 и просто сместить 750 от сопоставленного адреса.

...