WriteFile возвращает ошибку 1784 - PullRequest
2 голосов
/ 30 июня 2011

Я создаю программу для заполнения диска фиктивной файловой системой.

В настоящее время я пишу файлы переменных размеров, используя WriteFile.

        WriteFile(hFile, FileData, i * 1024, &dwWrote, NULL);
        err = GetLastError();

err return #1784, что переводится как

Предоставленный пользовательский буфер недопустим для запрошенной операции.ERROR_INVALID_USER_BUFFER

Итак, для первых 24 файлов операция записи работает.Если включен файл № 25, операция записи завершится неудачно.Файлы все еще создаются, но функция WriteFile не заполняет файлы.

Любые идеи о том, как пройти мимо ERROR_INVALID_USER_BUFFER?

Каждая ссылка, которую я могу найти на ошибку, ограничена сбоемпрограммы, и я не могу понять, как это связано с проблемой, с которой я сталкиваюсь.

РЕДАКТИРОВАТЬ:

FileData = (char *) malloc(sizeof(char) * (size_t)k * 1024);
memset(FileData, 245, sizeof(char) * (size_t)k * 1024);

FileData установлен и выделен в размере максимального ожидаемого буфера.i - переменная цикла, которая повторяется до тех пор, пока не увеличится до максимального размера (k).

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

Я предполагаю, что FileData недостаточно для того, чтобы вы могли написать i * 1024 байтов из него.i является ли переменная управления циклом для вашего списка файлов?Если это так, вам понадобится буфер записи FileData для увеличения на 1 Кб за один раз при циклическом просмотре файлов.

Это необычная конструкция.Вы уверены, что логика здесь верна?Отправьте больше кода (в частности, все варианты использования FileData и i) для большей точности ответов.

Обратите внимание, что вы не всегда должны проверять GetLastError здесь - вам нужно проверить WriteFileкод возврата, прежде чем полагаться на это имеет смысл.В противном случае вы могли бы получить ошибку из какой-то не связанной части вашего кода - независимо от того, что завершилось с ошибкой в ​​прошлом.

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

Я получил ошибку = 1784, и это потому, что я открыл файл, не указав размер записей, а затем выполнил чтение блока для файла.

Reset( FileHandle );

Должно быть

Reset( FileHandle, 1 );
...