Condividi tramite


Ricerca di 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 si trova nel file della tabella dei messaggi denominato Netmsg.dll, disponibile in %systemroot%\system32. Questo file contiene messaggi di errore nell'intervallo NERR_BASE (2100) da MAX_NERR(NERR_BASE+899). Questi codici di errore vengono definiti nel file di intestazione dell'SDK lmerr.h.

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

Nell'esempio seguente viene illustrato come visualizzare il testo degli errori associato alle funzioni di gestione della rete, oltre a visualizzare il testo degli errori associato 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 funzioneFormatMessage.

#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. Per esempio:

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