Вот правильный способ получить сообщение об ошибке из системы для 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 напрямую.