你如何将std :: system_error与GetLastError一起使用?

时间:2013-04-06 19:11:32

标签: c++ winapi c++11

如果我调用通过GetLastError报告错误的Win32函数,例如RegisterClassEx,如何为该错误抛出std :: system_error?

2 个答案:

答案 0 :(得分:13)

检查GetLastError()的值

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

error_codeherestd::system_errorhere

答案 1 :(得分:9)

请注意,比较std::error_code类别中的std::system_category()通常不会与std::errc枚举常量一起使用,具体取决于您的供应商。 E.g。

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

某些供应商要求使用std::generic_category()来实现这一目标。

在MinGW中std::error_code(ERROR_FILE_NOT_FOUND, std::system_category()).message()不会给你正确的信息。

对于真正可移植且强大的解决方案,我建议将std::system_errorstd::system_category子类化为windows_errorwindows_category,并自行实现正确的功能。据报道,YMMV,VS2017可以像人们期望的那样工作。