Программирование на Ассемблере

Обработка ошибок с помощью функции 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 );



Содержание раздела