2016-12-10 5 views
0

Ich habe eine vorkompilierte EXE (native C++ 11), die an einem bestimmten Punkt im iterativen Prozess abstürzt (Zugriffsverletzungsfehler). Ich kann es mir nicht leisten, es zu debuggen und es für jetzt neu zu kompilieren.Erneutes Ausführen eines Programms nach der Maschinenausnahme

Ich dachte an eine schmutzige Lösung. Ich werde ein anderes Programm machen, das für die Ausführung dieser exe verantwortlich ist und wenn es nicht mehr funktioniert, führe ich es einfach erneut aus.

Ist es möglich? Wie kann ich wissen, dass das Programm gestoppt wurde?

Hinweis: Ich bin auf Windows und Entwicklung mit MSVS.

+2

'CreateProcess' gibt einen Punkt zurück, den Sie abfragen können, nicht wahr? –

+0

sollte ich WaitForSingleObject (pi.hProcess, INFINITE); ? Ist dies der Fall, wenn die Anwendung abgestürzt ist? –

+0

sollte leicht zu lesen, die Dokumentation und ein wenig Test –

Antwort

2

Ich habe eine Lösung mit @Richard Hodges gefunden. UI Fehlermeldung, wenn ein Programmabsturz zu deaktivieren, indem Sie diesen Wert in der Registrierung zu ändern

#include <Windows.h> 
#include <string> 
#include <iostream> 
#include <windows.h> 
#include <stdio.h> 
#include <tchar.h> 

int main(int argc, const char**argv) { 
    while (true) { 
     TCHAR ProcessName[256]; 
     STARTUPINFO si; 
     PROCESS_INFORMATION pi; 
     wcscpy(ProcessName, L"FaultyProgram.exe"); 
     ZeroMemory(&si, sizeof(si)); 
     si.cb = sizeof(si); 
     ZeroMemory(&pi, sizeof(pi)); 
     // Start the child process. 
     if (!CreateProcess(NULL, // No module name (use command line) 
      ProcessName,  // Command line 
      NULL,   // Process handle not inheritable 
      NULL,   // Thread handle not inheritable 
      FALSE,   // Set handle inheritance to FALSE 
      CREATE_NEW_CONSOLE,    // No creation flags 
      NULL,   // Use parent's environment block 
      NULL,   // Use parent's starting directory 
      &si,   // Pointer to STARTUPINFO structure 
      &pi)   // Pointer to PROCESS_INFORMATION structure 
      ) 
     { 
      printf("CreateProcess failed (%d).\n", GetLastError()); 
      return 0; 
     } 

     // Wait until child process exits. 
     WaitForSingleObject(pi.hProcess, INFINITE); 

     // Close process and thread handles. 
     CloseHandle(pi.hProcess); 
     CloseHandle(pi.hThread); 
    } 
    return 0; 
} 

Und der wichtigste Teil ist:

Machen Sie ein neues Programm mit dem diesem Code

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Windows Error Reporting 
"DontShowUI"=dword:00000001 

anstelle von:

"DontShowUI"=dword:00000000 
Verwandte Themen