Recupero di messaggi di errore
Quando una chiamata al metodo genera un errore, molte funzioni restituiscono un codice di errore. Per la maggior parte delle interfacce di Servizi certificati e degli elementi dell'API che restituiscono un codice di errore, il testo del messaggio di errore può essere recuperato chiamando FormatMessage con un handle di modulo NULL . Se FormatMessage non riesce, il codice di errore è probabilmente causato da un elemento api di backup o da un errore correlato al database; chiamando FormatMessage con un handle di modulo corrispondente alla libreria Ntdsbmsg.dll deve recuperare il testo del messaggio di errore. Nell'esempio seguente viene illustrato come recuperare il testo del messaggio di errore in un'applicazione Servizi certificati.
#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." );
}