Вот правильный способ получить сообщение об ошибке из системы для HRESULT
(в данном случае с именем hresult, или вы можете заменить его на GetLastError()
):
LPTSTR errorText = NULL;
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM
|FORMAT_MESSAGE_ALLOCATE_BUFFER
|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
hresult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&errorText,
0,
NULL);
if ( NULL != errorText )
{
LocalFree(errorText);
errorText = NULL;
}
Ключевое различие между этим и ответом Дэвида Ханака - использование FORMAT_MESSAGE_IGNORE_INSERTS
флага. В MSDN немного неясно, как следует использовать вставки, но Рэймонд Чен отмечает, что вы никогда не должны использовать их при получении системного сообщения, поскольку вы не знаете, какие вставки ожидает система.
FWIW, если вы используете Visual C ++, вы можете немного облегчить себе жизнь, используя _com_error
класс:
{
_com_error error(hresult);
LPCTSTR errorText = error.ErrorMessage();
}
Насколько мне известно, не является частью MFC или ATL напрямую.