windows_utils: try and use FormatMessage for errors.

This is useful in particular for GetLastError, unfortunately, it's stil pretty
dumb with regards to WASAPI or D3D specific errors, so keep the
hresult_to_string switch.
This commit is contained in:
Kevin Mitchell 2016-02-17 02:40:43 -08:00
parent f371367aac
commit 50d9a2609a
2 changed files with 24 additions and 4 deletions

View File

@ -124,9 +124,29 @@ static char *hresult_to_str(const HRESULT hr)
#undef E
}
char *mp_HRESULT_to_str_buf(char *buf, size_t buf_size, HRESULT hr)
static char *fmtmsg_buf(char *buf, size_t buf_size, DWORD errorID)
{
snprintf(buf, buf_size, "%s (0x%"PRIx32")",
hresult_to_str(hr), (uint32_t) hr);
DWORD n = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorID, 0, buf, buf_size, NULL);
if (!n && GetLastError() == ERROR_MORE_DATA) {
snprintf(buf, buf_size,
"<Insufficient buffer size (%zd) for error message>",
buf_size);
} else {
if (n > 0 && buf[n-1] == '\n')
buf[n-1] = '\0';
if (n > 1 && buf[n-2] == '\r')
buf[n-2] = '\0';
}
return buf;
}
#define fmtmsg(hr) fmtmsg_buf((char[243]){0}, 243, (hr))
char *mp_HRESULT_to_str_buf(char *buf, size_t buf_size, HRESULT hr)
{
char* msg = fmtmsg(hr);
msg = msg[0] ? msg : hresult_to_str(hr);
snprintf(buf, buf_size, "%s (0x%"PRIx32")", msg, (uint32_t)hr);
return buf;
}

View File

@ -23,7 +23,7 @@
char *mp_GUID_to_str_buf(char *buf, size_t buf_size, const GUID *guid);
#define mp_GUID_to_str(guid) mp_GUID_to_str_buf((char[40]){0}, 40, (guid))
char *mp_HRESULT_to_str_buf(char *buf, size_t buf_size, HRESULT hr);
#define mp_HRESULT_to_str(hr) mp_HRESULT_to_str_buf((char[60]){0}, 60, (hr))
#define mp_HRESULT_to_str(hr) mp_HRESULT_to_str_buf((char[256]){0}, 256, (hr))
#define mp_LastError_to_str() mp_HRESULT_to_str(HRESULT_FROM_WIN32(GetLastError()))
#endif