FindWindow ist komisch



  • Hi, ich hätte da mal ne Frage. Also ich starte mit CreateProcess eine Batch-Datei.
    Dannach will ich wissen ob die Batch durchgelaufen ist , oder ob sie abgebrochen wurde bzw. ob ein Fehler aufgetreten ist.

    Das mach ich so :

    if(CWnd * pWnd = FindWindow(0,"C:\\WINDOWS\\system32\\cmd.exe" ))
    {
    AfxMessageBox("Ein Fehler ist aufgetreten! Prozess abbgebrochen!");
    ShowWindow(SW_SHOW);
    return OnInitDialog();
    
    }
    
    else
    {
    MessageBox("Erfolgreich Beendet!");
    OnCancel();  
    }
    

    Ab und zu funktioniert das und ab und zu nicht. Ich hab keine Ahnung warum 😕
    Kann mir vll einer sagen warum das überhaupt ab und zu funktioniert und warum es nicht immer funktionieren kann 🙄 ?

    Mfg



  • Wie äußert sich denn das "Ab und zu funktioniert das und ab und zu nicht"?

    Und warum betreibst du überhaupt diesen Aufwand? CreateProcess() liefert dir doch auch einen Handle auf das geöffnete Programm zurück, an dem du viel zuverlässiger feststellen kannst, ob es noch läuft:

    PROCESS_INFORMATION pi;
    CreateProcess(..., &pi);
    
    ...
    
    if(WaitForSingleObject(pi.hProcess,0)==WAIT_TIMEOUT)
    {
      AfxMessageBox("Batch läuft noch");
    }
    else
    {
      AfxMessageBox("erfolgreich beendet");
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
    }
    


  • Naja ab und zu zeigt er mir eben an das ein Fehler aufgetreten ist wenn ich die Batch schliesse während sie noch läuft.
    Und ab und zu zeigt er mir die Fehlermeldung an obwohl eigentlich alles glatt gelaufen ist.
    Andersherum isses dasselbe, ab und zu zeigt er mir an das der Prozess erfolgreich war, obwohl er es nicht war, da ich die batch während dem ausführen geschlossen habe.

    Ich wusste nicht wie ich das mit dem CreateProcess handle handhaben soll, aber so wie du es geschrieben hast funtzt es , danke 🙂

    Edit : Mist, leider ist das doch was ganz anderes bei dir. Mit deinem Code zeigt er mir natürlich richtig an das der Prozess läuft während die Batch läuft, aber wenn ich während die Batch läuft, die Batch schliesse, zeigt er mir trotzdem an das die Batch erfolgreich war...



  • Habs jetzt mal mit mit dem tollen GetExitCodeProcess versucht...aber da geht auch nix.

    WaitForSingleObject(pi.hProcess,INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread); 
    
    LPDWORD code;
    
    GetExitCodeProcess(pi.hProcess,code);
    
    if(code != NULL)
    {
    ShowWindow(SW_RESTORE);
    MessageBox("moep");
    }
    
    else
    {
    ShowWindow(SW_RESTORE);
    MessageBox("Beendet!");	
    }
    

    Eigentlich musste doch der exitcodeprocess unterschiedlich sein wenn der Batch Prozess abgebrochen wird oder eben sich von selbst beendet. Aber wenn ich im Debugger nachgucke, gibt der mir immer den selben Wert von "code". Warum erkennt der da keinen Unterschied ?



  • Erstens: Die beiden CloseHandle-Aufrufe solltest du erst dann unterbringen, wenn du die Handles nicht mehr benötigst - und diese Handles sind deine einzige Verbindung zur Batch-Datei.

    Zweitens: Es ist eine Weile her, seitdem ich mit Batch-Dateien gearbeitet habe, aber afair bieten die nahezu keine Möglichkeit zu Status-Rückgaben. Da mußt du wohl eine eigene Möglichkeit finden, wie die Batch-Datei dem Aufrufer mitteilt, was aus ihr geworden ist.



  • Hmmm ok schade, aber trotzdem thx für die Info


Anmelden zum Antworten