В прошлых мы смотрели, что функции 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;
}
Запустив этот код на выполнение, Вы увидите, что описание кода ошибки не найдено.
