2009-11-08 15 views
6

To może nie być pytanie związane wyłącznie z programowaniem, ale często spotykam się z tym podczas programowania. Gdy moja aplikacja ulega awarii i wybieram jej usunięcie, system Windows automatycznie wyświetla okno dialogowe "Sprawdzanie, czy roztwór ...". Kiedy kliknę przycisk "Anuluj", otrzymuję kolejne okno dialogowe z napisem "Restartowanie programu ..." Czy istnieje sposób, aby temu zapobiec? Gdy zatrzymam aplikację, wolałbym, aby została ona cicho zabita. Używam Windows 7, jeśli platforma jest ważna.Windows - Zapobieganie awariom "Sprawdzanie rozwiązania ..." i "Ponowne uruchamianie programu ..."

Odpowiedz

4

Aby kontrolować to zachowanie, wykonaj czynności opisane w sekcji this article.

+0

Świetne rozwiązanie, usuwa WER dla wszystkich aplikacji. –

2

Chociaż Microsoft zaleca użycie nowszej API zastępczy dostępne tylko w systemie Windows Vista i nowszych istnieje API, które działa dla wszystkich wersji systemu Windows od XP: AddERExcludedApplication(). Ta funkcja pobiera nazwę modułu bez informacji o ścieżce (np. "Myprogram.exe"), dla której zgłaszanie błędów ma zostać wyłączone.

Nowa dostępna tylko metoda Windows Vista i nowsze wersje to wywołanie WerAddExcludedApplication() function. Ten interfejs API pozwala określić, czy powinien on zmienić gałąź rejestru HKEY_CURRENT_USER, czy gałąź rejestru HKEY_LOCAL_MACHINE. Pamiętaj, aby ustawić to dla HKCU jeśli zestaw HKLM zawiedzie, takich jak:

 
typedef BOOL (*ADD_MER_EXCLUDED_APP_XP)  (PCWSTR); 
typedef BOOL (*ADD_MER_EXCLUDED_APP_VISTA) (PCWSTR, BOOL); 

bool disable_microsoft_error_reporting(PCWSTR wz_app) 
{ 
    const WCHAR * const WZ_MER_DLL_XP  = L"faultrep.dll"; 
    const char * const SZ_MER_PROC_XP  = "AddERExcludedApplicationW"; 

    const WCHAR * const WZ_MER_DLL_VISTA = L"wer.dll"; 
    const char * const SZ_MER_PROC_VISTA = "WerAddExcludedApplicationW"; 

    const int WER_EXCLUDE_FOR_ALL_USERS = TRUE; 
    const int WER_EXCLUDE_FOR_THIS_USER = FALSE; 

    HANDLE  hlib_error_reports_xp  = NULL; 
    HANDLE  hlib_error_reports_vista = NULL; 

    ADD_MER_EXCLUDED_APP_XP  add_mer_excluded_app_xp  = NULL; 
    ADD_MER_EXCLUDED_APP_VISTA add_mer_excluded_app_vista = NULL; 

    bool  success      = false; 

    // First, attempt the API that has been around since XP. 
    hlib_error_reports_xp = LoadLibrary(WZ_MER_DLL_XP); 

    if (hlib_error_reports_xp) 
    { 
     add_mer_excluded_app_xp = (ADD_MER_EXCLUDED_APP_XP)GetProcAddress(hlib_error_reports_xp, SZ_MER_PROC_XP); 

     if (add_mer_excluded_app_xp) 
      success = add_mer_excluded_app_xp(wz_app); 

     FreeLibrary(hlib_error_reports_xp); 
     hlib_error_reports_xp = NULL; 
     add_mer_excluded_app_xp = NULL; 

     if (success) 
      return true; 
    } 

    // That did not succeed. Attempt the Vista API. 
    hlib_error_reports_vista = LoadLibrary(WZ_MER_DLL_VISTA); 

    if (hlib_error_reports_vista) 
    { 
     add_mer_excluded_app_vista = (ADD_MER_EXCLUDED_APP_VISTA)GetProcAddress(hlib_error_reports_vista, SZ_MER_PROC_VISTA); 

     if (add_mer_excluded_app_vista) 
     { 
      success = (S_OK == add_mer_excluded_app_vista(wz_app, WER_EXCLUDE_FOR_ALL_USERS)); 

      if (!success) 
       success = (S_OK == add_mer_excluded_app_vista(wz_app, WER_EXCLUDE_FOR_THIS_USER)); 
     } 

     FreeLibrary(hlib_error_reports_vista); 
     hlib_error_reports_vista = NULL; 
     add_mer_excluded_app_vista = NULL; 

     if (success) 
      return true; 
    } 

    // Nothing worked. Fail. 
    return false; 
} 

Aby dodatkowo ograniczyć wykonywanie elementów WER, imeplement nieobsługiwany wyjątek filtr i przekazać go do: SetUnhandledExceptionFilter() function. Aby zablokować WER, filtr nie może nigdy wrócić EXCEPTION_CONTINUE_SEARCH ani EXCEPTION_EXECUTE_HANDLER.

Jedną z wad implementacji funkcji SetUnhandledExceptionFilter() jest zakłócenie debugowania Just-in-time.

Wspominasz, że chcesz, aby aplikacja była "cicho zabita". W takim przypadku:

 

LONG WINAPI global_exception_filter(struct _EXCEPTION_POINTERS *exception_info) 
{ 
    ExitProcess(0xDEDD000D); 
} 


int WINAPI WinMain(
    HINSTANCE _hinstance, 
    HINSTANCE hinstance_prev, 
    LPSTR sz_cmd_line, 
    int cmd_show 
) 
{ 
    SetUnhandledExceptionFilter(global_exception_filter); 
    /* ... */ 
} 

Powoduje natychmiastowe zniknięcie aplikacji po nieobsługiwanym wyjątku. N.B. kod powrotu do zwrotu jest kwestią gustu.

+4

OGROMNE OGRANICZENIE: Nikt nie powinien KIEDYKOLWIEK używać SetUnhandledExceptionFilter w kodzie produkcyjnym. Jeśli używasz SetUnhandledExceptionFilter, upewnij się, że zadzwonisz TerminateProcess w filtrze wyjątku - w przeciwnym razie masz zamiar skręcić łatwo debuggable awarii w jednej z dwóch rzeczy: Jeśli masz szczęście, można uzyskać subtelny uszkodzenia pamięci, który będzie nie sprawia kłopotów Twoim klientom. Jeśli nie masz szczęścia, wprowadzisz w aplikacji przydatny błąd bezpieczeństwa. –

+0

W rzeczywistości moja myśl została zainstalowana filtr, który wywołuje FatalAppExit(). BTW, hi Larry! –

+0

@Larry, dla WerAddExcludedApplication(), czy wiesz, że wymaga to nazwy modułu, a nie pełnej ścieżki lub odwrotnie? –

1

Zdaję sobie sprawę, że inni odpowiedział sposobów obejścia tego, ale ...

Nie zapominajmy, że najlepszym sposobem, aby chronić się przed tym jest napisanie programu, który nie psuje. :-) Nie powinieneś tego widzieć, jeśli poprawnie używasz pamięci i nie wieszasz wątku GUI.

Zmiana zachowania się awarii aplikacji to świetny sposób na wprowadzenie subtelnych i śmiertelnych błędów. Zobacz także this blog post od firmy Microsoft Raymond Chen.

+0

To James Cadd w prawo, aby zapobiec Microsoft od szpiegostwo na jego kodu, niezależnie od tego, czy jego awarii kodu lub niektóre dll MS nazywa awarii na 1 .% systemów klientów –

+0

nie sądzę oni szpiegostwo na jego kodzie Wszystkie raporty o awariach znudzisz się do ich systemu Winqual gdzie deweloperzy widzą raportów o awariach do swoich aplikacji. http://en.wikipedia.org/ wiki/Winqual –

+0

Tak, wszystkie deweloperów, którzy posiadają certyfikaty można zobaczyć raporty dla własnej aplikacji. w przypadku, gdy stwierdzono, że pracownicy firmy Microsoft nie może spojrzeć na raporty dla aplikacji 3rd-partyjnych? nie szukaj tej klauzuli w używaniu umowa - jej nie ma. –

Powiązane problemy