Suchen von Text nach Fehlercodenummern
Manchmal ist es erforderlich, Fehlertext anzuzeigen, der fehlercodes zugeordnet 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 werden in der SDK-Headerdatei lmerr.h definiert.
Die Funktionen LoadLibrary und LoadLibraryEx können Netmsg.dll laden. Die FormatMessage-Funktion ordnet einen Fehlercode dem Meldungstext zu, wenn der Netmsg.dll-Datei ein Modulhandle zugeordnet wird.
Im folgenden Beispiel wird veranschaulicht, wie Der Fehlertext angezeigt wird, der Netzwerkverwaltungsfunktionen zugeordnet ist, sowie fehlertext, der systembezogenen Fehlercodes zugeordnet ist. Wenn sich die angegebene Fehlernummer in einem bestimmten Bereich befindet, wird das netmsg.dll-Nachrichtenmodul geladen und verwendet, um die angegebene Fehlernummer mit der FormatMessage-Funktion zu suchen.
#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