Voici la bonne façon de récupérer un message d'erreur du système pour un HRESULT
(nommé hresult dans ce cas, ou vous pouvez le remplacer par GetLastError()
):
LPTSTR errorText = NULL;
FormatMessage(
// use system message tables to retrieve error text
FORMAT_MESSAGE_FROM_SYSTEM
// allocate buffer on local heap for error text
|FORMAT_MESSAGE_ALLOCATE_BUFFER
// Important! will fail otherwise, since we're not
// (and CANNOT) pass insertion parameters
|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, // unused with FORMAT_MESSAGE_FROM_SYSTEM
hresult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&errorText, // output
0, // minimum size for output buffer
NULL); // arguments - see note
if ( NULL != errorText )
{
// ... do something with the string `errorText` - log it, display it to the user, etc.
// release memory allocated by FormatMessage()
LocalFree(errorText);
errorText = NULL;
}
La principale différence entre cela et la réponse de David Hanak est l'utilisation du FORMAT_MESSAGE_IGNORE_INSERTS
drapeau. MSDN est un peu incertain sur la façon dont les insertions doivent être utilisées, mais Raymond Chen note que vous ne devriez jamais les utiliser lors de la récupération d'un message système, car vous n'avez aucun moyen de savoir à quelles insertions le système attend.
FWIW, si vous utilisez Visual C ++, vous pouvez vous simplifier la vie un peu en utilisant la _com_error
classe:
{
_com_error error(hresult);
LPCTSTR errorText = error.ErrorMessage();
// do something with the error...
//automatic cleanup when error goes out of scope
}
Ne fait pas partie de MFC ou ATL directement pour autant que je sache.