Suchen nach Text für Fehlercodenummern

Manchmal ist es erforderlich, Fehlertext anzuzeigen, der mit Fehlercodes verknüpft ist, die von netzwerkbezogenen Funktionen zurückgegeben werden. Möglicherweise müssen Sie diese Aufgabe mit den vom System bereitgestellten Netzwerkverwaltungsfunktionen ausführen.

Der Fehlertext für diese Meldungen befindet sich in der Meldungstabellendatei mit dem Namen Netmsg.dll, die sich in %systemroot%\system32 befindet. Diese Datei enthält Fehlermeldungen im Bereich NERR_BASE (2100) bis MAX_NERR(NERR_BASE+899). Diese Fehlercodes sind in der SDK-Headerdatei lmerr.h definiert.

Die Funktionen LoadLibrary und LoadLibraryEx können Netmsg.dll laden. Die FormatMessage-Funktion ordnet einen Fehlercode dem Nachrichtentext zu, wenn ein Modulhandle der Netmsg.dll-Datei zugewiesen wird.

Im folgenden Beispiel wird veranschaulicht, wie Fehlertext angezeigt wird, der netzwerkverwaltungsfunktionen zugeordnet ist, zusätzlich zum Anzeigen von Fehlertext, der systembezogenen Fehlercodes zugeordnet ist. Wenn sich die angegebene Fehlernummer in einem bestimmten Bereich befindet, wird das netmsg.dll Meldungsmodul geladen und verwendet, um die angegebene Fehlernummer mit der FormatMessage-Funktion nachzuschlagen.

#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);
}

Nachdem Sie dieses Programm kompiliert haben, können Sie die Fehlercodenummer als Argument einfügen, und das Programm zeigt den Text an. Beispiel:

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