Я новичок в 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
}
Я выгляжу как noob или этот код в порядке?
Это нехорошо. Из документации MSDN FormatMessage мы видим:
Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.
Это означает, что эта функция имеет возможность сбоя. Вы должны проверить возвращаемое значение, чтобы узнать, не сработало ли оно и каким-то образом справиться с этим, возможно, вернув строку с кодом ошибки из GetLastError
. Если вы не справитесь с этим, вы, вероятно, передаете неинициализированные данные в конструктор std::string
и вы можете вызвать неопределенное поведение.