我是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
}
我看起来像个菜鸟还是这个代码好吗?
答案 0 :(得分:1)
这不行。从MSDN documentation of FormatMessage开始,我们看到:
如果函数失败,则返回值为零。要获得扩展错误 信息,调用GetLastError。
这意味着此功能可能会失败。您应该检查返回值以查看它是否失败并以某种方式处理它,可能是通过返回带有GetLastError
错误代码的字符串。如果你不处理它,你可能会将未初始化的数据传递给std::string
构造函数,你可能会导致未定义的行为。