Windows API - извлечение результатов FormatMessage () в std :: string

0

Я новичок в 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 или этот код в порядке?

  • 0
    Спасибо, я исправлю это !!
  • 0
    Как насчет массива char [1024]? Кажется низкоуровневым, чтобы указать массив символов в байтах и просто скрестить пальцы, чтобы надеяться, что он достаточно большой.
Показать ещё 1 комментарий
Теги:
winapi

1 ответ

1

Это нехорошо. Из документации MSDN FormatMessage мы видим:

Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Это означает, что эта функция имеет возможность сбоя. Вы должны проверить возвращаемое значение, чтобы узнать, не сработало ли оно и каким-то образом справиться с этим, возможно, вернув строку с кодом ошибки из GetLastError. Если вы не справитесь с этим, вы, вероятно, передаете неинициализированные данные в конструктор std::string и вы можете вызвать неопределенное поведение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню