Récupération des messages d’erreur
Lorsqu’un appel de méthode génère une erreur, de nombreuses fonctions retournent un code d’erreur. Pour la plupart des interfaces et des éléments API des services de certificat qui retournent un code d’erreur, le texte du message d’erreur peut être récupéré en appelant FormatMessage avec un handle de module NULL . Si FormatMessage échoue, le code d’erreur provient probablement d’un élément d’API de sauvegarde ou d’une erreur liée à la base de données ; l’appel de FormatMessage avec un handle de module correspondant à la bibliothèque Ntdsbmsg.dll doit récupérer le texte du message d’erreur. L’exemple suivant montre comment récupérer le texte du message d’erreur dans une application Certificate Services.
#include <windows.h>
#include <stdio.h>
// Display error message text, given an error code.
// Typically, the parameter passed to this function is retrieved
// from GetLastError().
void PrintCSBackupAPIErrorMessage(DWORD dwErr)
{
WCHAR wszMsgBuff[512]; // Buffer for text.
DWORD dwChars; // Number of chars returned.
// Try to get the message from the system errors.
dwChars = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwErr,
0,
wszMsgBuff,
512,
NULL );
if (0 == dwChars)
{
// The error code did not exist in the system errors.
// Try Ntdsbmsg.dll for the error code.
HINSTANCE hInst;
// Load the library.
hInst = LoadLibrary(L"Ntdsbmsg.dll");
if ( NULL == hInst )
{
printf("cannot load Ntdsbmsg.dll\n");
exit(1); // Could 'return' instead of 'exit'.
}
// Try getting message text from ntdsbmsg.
dwChars = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE |
FORMAT_MESSAGE_IGNORE_INSERTS,
hInst,
dwErr,
0,
wszMsgBuff,
512,
NULL );
// Free the library.
FreeLibrary( hInst );
}
// Display the error message, or generic text if not found.
printf("Error value: %d Message: %ws\n",
dwErr,
dwChars ? wszMsgBuff : L"Error message not found." );
}