web-dev-qa-db-fra.com

Existe-t-il un moyen d'obtenir la représentation sous forme de chaîne de la valeur HRESULT à l'aide de l'API win?

Existe-t-il une fonction dans l'API win qui peut être utilisée pour extraire la représentation sous forme de chaîne de la valeur HRESULT?

Le problème est que toutes les valeurs de retour ne sont pas documentées dans MSDN, par exemple la fonction ExecuteInDefaultAppDomain () n'est pas documentée pour retourner "0x80070002 - Le système ne peut pas trouver le fichier spécifié.", Cependant, il le fait! Par conséquent, je me demandais s'il y avait une fonction à utiliser dans le cas courant.

55
khkarens

Vous pouvez utiliser _ com_error :

_com_error err(hr);
LPCTSTR errMsg = err.ErrorMessage();

Si vous ne souhaitez pas utiliser _com_error pour une raison quelconque, vous pouvez toujours jeter un œil à sa source et voir comment cela se fait.

N'oubliez pas d'inclure l'en-tête comdef.h

80
eran

L'API Windows pour cela est FormatMessage . Voici un lien qui explique comment le faire: Comment obtenir des descriptions de messages d'erreur à l'aide de l'API FormatMessage .

Pour les messages Win32 (messages avec un HRESULT qui commence par 0x8007, qui est FACILITY_WIN32), vous devez supprimer le mot d'ordre élevé. Par exemple, dans le 0x80070002, vous devez appeler FormatMessage avec 0x0002.

Cependant, cela ne fonctionne pas toujours pour tout type de message. Et pour certains messages spécifiques (spécifiques à une technologie, un fournisseur, etc.), vous devez charger la DLL de ressource correspondante, ce qui n'est pas toujours une tâche facile, car vous devez trouver cette DLL.

14
Simon Mourier

Depuis c ++ 11, cette fonctionnalité est intégrée à la bibliothèque standard:

#include <system_error>

std::string message = std::system_category().message(hr)
2
Chronial

Voici un exemple utilisant FormatMessage ()

LPTSTR SRUTIL_WinErrorMsg(int nErrorCode, LPTSTR pStr, Word wLength )
{
    try
    {
        LPTSTR  szBuffer = pStr;
        int nBufferSize = wLength;

        //
        // prime buffer with error code
        //
        wsprintf( szBuffer, _T("Error code %u"), nErrorCode);

        //
        // if we have a message, replace default with msg.
        //
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nErrorCode,
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
                (LPTSTR) szBuffer,   
                nBufferSize,    
                NULL );
    }
    catch(...)
    {
    }
    return pStr;
} // End of SRUTIL_WinErrorMsg()
1
WebDrive