Oto właściwy sposób na odzyskanie komunikatu o błędzie z systemu HRESULT
(w tym przypadku o nazwie hresult lub możesz go zastąpić 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;
}
Kluczową różnicą między tym a odpowiedzią Davida Hanaka jest użycie FORMAT_MESSAGE_IGNORE_INSERTS
flagi. MSDN nie jest do końca jasne, w jaki sposób powinny być używane wstawki, ale Raymond Chen zauważa, że nigdy nie należy ich używać podczas pobierania wiadomości systemowej, ponieważ nie można dowiedzieć się, jakich wstawek oczekuje system.
FWIW, jeśli używasz Visual C ++, możesz trochę ułatwić sobie życie, używając _com_error
klasy:
{
_com_error error(hresult);
LPCTSTR errorText = error.ErrorMessage();
}
O ile wiem, nie jest częścią MFC ani ATL bezpośrednio.