J'ai une application qui provoque parfois des exceptions. Et j'ai besoin de le redémarrer s'il s'est écrasé. Mais le problème est que je possède Windows 7 ici et lorsque l'application se bloque, Windows me montre une belle boîte de dialogue avec une suggestion pour fermer l'application. Mais l'application elle-même est toujours en cours d'exécution jusqu'à ce que je clique "Fermer". Comment se débarrasser de cette fenêtre et faire une demande immédiatement sans aucune boîte de dialogue? P>
3 Réponses :
Ne pas savoir que la langue de votre application le rend un peu difficile, mais vous pouvez généralement gérer cela en exécutant votre application dans l'équivalent d'un bloc d'essai / prise (comme dans C #, C ++ ou Python). Dans pseudo-csharp-ish-code: essentiellement, le meilleur moyen de contourner une erreur "exception non manquée" est de gérer l'exception en l'attrapant et en prenant des mesures appropriées (même si cela L'action ne fait rien). P> Dans cet exemple, si quelqu'un voulait fermer votre application, vous définissez la valeur "Terminée" sur true et revenir de l'exécution (). P> P>
La demande de collision n'est pas la mienne.
Idéalement, vous attraperiez toutes les exceptions dans la portée la plus extérieure de votre programme. Cependant, parfois, vous n'avez pas le luxe de faire de tels changements et que les boîtes de dialogue des collisions vous empêchent de récupérer d'un crash. Dans ces cas, vous pouvez envisager de désactiver Rapport d'erreur Windows a>, entièrement ou pour un programme spécifique. P>
Sous Windows 7: Démarrer Orb -> Panneau de configuration -> Centre d'action -> Maintenance -> Rechercher des solutions aux rapports de problèmes -> Paramètres P>
MISE À JOUR: Pour désactiver complètement les erreurs Rapport d'erreur, UI Modifiez le Dontshowui Cadre de registre: P>
HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ Windows Reporting \ Dontshowui P>
Ce n'est pas ma candidature, qui se bloque. Et ce rapport est désactivé. Mais Windows affiche toujours la boîte de dialogue informatique, qui empêche l'exécutable écrasé de la résiliation jusqu'à ce que vous appuyez sur OK.
Mise à jour de la réponse pour inclure un paramètre de registre.
J'ai aussi une application qui n'est pas la mienne qui se bloque parfois. J'aimerais m'assurer que lorsqu'il se bloque, il se termine automatiquement sans demander à l'utilisateur la touche d'appuyer sur une fenêtre de notification.
Pour désactiver les signaler des erreurs, définissez DONTSHOWUI sur DWORD 0
Vous pouvez utiliser le concept du Dr Watson pour détecter le crash et redémarrer l'application. Utilisez ce qui suit:
Définir une minuterie comme: p>
void CMainFrame::OnTimer(UINT nIDEvent) {
case eIsDwwin:
HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
DWORD dwsma = GetLastError();
DWORD dwExitCode = 0;
PROCESSENTRY32 procEntry={0};
procEntry.dwSize = sizeof( PROCESSENTRY32 );
Process32First(hndl,&procEntry);
do {
if(((!strcmpi(procEntry.szExeFile,"dwwin.exe"))||
(!strcmpi(procEntry.szExeFile,"drwatson.exe"))||
(!strcmpi(procEntry.szExeFile,"drwtsn32.exe"))||
(!strcmpi(procEntry.szExeFile,"WerFault.exe"))) &&
(procEntry.th32ParentProcessID == GetCurrentProcessId())) {
WSACleanup();
PostMessage( WM_CLOSE);
Sleep(500);
if(0==strcmpi(procEntry.szExeFile,"dwwin.exe")) {
system("TASKKILL /IM dwwin.exe /F");
} else if(0==strcmpi(procEntry.szExeFile,"drwatson.exe")) {
system("TASKKILL /IM drwatson.exe /F");
} else if(0==strcmpi(procEntry.szExeFile,"drwtsn32.exe")) {
system("TASKKILL /IM drwtsn32.exe /F");
} else if(0==strcmpi(procEntry.szExeFile,"WerFault.exe")) {
system("TASKKILL /IM WerFault.exe /F");
} else {
system("TASKKILL /IM WerFault.exe /F");
}
break;
}
} while(Process32Next(hndl,&procEntry));
CloseHandle(hndl);
break;
}
}
Une autre solution utile est le paramètre de registre
HKEY_CURrent_USER \ Control Panel \ Desktop CODE> Créer une entrée REG_SZ nomméeAutoendTasks Code> et la définir sur 1Ensuite, la question devient: comment terminer immédiatement l'application spécifique (ID de processus)?