Как вы используете std::system_error с GetLastError?

Если я вызываю функцию Win32, которая сообщает об ошибках через GetLastError, например RegisterClassEx, как я могу вызвать std::system_error для этой ошибки?

2 ответа

Решение

Проверьте стоимость GetLastError() лайк

DWORD dwErrVal = GetLastError();
std::error_code ec (dwErrVal, std::system_category());
throw std::system_error(ec, "Exception occurred");

Смотрите здесь для error_code и здесь для std::system_error,

Помните, что сравнивая std::error_code в категории std::system_category() обычно не работает с std::errc константы перечисления в зависимости от вашего поставщика. Например

std::error_code(ERROR_FILE_NOT_FOUND, std::system_category()) != std::errc::no_such_file_or_directory)

Некоторые поставщики требуют использования std::generic_category() чтобы это работало.

В минГВ std::error_code(ERROR_FILE_NOT_FOUND, std::system_category()).message() не даст вам правильное сообщение.

Для действительно портативного и надежного решения я бы порекомендовал std::system_error а также std::system_category в windows_error а также windows_category и реализовать правильную функциональность самостоятельно. Сообщалось, что YMMV, VS2017 работает так, как и следовало ожидать.

Другие вопросы по тегам