2011-08-10 1 views
39

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 ExecuteInDefaultAppDomain() fonction 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 a une fonction à utiliser dans le cas courant.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?

+2

Titre est différent, mais essentiellement la réponse sera la même que pour (http://stackoverflow.com/questions/455434/how-should [ce] -i-use-formatmessage-correctement-en-c) un. –

Répondre

62

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 oeil à sa source, et voir comment il est fait.

Ne pas oublier d'inclure l'en-tête comdef.h

+4

Un échantillon plus complet pour plus de commodité: CString en ligne GetMessageForHresult (HRESULT hr) { erreur _com_error (h); CString cs; cs.Format (_T ("Erreur 0x% 08x:% s"), hr, error.ErrorMessage()); return cs; } – nietras

+1

fichier d'en-tête requis: #include

12

L'API Windows pour cela est FormatMessage. Voici un lien qui explique comment le faire: How to obtain error message descriptions using the FormatMessage API.

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

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

+0

Le 7 dans 0x8007 est FACILITY_WIN32 et n'est pas FACILITY_ITF. Voir par exemple "Structure des codes d'erreur COM" à http://msdn.microsoft.com/en-us/library/ms690088 –

+0

@uvts_cvs - bien sûr. mon erreur. J'ai mis à jour la réponse. –

+0

'HRESULT_CODE (hr)' peut transformer cela en code d'erreur win32 – Andy

-1

Voici un échantillon à l'aide 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

Quel est le point de la clause catch dans la fonction? –

+0

Je ne savais pas 'FormatMessage' throws ... – Andy

Questions connexes