Come modificare la gestione popup degli errori rigidi in Windows

In un ambiente automatico, è possibile inviare automaticamente popup di errore rigido che richiedono l'intervento dell'utente. Questo articolo fornisce il codice necessario per modificare la modalità popup degli errori rigidi.

              Versione originale del prodotto: Windows
Numero KB originale: 128642

Riepilogo

Windows consente all'utente di modificare la gestione dei popup di errore rigido risultanti da errori di applicazione e di sistema. Tali errori includono nessun disco nell'unità e errori di protezione generale.

Questi eventi causano la visualizzazione di un popup di errore rigido, che richiede l'intervento dell'utente per l'invio. Questo comportamento può essere modificato in modo che tali errori vengano registrati nel registro eventi di Windows. Quando l'errore viene registrato nel registro eventi, non è necessario alcun intervento dell'utente e il sistema fornisce un gestore predefinito per l'errore rigido. L'utente può esaminare il registro eventi per determinare la causa dell'errore rigido.

Voce del Registro di sistema

La voce del Registro di sistema seguente controlla la gestione popup degli errori rigidi in Windows:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode

Modalità valide

Di seguito sono riportati i valori validi per ErrorMode:

  • Modalità 0

    Si tratta della modalità operativa predefinita che serializza gli errori e attende una risposta.

  • Modalità 1

    Se l'errore non proviene dal sistema, questa è la normale modalità operativa. Se l'errore proviene dal sistema, l'errore viene registrato nel registro eventi e restituisce OK all'errore rigido. Non è necessario alcun intervento e il popup non viene visualizzato.

  • Modalità 2

    L'errore viene sempre registrato nel registro eventi e restituisce OK all'errore rigido. I popup non vengono visualizzati.

In tutte le modalità, gli errori rigidi originati dal sistema vengono registrati nel log di sistema. Per eseguire un server automatico, usare la modalità 2.

Codice di esempio per modificare la modalità popup degli errori rigidi

La funzione seguente modifica la modalità popup dell'errore rigido. Se la funzione ha esito positivo, il valore restituito è TRUE. Se la funzione ha esito negativo, il valore restituito è FALSE.

BOOL SetGlobalErrorMode(
    DWORD dwErrorMode   // specifies new ErrorMode value
    )
{
    HKEY hKey;
    LONG lRetCode;

    // make sure the value passed isn't out-of-bounds
    if (dwErrorMode > 2)
        return FALSE;

    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                    "SYSTEM\\CurrentControlSet\\Control\\Windows",
                    0,
                    KEY_SET_VALUE,
                    &hKey) != ERROR_SUCCESS)
        return FALSE;

    lRetCode=RegSetValueEx(hKey,
                            "ErrorMode",
                            0,
                            REG_DWORD,
                            (CONST BYTE *) &dwErrorMode,
                            sizeof(DWORD));

    RegCloseKey(hKey);
    if (lRetCode != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}

Codice di esempio per ottenere la modalità popup di errore rigido

La funzione seguente ottiene la modalità popup di errore rigido. Se la funzione ha esito positivo, il valore restituito è TRUE. Se la funzione ha esito negativo, il valore restituito è FALSE. Se la funzione ha esito positivo, dwErrorMode contiene la modalità popup degli errori. In caso contrario, dwErrorMode non è definito.

BOOL GetGlobalErrorMode(
    LPDWORD dwErrorMode // Pointer to a DWORD to place popup mode
    )
{
    HKEY hKey;
    LONG lRetCode;
    DWORD cbData=sizeof(DWORD);

    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                    "SYSTEM\\CurrentControlSet\\Control\\Windows",
                    0,
                    KEY_QUERY_VALUE,
                    &hKey) != ERROR_SUCCESS)
        return FALSE;

    lRetCode=RegQueryValueEx(hKey,
                            "ErrorMode",
                            0,
                            NULL,
                            (LPBYTE) dwErrorMode,
                            &cbData);

    RegCloseKey(hKey);
    if (lRetCode != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}