为什么 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_EXCEPTION
和 ERROR_SYSTEM_PROCESS_TERMINATED
)。
感谢 engf-010 - 如果您使用 Visual Studio 中的错误查找工具(工具 - 错误查找),您会得到相同的结果。错误代码为 574 和 591。
有谁知道为什么要裁剪这些消息?
有没有完整的消息?
您提到的消息(ERROR_UNHANDLED_EXCEPTION
和 ERROR_SYSTEM_PROCESS_TERMINATED
)有 printf 样式的插入(%08x
)。但是,FormatMessage 使用 %0 来终止消息。
我的猜测是系统返回这些消息的另一个途径是已经填充了 printf 样式的占位符;这些原始形式的消息不打算由 FormatMessage 处理。
鉴于这些消息包含文本 (Fatal System Error)
或 (Application Error)
,Windows 专门处理这些消息也就不足为奇了。
我一直在使用 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_EXCEPTION
和 ERROR_SYSTEM_PROCESS_TERMINATED
)。
感谢 engf-010 - 如果您使用 Visual Studio 中的错误查找工具(工具 - 错误查找),您会得到相同的结果。错误代码为 574 和 591。
有谁知道为什么要裁剪这些消息?
有没有完整的消息?
您提到的消息(ERROR_UNHANDLED_EXCEPTION
和 ERROR_SYSTEM_PROCESS_TERMINATED
)有 printf 样式的插入(%08x
)。但是,FormatMessage 使用 %0 来终止消息。
我的猜测是系统返回这些消息的另一个途径是已经填充了 printf 样式的占位符;这些原始形式的消息不打算由 FormatMessage 处理。
鉴于这些消息包含文本 (Fatal System Error)
或 (Application Error)
,Windows 专门处理这些消息也就不足为奇了。