Condividi tramite


Ricerca del testo per i numeri di codice di errore

A volte è necessario visualizzare il testo degli errori associato ai codici di errore restituiti dalle funzioni correlate alla rete. Potrebbe essere necessario eseguire questa attività con le funzioni di gestione di rete fornite dal sistema.

Il testo dell'errore per questi messaggi viene trovato nel file di tabella dei messaggi denominato Netmsg.dll, che si trova in %systemroot%\system32. Questo file contiene messaggi di errore nell'intervallo NERR_BASE (2100) tramite MAX_NERR(NERR_BASE+899). Questi codici di errore sono definiti nel file di intestazione SDK lmerr.h.

Le funzioni LoadLibrary e LoadLibraryEx possono caricare Netmsg.dll. La funzione FormatMessage esegue il mapping di un codice di errore al testo del messaggio, dato un handle di modulo al file Netmsg.dll.

Nell'esempio seguente viene illustrato come visualizzare il testo di errore associato alle funzioni di gestione della rete, oltre alla visualizzazione del testo degli errori associati ai codici di errore correlati al sistema. Se il numero di errore specificato si trova in un intervallo specifico, il modulo messaggio di netmsg.dll viene caricato e usato per cercare il numero di errore specificato con la funzione FormatMessage .

#include <windows.h>
#include <stdio.h>

#include <lmerr.h>

void
DisplayErrorText(
    DWORD dwLastError
    );

#define RTN_OK 0
#define RTN_USAGE 1
#define RTN_ERROR 13

int
__cdecl
main(
    int argc,
    char *argv[]
    )
{
    if(argc != 2) {
        fprintf(stderr,"Usage: %s <error number>\n", argv[0]);
        return RTN_USAGE;
    }

    DisplayErrorText( atoi(argv[1]) );

    return RTN_OK;
}

void
DisplayErrorText(
    DWORD dwLastError
    )
{
    HMODULE hModule = NULL; // default to system source
    LPSTR MessageBuffer;
    DWORD dwBufferLength;

    DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_IGNORE_INSERTS |
        FORMAT_MESSAGE_FROM_SYSTEM ;

    //
    // If dwLastError is in the network range, 
    //  load the message source.
    //

    if(dwLastError >= NERR_BASE && dwLastError <= MAX_NERR) {
        hModule = LoadLibraryEx(
            TEXT("netmsg.dll"),
            NULL,
            LOAD_LIBRARY_AS_DATAFILE
            );

        if(hModule != NULL)
            dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE;
    }

    //
    // Call FormatMessage() to allow for message 
    //  text to be acquired from the system 
    //  or from the supplied module handle.
    //

    if(dwBufferLength = FormatMessageA(
        dwFormatFlags,
        hModule, // module to get message from (NULL == system)
        dwLastError,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language
        (LPSTR) &MessageBuffer,
        0,
        NULL
        ))
    {
        DWORD dwBytesWritten;

        //
        // Output message string on stderr.
        //
        WriteFile(
            GetStdHandle(STD_ERROR_HANDLE),
            MessageBuffer,
            dwBufferLength,
            &dwBytesWritten,
            NULL
            );

        //
        // Free the buffer allocated by the system.
        //
        LocalFree(MessageBuffer);
    }

    //
    // If we loaded a message source, unload it.
    //
    if(hModule != NULL)
        FreeLibrary(hModule);
}

Dopo aver compilato questo programma, è possibile inserire il numero di codice di errore come argomento e il programma visualizzerà il testo. Ad esempio:

C:\> netmsg 2453
Could not find domain controller for this domain