Почему FormatMessage создает только частичные сообщения для системных ошибок ERROR_SYSTEM_PROCESS_TERMINATED и ERROR_UNHANDLED_EXCEPTION?
Я использовал функцию FormatMessage в Windows API для генерации строк сообщений из кодов системных ошибок. Я заметил, что для некоторых кодов ошибок полное сообщение не создается.
Возьмите этот пример программы в качестве примера:
int main()
{
wchar_t * buffer = nullptr;
FormatMessageW(
FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr,
ERROR_SYSTEM_PROCESS_TERMINATED,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
reinterpret_cast<LPWSTR>(&buffer),
0,
nullptr);
std::wcout << buffer << std::endl;
return 0;
}
Согласно MSDN я должен увидеть следующее:
{Фатальная системная ошибка}
Системный процесс%hs неожиданно завершился со статусом 0x%08x (0x%08x 0x%08x). Система была закрыта.
Тем не менее, в примере программы я увижу:
{Фатальная системная ошибка}
Системный процесс%hs неожиданно завершился со статусом 0x
Я заметил, что ERROR_UNHANDLED_EXCEPTION
также не создает полное сообщение (по сравнению со списком в MSDN). Оба ожидаемых сообщения содержат 0x% 08 заполнителей, но сообщение заканчивается после 0x.
Из того, что я вижу, другие сообщения об ошибках появляются, чтобы соответствовать спискам на MSDN (то есть проблема, кажется, ограничена ERROR_UNHANDLED_EXCEPTION
а также ERROR_SYSTEM_PROCESS_TERMINATED
).
Кредит на engf-010 - вы получите то же самое, если вы используете инструмент поиска ошибок в Visual Studio (Инструменты - Поиск ошибок). Коды ошибок 574 и 591.
Кто-нибудь знает, почему эти сообщения обрезаются?
Есть ли способ получить полное сообщение?
1 ответ
Сообщения, которые вы упоминаете (ERROR_UNHANDLED_EXCEPTION
а также ERROR_SYSTEM_PROCESS_TERMINATED
) имеют вставки в стиле printf (%08x
). Тем не менее, FormatMessage использует%0 для завершения сообщения.
Я предполагаю, что есть другой путь, где эти сообщения возвращаются системой с уже заполненными заполнителями в стиле printf; эти сообщения в необработанном виде не предназначены для обработки в FormatMessage.
Учитывая, что эти сообщения содержат текст (Fatal System Error)
или же (Application Error)
Неудивительно, что Windows обрабатывает эти сообщения специально.