C++ 为什么FormatMessage只为错误\系统\进程\已终止和错误\未处理\异常系统错误创建部分消息?

C++ 为什么FormatMessage只为错误\系统\进程\已终止和错误\未处理\异常系统错误创建部分消息?,c++,winapi,visual-c++-2015,formatmessage,C++,Winapi,Visual C++ 2015,Formatmessage,我一直在使用Windows API中的FormatMessage函数从系统错误代码生成消息字符串。我注意到,对于某些错误代码,似乎没有创建完整的消息 以此示例程序为例: int main() { wchar_t * buffer = nullptr; FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERT

我一直在使用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;
}
intmain()
{
wchar_t*buffer=nullptr;
格式化消息(
格式化来自\u系统的\u消息\u
|格式化\u消息\u分配\u缓冲区
|格式化\u消息\u忽略\u插入,
nullptr,
错误\u系统\u进程\u终止,
MAKELANGID(LANG_中立,SUBLANG_默认),
重新解释强制转换(和缓冲区),
0, 
nullptr);
std::wcout您提到的消息(
错误\u未处理\u异常
错误\u系统\u进程\u终止
)具有printf样式的插入(
%08x
)。但是,FormatMessage使用%0终止消息

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


假设这些消息包含文本
(致命系统错误)
(应用程序错误)
,Windows专门处理这些消息并不奇怪。

您应该始终检查系统调用的返回值!这可能会对您的问题有所帮助。@engf-010-如果我在
FormatMessageW
之前将最后一个错误设置为0,
GetLastError()
紧接着
FormatMessageW
显示为0。作为旁注,您应该
LocalFree
/
HeapFree
使用
FORMAT\u MESSAGE\u ALLOCATE\u buffer
时返回的缓冲区。即使这在这个小示例中可能不相关。对于任意系统e,不使用
FORMAT\u MESSAGE\u IGNORE\u insert
错误代码是一个错误(as)。请将其包含在您的代码中(而不只是进一步提及)。令人欣慰的是:错误查找实用程序提供了相同的错误描述,因此如果MS不能正确执行此操作…我更倾向于相信,的返回值不应该被冲入下水道。。。“假设这些是致命的系统错误”-不,它们不是。它们是(潜在的)致命的进程错误。系统不太关心什么。内核会破坏进程对象并继续运行。这种情况一直都在发生。@IInspectable我已更新了答案以指示此术语(致命的系统错误)来自错误消息的文本。我不能肯定,但问题似乎是API中的疏忽/限制。这与检索系统错误消息的建议方法背道而驰。我能看到的唯一解决方法是在格式化之前检查错误代码,然后分支以创建预期的消息对于我发现的两种情况,@jdigital:
ERROR\u UNHANDLED\u EXCEPTION
可能会出现在未处理的异常筛选器中(请参阅),因此它可能会出现在您的过程中。