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

Why does FormatMessage only create partial messages for ERROR_SYSTEM_PROCESS_TERMINATED and ERROR_UNHANDLED_EXCEPTION system errors?

我一直在使用 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 我应该看到以下内容:

{Fatal System Error}
The %hs system process terminated unexpectedly with a status of 0x%08x (0x%08x 0x%08x). The system has been shut down.

但是,在示例程序中我会看到:

{Fatal System Error}
The %hs system process terminated unexpectedly with a status of 0x

我注意到 ERROR_UNHANDLED_EXCEPTION 也没有创​​建完整的消息(与 MSDN 上的列表相比)。两个预期的消息都包含 0x%08 占位符,但消息在 0x.

之后结束

据我所知,其他错误消息似乎与 MSDN 上的列表匹配(即问题似乎仅限于 ERROR_UNHANDLED_EXCEPTIONERROR_SYSTEM_PROCESS_TERMINATED)。


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


有谁知道为什么要裁剪这些消息?

有没有完整的消息?

您提到的消息(ERROR_UNHANDLED_EXCEPTIONERROR_SYSTEM_PROCESS_TERMINATED)有 printf 样式的插入(%08x)。但是,FormatMessage 使用 %0 来终止消息。

我的猜测是系统返回这些消息的另一个途径是已经填充了 printf 样式的占位符;这些原始形式的消息不打算由 FormatMessage 处理。

鉴于这些消息包含文本 (Fatal System Error)(Application Error),Windows 专门处理这些消息也就不足为奇了。