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