Я получаю сообщение об ошибке полученной через 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
?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Проект пустой, который создается по умолчанию (в формате qmake)
Нужно посчитать количество единичных бит, запрещается использовать любые арифметические операции (даже инкремент) и любые сторонние библиотеки...
Продолжение изучения CMake: Как добавить qt классы в подпроект?Теперь необходимо без корневого файла CMakeLists
Как ввести массив E[N][N] с клавиатуры? получилось только определить с помощью #define