Windows API - 将FormatMessage()的结果提取到std :: string中

时间:2013-12-22 05:15:54

标签: c++ winapi

我是Windows API的新手,虽然我想出了如何获取系统消息代码描述,但我想知道是否是更好,更优雅的方式。或者,出于教育目的,如果还有其他任何方式。

DWORD WINAPI FormatMessage(
  _In_      DWORD dwFlags,
  _In_opt_  LPCVOID lpSource,
  _In_      DWORD dwMessageId,
  _In_      DWORD dwLanguageId,
  _Out_     LPTSTR lpBuffer,
  _In_      DWORD nSize,
  _In_opt_  va_list *Arguments
);

评论后更新的代码:

std::string bmd2File::getErrorCodeDescription(long errorCode) const throw (bmd2Exception)
{
  #ifdef _WIN32

    char MessageFromSystem[1024];
    bool messageReceived = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
                  0,
                  errorCode,
                  1033,                          // US English
                  MessageFromSystem,
                  1024,
                  0);
    std::ostringstream ostr;

    if (!messageReceived)
      ostr << "Error code: " << errorCode;
    else
      ostr << "Error code " << errorCode << " with message: " << MessageFromSystem;

    return ostr.str();

  #else
  #endif
}

旧代码

std::string bmd2File::getErrorCodeDescription(long errorCode) const throw (bmd2Exception)
{
  #ifdef _WIN32

    char MessageFromSystem[1024];
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
                  0,
                  errorCode,
                  1033,                          // US English
                  MessageFromSystem,
                  1024,
                  0);
    return std::string(MessageFromSystem);

  #else
  #endif
}

我看起来像个菜鸟还是这个代码好吗?

1 个答案:

答案 0 :(得分:1)

这不行。从MSDN documentation of FormatMessage开始,我们看到:

  

如果函数失败,则返回值为零。要获得扩展错误   信息,调用GetLastError。

这意味着此功能可能会失败。您应该检查返回值以查看它是否失败并以某种方式处理它,可能是通过返回带有GetLastError错误代码的字符串。如果你不处理它,你可能会将未初始化的数据传递给std::string构造函数,你可能会导致未定义的行为。