为什么FormatMessage只为ERROR_SYSTEM_PROCESS_TERMINATED和ERROR_UNHANDLED_EXCEPTION系统错误创建部分消息?

时间:2016-06-03 11:31:00

标签: c++ winapi visual-c++-2015 formatmessage

我一直在使用Windows API中的FormatMessage函数从系统错误代码生成消息字符串。我注意到,对于某些错误代码,似乎没有创建完整的消息。

以此示例程序为例:

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_EXCEPTIONERROR_SYSTEM_PROCESS_TERMINATED)。

归功于engf-010 - 如果在Visual Studio中使用错误查找工具(工具 - 错误查找),则会得到相同的结果。错误代码为574和591。

有谁知道为什么会裁剪这些邮件?

无论如何都要收到完整的消息?

1 个答案:

答案 0 :(得分:2)

您提及的消息(C2 = =INT(B2/C1) ERROR_UNHANDLED_EXCEPTION)具有printf样式插入(ERROR_SYSTEM_PROCESS_TERMINATED)。但是,FormatMessage使用%0来终止消息。

我的猜测是,还有另一条途径,系统会返回这些消息,并且已经填充了printf样式的占位符;这些消息的原始格式并不是由FormatMessage处理的。

鉴于这些消息包含文本%08x(Fatal System Error),Windows特别处理这些消息并不奇怪。