1

我一直在使用 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)。系统已关闭。

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

{Fatal System Error}
%hs 系统进程意外终止,状态为 0x

我注意到这ERROR_UNHANDLED_EXCEPTION也不会创建完整的消息(与 MSDN 上的列表相比)。两条预期消息都包含0x%08占位符,但消息在0x之后结束。

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


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


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

反正有没有得到完整的信息?

4

1 回答 1

2

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

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

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

于 2016-06-03T12:07:25.757 回答