Abrufen von Netzwerkfehlern
Die WNet-Funktionen geben Fehlercodes aus Gründen der Kompatibilität mit Windows für Arbeitsgruppen zurück. Jede WNet-Funktion legt auch den Fehlercodewert fest, der von GetLastError zurückgegeben wird.
Wenn eine der WNet-Funktionen ERROR_EXTENDED_ERROR zurückgibt, kann eine Anwendung die WNetGetLastError-Funktion aufrufen, um zusätzliche Informationen zum Fehler abzurufen. Diese Informationen sind in der Regel spezifisch für den Netzwerkanbieter.
Das folgende Beispiel veranschaulicht eine anwendungsdefinierte Fehlerbehandlungsfunktion (NetErrorHandler). Die Funktion akzeptiert drei Argumente: ein Fensterhandle, den von einer der WNet-Funktionen zurückgegebenen Fehlercode und den Namen der Funktion, die den Fehler verursacht hat. Wenn der Fehlercode ERROR_EXTENDED_ERROR ist, ruft NetErrorHandler WNetGetLastError auf, um erweiterte Fehlerinformationen zu erhalten, und gibt die Informationen aus. Im Beispiel wird die MessageBox-Funktion aufgerufen, um Nachrichten zu verarbeiten.
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "mpr.lib")
#pragma comment(lib, "user32.lib")
BOOL WINAPI NetErrorHandler(HWND hwnd,
DWORD dwErrorCode,
LPSTR lpszFunction)
{
DWORD dwWNetResult, dwLastError;
CHAR szError[256];
CHAR szCaption[256];
CHAR szDescription[256];
CHAR szProvider[256];
// The following code performs standard error-handling.
if (dwErrorCode != ERROR_EXTENDED_ERROR)
{
sprintf_s((LPSTR) szError, sizeof(szError), "%s failed; \nResult is %ld",
lpszFunction, dwErrorCode);
sprintf_s((LPSTR) szCaption, sizeof(szCaption), "%s error", lpszFunction);
MessageBox(hwnd, (LPSTR) szError, (LPSTR) szCaption, MB_OK);
return TRUE;
}
// The following code performs error-handling when the
// ERROR_EXTENDED_ERROR return value indicates that the
// WNetGetLastError function can retrieve additional information.
else
{
dwWNetResult = WNetGetLastError(&dwLastError, // error code
(LPSTR) szDescription, // buffer for error description
sizeof(szDescription), // size of error buffer
(LPSTR) szProvider, // buffer for provider name
sizeof(szProvider)); // size of name buffer
//
// Process errors.
//
if(dwWNetResult != NO_ERROR) {
sprintf_s((LPSTR) szError, sizeof(szError),
"WNetGetLastError failed; error %ld", dwWNetResult);
MessageBox(hwnd, (LPSTR) szError, "WNetGetLastError", MB_OK);
return FALSE;
}
//
// Otherwise, print the additional error information.
//
sprintf_s((LPSTR) szError, sizeof(szError),
"%s failed with code %ld;\n%s",
(LPSTR) szProvider, dwLastError, (LPSTR) szDescription);
sprintf_s((LPSTR) szCaption, sizeof(szCaption), "%s error", lpszFunction);
MessageBox(hwnd, (LPSTR) szError, (LPSTR) szCaption, MB_OK);
return TRUE;
}
}