我一直在使用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。
有谁知道为什么会裁剪这些邮件?
无论如何都要收到完整的消息?
答案 0 :(得分:2)
您提及的消息(C2 = =INT(B2/C1)
和ERROR_UNHANDLED_EXCEPTION
)具有printf样式插入(ERROR_SYSTEM_PROCESS_TERMINATED
)。但是,FormatMessage使用%0来终止消息。
我的猜测是,还有另一条途径,系统会返回这些消息,并且已经填充了printf样式的占位符;这些消息的原始格式并不是由FormatMessage处理的。
鉴于这些消息包含文本%08x
或(Fatal System Error)
,Windows特别处理这些消息并不奇怪。