Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Коды ошибок CreateFile


Автор: untrial 23.2.2011, 22:32
При возникновение ошибки CreateFile возвращает INVALID_HANDLE_VALUE, для того чтобы узнать тип ошибки необходимо вызвать GetLastError.
Вопрос какие возможные типы (значения) возвращает GetLastError http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx
Например в *nix системах http://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=open
Код

НАЙДЕННЫЕ ОШИБКИ

EEXIST
    pathname уже существует, но были использованы O_CREAT и O_EXCL. 
EISDIR
    Тип доступа подразумевает запись, а pathname указывает на каталог, (то есть установлены O_WRONLY или O_RDWR). 
EACCES
    Запрошенный доступ к файлу не разрешен, или один из каталогов в pathname не позволяет поиск (выполнение) файла, файл еще не существует, или доступ для записи в родительский каталог не разрешен. 
ENAMETOOLONG
    pathname является слишком длинным. 
ENOENT
    O_CREAT не установлен, а указанный файл не существует. Или не существует каталог в пути pathname, или он является неверной символьной ссылкой. 
ENOTDIR
    Компонент, который обозначен как каталог в pathname, таковым не является, или был указан флаг O_DIRECTORY, а pathname не является каталогом. 
ENXIO
    Установлены O_NONBLOCK | O_WRONLY, файл является каналом FIFO, но нет процессов, которые открыли этот канал для чтения. Возможно также, что файл является файлом устройства, но соответствующее устройство не установлено. 
ENODEV
    pathname ссылается на файл устройства, но соответствующего устройства не существует. (Это ошибка в ядре Linux: должен возвращаться параметр ENXIO). 
EROFS
    Был запрошен доступ к записи, а pathname ссылается на файл, находящийся в системе, предназначенной только для чтения. 
ETXTBSY
    pathname ссылается на файл, который в настоящее время исполняется, и был запрошен доступ к записи. 
EFAULT
    pathname указывает на каталог за пределами доступного адресного пространства. 
ELOOP
    Слишком много символьных ссылок составляют pathname, или был указан флаг O_NOFOLLOW, а pathname является символьной ссылкой. 
ENOSPC
    pathname должен был указать на устройство, в котором отсутствует место для нового файла. 
ENOMEM
    Недостаточно памяти в системе. 
EMFILE
    Процесс уже открыл максимально допустимое количество файлов. 
ENFILE
    Достигнут предел общего количества файлов, открытых в системе. 


Интересет прежде всего аналог ENFILE, ENOMEM.

Автор: Akina 23.2.2011, 23:45
Цитата(untrial @  23.2.2011,  23:32 Найти цитируемый пост)
какие возможные типы (значения) возвращает GetLastError 

Ты даже не представляешь, какая это куча кодов! Вот тебе для затравочки - читай...
http://msdn.microsoft.com/en-us/library/ms681381(v=VS.85).aspx

Автор: alexvs11 23.2.2011, 23:49
но возвращать то она не всех их будет

Автор: untrial 24.2.2011, 00:17
Цитата

Akina

Ты даже не представляешь, какая это куча кодов! Вот тебе для затравочки - читай...
http://msdn.microsoft.com/en-us/library/ms...1(v=VS.85).aspx

 smile
Неужели нет систематизированного списка? WinAPI Функция - возможные ошибки

Цитата

alexvs11
    
но возвращать то она не всех их будет
 
Парочку констант для ошибок, не подскажите, желательно для Delphi/free pascal smile 

Автор: CodeMonkey 24.2.2011, 05:48
Цитата(untrial @  24.2.2011,  01:17 Найти цитируемый пост)
Неужели нет систематизированного списка? WinAPI Функция - возможные ошибки


Нет.

И на это есть http://www.transl-gunsmoker.ru/2009/02/blog-post.html.

К примеру, попытка открыть pipe с делегацией токена безопасности провалится с ERROR_BAD_IMPERSONATION_LEVEL, если удалённый сервер этого pipe не является доверенным для делегации.

Иногда указывают типичные коды (редко) или специальные коды (чаще). 

Под специальными кодами понимаются коды, которые ты точно хотел бы обрабатывать отдельно от других. К примеру, ERROR_INSUFFICIENT_BUFFER. И часто описывается сценарий, как надо обрабатывать такие ошибки.

Все прочие ошибки просто не упоминаются. По той простой причине, что все они - равнозначны с точки зрения функции.

Добавлено через 9 минут и 7 секунд
Цитата(untrial @  24.2.2011,  01:17 Найти цитируемый пост)
Парочку констант для ошибок, не подскажите, желательно для Delphi/free pascal   


Вот несколько наугад:

ERROR_FILE_NOT_FOUND
ERROR_PATH_NOT_FOUND
ERROR_TOO_MANY_OPEN_FILES
ERROR_ACCESS_DENIED
ERROR_WRITE_PROTECT
ERROR_NOT_READY
ERROR_SHARING_VIOLATION
ERROR_LOCK_VIOLATION
ERROR_BAD_NETPATH
ERROR_NETWORK_ACCESS_DENIED
ERROR_FILE_EXISTS
ERROR_INVALID_PARAMETER
ERROR_OPEN_FAILED
ERROR_BAD_PATHNAME
ERROR_BUSY
ERROR_ALREADY_EXISTS
ERROR_PIPE_NOT_CONNECTED

...и многие другие - мне лениво смотреть.

P.S. Пока смотрел список - обнаружил для себя новые коды: ERROR_VIRUS_INFECTED и ERROR_VIRUS_DELETED. Фигак.

Автор: untrial 24.2.2011, 13:47
Большое спасибо CodeMonkey

Автор: CodeMonkey 24.2.2011, 19:36
Забыл ещё сказать - чтобы узнать типичные коды ошибок CreateaFile - ищи в документации по функции строку "ERROR_" (без кавычек).

Получишь такие слова:

Цитата

You cannot request a sharing mode that conflicts with the access mode that is specified in an existing request that has an open handle. CreateFile would fail and the GetLastError function would return ERROR_SHARING_VIOLATION.


Цитата

If the specified file exists and is writable, the function overwrites the file, the function succeeds, and last-error code is set to ERROR_ALREADY_EXISTS.
If the specified file does not exist and is a valid path, a new file is created, the function succeeds, and the last-error code is set to zero.


Цитата

If the specified file exists, the function fails and the last-error code is set to ERROR_FILE_EXISTS (80).


И так далее.

Откуда, кстати, видно, что код ошибки иногда полезно анализировать даже в случае успешного вызова функции - потому что он даёт доп. информацию о вызове.

Автор: untrial 24.2.2011, 22:02
Цитата

Откуда, кстати, видно, что код ошибки иногда полезно анализировать даже в случае успешного вызова функции - потому что он даёт доп. информацию о вызове.

Microsoft так и советует  smile 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)