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