Обработка ошибок с помощью функции GetLastError
Общий вид функции:
DWORD GetLastError(VOID)
Функция возвращает код ошибки (32 бита). Список кодов ошибок приведен в файле WinError.h. Здесь же приведен формат кода ошибки:
Биты | 31-30 | 29 | 28 | 27-16
| 15-0 | ||||||
№ поля | 1 | 2 | 3 | 4 | 5 |
1 – Код степени тяжести ошибки (severity code):
00 – успех;
01 – информация;
10 – предупреждение;
11 – ошибка.
2 – Кем определена ошибка (Microsoft - 0, пользователь -1). Благодаря этому биту можно всегда определять коды ошибок, которые гарантированно не совпадут с системными кодами.
3 – Зарезервировано. Должно быть 0.
4 – Код подсистемы, к которой относится ошибка, например,
#define FACILITY_WINDOWS 8
#define FACILITY_STORAGE 3
#define FACILITY_INTERNET 12
#define FACILITY_CERT 11
Определяется MICROSOFT.
5 – Код ошибки 0..65535.
Ниже приведен фрагмент кода для вывода сообщения, соответствующего ошибке, нв языке, принятом по умолчанию для операционной системы. В этом фрагменте используются функции:
· FormatMessage
– для формирования требуемого сообщения по номеру ошибки, который возвращает функция GetLastError. Для этой функции задается адрес буфер, а функция выделяет буфер в куче и записывает сформированное сообщение; тип формируемого сообщения (для нас – сообщение ОС - FORMAT_MESSAGE_FROM_SYSTEM и язык, принятый по умолчанию – макрос MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
· MessageBox – для вывода диалога с собщением;
· LocalFree – для освобождения памяти, выделенной для буфера.
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
MessageBox( NULL, lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION);
LocalFree( lpMsgBuf );