FormatMessage без переносов на новую строку

133
27 февраля 2021, 00:40

Я получаю сообщение об ошибке полученной через GetLastError, и использую FormatMessage для преобразования в читабельный вид (для отладки).

std::string get_last_error_std_string(const DWORD error_code)
{
    const DWORD fmt_message_flags =
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;
    const DWORD lng_id = MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN_RUSSIA);
    std::string result;
    if (error_code)
    {
        LPVOID msg_buf = nullptr;
        const DWORD buf_len = FormatMessage
        (
            fmt_message_flags,
            nullptr,
            error_code,
            lng_id,
            reinterpret_cast<LPWSTR>(&msg_buf),
            0,
            nullptr
        );
        if (buf_len)
        {
            const int required_memory = WideCharToMultiByte
            (
                CP_UTF8,
                0,
                static_cast<LPCWCH>(msg_buf),
                -1,
                nullptr,
                0,
                nullptr,
                nullptr
            );
            result.resize(required_memory);
            (void)WideCharToMultiByte
            (
                CP_UTF8,
                0,
                static_cast<LPCWCH>(msg_buf),
                static_cast<int>(buf_len),
                &result[0],
                required_memory,
                nullptr,
                nullptr
            );
            LocalFree(msg_buf);
        }
    }
    return result;
}

Но данная функция заполняет буфер строки с переносами на новую строку, т.е. в конце имеется 2 символа \r\n, которые мне не нужны, т.к. использую форматирование, но за счет того что есть эти символы, у меня ломается вывод в консоль, и вместо запланированного сообщения я вижу лишь его часть:

Не удалось зарегистрировать класс окна т.к. функция RegisterClassExW вернула ошибку 0x57 Ошибка: "Параметр задан неверно.

Но форматирование строки должно было содержать в себе номер строки и файл в котором была получена ошибка:

throw std::runtime_error(u8"{0}{1:#x} Ошибка: \"{2}\"{5}Файл: {3}{5}Строка: {4}"_format
(
    u8"Не удалось зарегистрировать класс окна т.к. функция `RegisterClassExW` вернула ошибку ",
    error_code,
    get_last_error_std_string(error_code),
    __FILE__,
    __LINE__ - 2,
    "\n"
));

Можно ли без среза строки получить ошибку без переносов на новую строку \r\n?

READ ALSO
CMake: Как добавить qt классы в подпроект?

CMake: Как добавить qt классы в подпроект?

Проект пустой, который создается по умолчанию (в формате qmake)

110
Подсчет количества единичных бит

Подсчет количества единичных бит

Нужно посчитать количество единичных бит, запрещается использовать любые арифметические операции (даже инкремент) и любые сторонние библиотеки...

126
add_subdirectory добавить папку уровня выше

add_subdirectory добавить папку уровня выше

Продолжение изучения CMake: Как добавить qt классы в подпроект?Теперь необходимо без корневого файла CMakeLists

108
Ввод двумерного массива с клавиатуры

Ввод двумерного массива с клавиатуры

Как ввести массив E[N][N] с клавиатуры? получилось только определить с помощью #define

96