Шаг 34 - Как функции возвращают код ошибки

В прошлых мы смотрели, что функции API возвращают код ошибки. Но мы в Вами тоже можем захотеть создать свое API и чтобы функции этого API возвращали информацию об ошибке. Для реализации этих возможностей предусмотрена функция SetLastError, которая устанавливает признак ошибки в потоке.

VOID SetLastError
(
	DWORD dwErrCode   
);

Код ошибки это 32 битное число, в котором для нас главное это бит 29. Этот бит определяет пользовательский код или системный.

0 - Microsoft
1 - Пользовательский

Когда Вы определяете код, то этот бит нужно устанавливать в единицу. Биты от 0 до 15 можно определять самостоятельно, то есть получается что у нас есть возможность задать 32767 ошибок. 29 бит можно установить вот так.

#define MY_ERROR 0x20000000

Ну, а дальше можно добавлять кода ошибок. Попробуем создать свое сообщение на примере прошлого шага. Но нужно учесть, что в результате вызова FomatMessage может произойти ошибка. То есть сообщение может быть не найдено, в этом случае функция вернет 0.

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

#define MY_ERROR 0x20000000

void main()
{
	SetLastError(MY_ERROR);
	DWORD dwRez;
	LPVOID lpMsgBuf;
	dwRez=FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
		FORMAT_MESSAGE_FROM_SYSTEM | 
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL, GetLastError(),  MAKELANGID(LANG_NEUTRAL, 
		SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
	if (dwRez!=0)
		cout << (char*)lpMsgBuf << endl;
	else
		cout << "Error Message" << endl;
}

Запустив этот код на выполнение, Вы увидите, что описание кода ошибки не найдено.

34_1.gif (2562 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.