CreateFileMapping заканчивается ошибкой «Недостаточно места на диске» - PullRequest
3 голосов
/ 18 октября 2011

У меня проблема с пониманием того, как использовать функцию API CreateFileMapping(...).

Я пытался отобразить небольшой файл и затем обратить его содержимое. У него всего около 1 Кб, но я получаю сообщение об ошибке «Недостаточно памяти».

Я открыл файл, позвонив по номеру CreateFile и получил его размер с помощью GetFileSize.

Тогда я звоню:

CreateFileMapping(fileHandle, 
                  NULL, 
                  PAGE_READWRITE | SEC_RESERVE, 
                  fileSize + 1, 
                  fileSize + 1, 
                  NULL);

Я подозреваю, что проблема в том, чтобы передать fileSize + 1 как dwFileOffsetHigh и dwFileOffsetLow, но мне трудно понять, что мне вместо этого передать.

Любые советы приветствуются!

Ответы [ 2 ]

5 голосов
/ 18 октября 2011

dwFileOffsetHigh и dwFileOffsetLow - это два 32-битных значения, которые объединяются в одно 64-битное значение.Эта функция была реализована таким образом, потому что она предшествует широко распространенной поддержке компилятора для 64-битных значений.

Я думаю, что ваше недоразумение заключается в том, что вы считаете, что верхний и нижний верхний и нижний пределы означают верхний и нижний пределы.

ВВ вашем случае ваше значение (при условии, что fileSize составляет около 1 КБ) далеко не требует 64 бит, поэтому вы должны передать fileSize+1 для dwFileOffsetLow и 0 для dwFileOffsetHigh.

Однако, если выпытаясь отобразить весь файл, вы можете просто передать 0 для обоих параметров.

Из документации :

dwMaximumSizeHigh [in]

Старшее DWORD максимального размера объекта сопоставления файлов.

dwMaximumSizeLow [in]

Старшее DWORDмаксимального размера объекта сопоставления файлов.

Если этот параметр и dwMaximumSizeHigh равны 0 (нулю), максимальный размер объекта сопоставления файлов равен текущему размеру файла, который идентифицирует hFile.

попыткасопоставить файл с длиной 0 (ноль) не удается с кодом ошибки ERROR_FILE_INVALID.Приложения должны проверять файлы длиной 0 (ноль) и отклонять эти файлы.

0 голосов
/ 18 октября 2011

Вы пытаетесь создать очень большое сопоставление файлов.dwFileOffsetHight и dwFileOffsetLow - это старшие и младшие 32-битные компоненты 64-битного интеграла.Вместо этого используйте GetFileSizeEx, чтобы получить оба компонента размера файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...