Программа Visual C ++ 6 (не .NET) в Windows (2008 R2) возвращает «Код ошибки: 6, Сведения об ошибке: дескриптор недействителен» при попытке записи в файл. Файл создан, но пуст из-за ошибки.
Учетная запись пользователя Windows, на которой запущена программа, является администратором на компьютере. По словам пользователя, ошибка «только что началась».
Снова, файл создан и, кажется, имеет правильные права доступа и владельца. Файл открывается с помощью fopen и записывается с помощью fwrite.
Почему происходит ошибка?
Это связано с групповой политикой?
Где мне начать искать?
Код, возвращающий ошибку:
m_stream = fopen(m_sLogFile, m_sMode);
if ( m_stream == NULL )
{
dwErrorCode = ::GetLastError();
if (dwErrorCode != ERROR_ALREADY_EXISTS &&
dwErrorCode != ERROR_SUCCESS)
{
CaptureError(this->FormatErrorCode (dwErrorCode));
return FALSE;
}
}
Это ПОСЛЕ файла был создан …
hFile = CreateFile((LPCTSTR) sPathName, // file name
GENERIC_ALL, // access mode
FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
NULL, // SD
CREATE_ALWAYS, // how to create
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH |
FILE_FLAG_SEQUENTIAL_SCAN, // file attributes
NULL); // handle to template file
Вы злоупотребляете GetLastError
, Вы можете использовать его только для получения кода ошибки функции API Windows, которая завершилась ошибкой (и только для тех функций API, которые документируют GetLastError
может быть использован для получения кода ошибки). Вы не можете надежно использовать его для получения дополнительной информации о сбое стандартной функции библиотеки C. Вместо этого вам нужно использовать интерфейс, определенный стандартом C, errno
переменная, упомянутая Хансом Пассантом в его комментарии.
Причина, по которой вы не можете использовать GetLastError
это связано с тем, что для реализации функции функции библиотеки C может потребоваться выполнить несколько вызовов функций Windows API. Нет гарантии, что последний вызванный API будет генерировать значимый код ошибки в контексте всей операции. Также возможно, что API не вызывается, если, например, вы превысили количество открытых файлов, поддерживаемых реализацией C времени выполнения.