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