Когда функция
вернет вам управление, ее возвращаемое значение будет указывать на то, что про-
изошла какая-то ошибка. Какая именно — вы узнаете, вызвав функцию
GetLastError. DWORD GetLastError();
Она просто возвращает 32-битный код ошибки для данного потока. Теперь, когда у вас есть код ошибки, вам нужно обменять его на что-нибудь
более внятное. Список кодов ошибок, определенных Майкрософт, содержится в
заголовочном файле WinError. h. Я приведу здесь его небольшую часть, чтобы вы
представляли, на что он похож:
// MessageId: ERROR_SUCCESS
//
// MessageText:
//
// The operation completed successfully.
//
#define ERROR_SUCCESS 0L
#define N0_ERR0R 0L // dderror
#define SEC_E_OK ((HRESULT)OxOOOOOOOOL)
//
// MessageId: ERROR_INVALID_FUNCTION
//
// MessageText:
//
// Incorrect function.
4 Часть I. Материалы для обязательного чтения
//
#define ERROR_INVALID_FUNCTION 1L // dderror
//
// MessageId: ERROR_FILE_NOT_FOUND
//
// MessageText:
//
// The system cannot find the file specified.
//
#define ERROR_FILE_NOT_FOUND 2L
//
// MessageId: ERROR_PATH_NOT_FOUND
//
// MessageText:
//
// The system cannot find the path specified.
//
#define ERROR_PATH_NOT_FOUND 3L
//
// MessageId: ERROR_TOO_MANY_OPEN_FILES
//
// MessageText:
//
// The system cannot open the file.
//
#define ERROR_TOO_MANY_OPEN_FILES 4L
//
// MessageId: ERROR_ACCESS_DENIED
//
// MessageText:
//
// Access is denied.
//
#define ERROR_ACCESS_DENIED 5L
Как видите, с каждой ошибкой связаны идентификатор сообщения (его можно
использовать в исходном коде для сравнения со значением, возвращаемым
GetLastError), текст сообщения (описание ошибки на нормальном языке) и номер
(вместо него лучше использовать идентификатор). Учтите, что я показал лишь
крошечную часть файла WinError.
h; на самом деле в нем более 39 000строк! Функцию GetLastError нужно вызывать сразу же после неудачного вызова
функции Windows, иначе код ошибки может быть потерян (перезаписан
Глава 1. Обработка ошибок. docx 5
кодом ошибки другой функции ИЛИ кодом ERROR_SUCCESS в случае успешно-
го завершения функции). Некоторые функции Windows всегда завершаются успешно, но по разным при-
чинам. Например, попытка создать объект ядра «событие» с определенным име-
нем может быть успешна либо потому, что вы действительно создали его, либо
потому, что такой объект уже есть. Но иногда нужно знать причину успеха. Для
возврата этой информации Майкрософт предпочла использовать механизм уста-
новки кода последней ошибки. Так что и при успешном выполнении некоторых
функций вы можете вызывать GetLastError и получать дополнительную инфор-
мацию. К числу таких функций относится, например, CreateEvent. Сведения о
других функциях и примеры возврата ERROR_ALREADY_EXISTS в случае, если
именованное событие существует, см. в Platform SDK. На мой взгляд, особенно полезно отслеживать код последней ошибки в про-
цессе отладки.