Шаг 51 - Сообщение об ошибке GetLastError

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

Эта функция используется обычно в сочетании с FormatMessage. Подробное описание последней займет довольно много места. Возьмем простой и реальный пример использования - функцию, выводящую последнее сообщение об ошибке, скажем, как AnsiString. И назовем ее... AnsiLastError.

AnsiString AnsiLastError(void)
{
void* cstr;
FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &cstr,
    0,
    NULL
);
String res((char*)cstr);
LocalFree(cstr);
return res;
}

Инструкция LocalFree используется здесь для освобождения памяти, занятой под буфер. Как пример использования подобной функции - ошибочный вызов API-функции FloodFill:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	FloodFill(0,0,0,0);
	Application->MessageBox(AnsiLastError().c_str(),"Error",MB_OK);
}

Здесь вызов функции неправилен, потому что первым параметром должен идти handle канвы, контекст устройства. Ну а NULL не особенно под это подходит. Поэтому при нажатии на кнопку выйдет окошко:

gif/51_1.gif (1045 b)

Причем на русском языке! Это, правда, у меня в региональных настройках стоит Russian, может, у кого Japanese или Africaans стоит, не знаю :). В виде, приведенном выше, эта функция дает ошибку в языке по умолчанию. Макрос MAKELANGID (вернее, это Windows поддерживает, а макрос только к LANGID преобразует) поддерживает около 44 языков (если я правильно посчитал) и еще суб-языки с разным написанием, типа кириллица-латиница.

В следующем шаге будет быстрый вариант конвертера из шага 50.


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