Я использовал функцию 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 I должен увидеть следующее:
{Неустранимая системная ошибка}
Системный процесс% hs неожиданно завершился со статусом 0x% 08x (0x% 08x 0x% 08x). Система была закрыта.
Однако в программе-примере я увижу:
{Fatal System Error}
Системный процесс% hs неожиданно завершен со статусом 0x
Я заметил, что ERROR_UNHANDLED_EXCEPTION
также не создает полное сообщение (по сравнению со списком в MSDN). Оба ожидаемых сообщения содержат заполнители 0x% 08, но сообщение заканчивается после 0x.
Насколько я могу судить, другие сообщения об ошибках соответствуют спискам в MSDN (т.е. проблема ограничена ERROR_UNHANDLED_EXCEPTION
и ERROR_SYSTEM_PROCESS_TERMINATED
).
Кредит engf-010 - вы получите то же самое, если используете инструмент поиска ошибок в Visual Studio (Инструменты - Поиск ошибок). Коды ошибок - 574 и 591.
Кто-нибудь знает, почему эти сообщения обрезаются?
Есть ли способ получить полное сообщение?
FormatMessageW
,GetLastError()
сразу послеFormatMessageW
будет отображаться как 0. - person Class Skeleton   schedule 03.06.2016FORMAT_MESSAGE_ALLOCATE_BUFFER
. Хотя это может не иметь отношения к этому небольшому примеру. - person Christian.K   schedule 03.06.2016FORMAT_MESSAGE_IGNORE_INSERTS
для произвольных кодов системных ошибок является ошибкой (как описано в ). Пожалуйста, включите это в свой код (а не просто упомяните об этом ниже). - person IInspectable   schedule 03.06.2016