【发布时间】:2016-10-03 10:54:30
【问题描述】:
我一直在使用 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_EXCEPTION 和 ERROR_SYSTEM_PROCESS_TERMINATED)。
感谢 engf-010 - 如果您使用 Visual Studio 中的错误查找工具(工具 - 错误查找),您会得到相同的结果。错误代码为 574 和 591。
有谁知道为什么要裁剪这些消息?
有没有办法得到完整的消息?
【问题讨论】:
-
你应该经常检查系统调用的返回值!它可能会对您的问题有所启发。
-
@engf-010 - 如果我在
FormatMessageW之前将最后一个错误设置为0,则GetLastError()在FormatMessageW之后立即显示为0。 -
附带说明,您应该
LocalFree/HeapFree使用FORMAT_MESSAGE_ALLOCATE_BUFFER时返回的缓冲区。尽管这在这个小例子中可能不相关。 -
不将
FORMAT_MESSAGE_IGNORE_INSERTS用于任意系统错误代码是一个错误(如documented)。请将其包含在您的代码中(而不仅仅是进一步提及)。 -
有点让人放心:错误查找实用程序给出了相同的错误描述,所以如果 MS 不能正确处理...
标签: c++ winapi visual-c++-2015 formatmessage