Ось правильний спосіб повернути повідомлення про помилку із системи для 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.