none
DOS-Box unterdrücken dennoch Exit-Code auslesen RRS feed

  • Frage

  • Gegeben ist eine Visual C++ 2010 GUI-Anwendung und eine Konsolenapplikation, erstellt mit Visual C++ 6! (kein GUI).

    Aufgabe: Das GUI soll die Konsolenapplikation aufrufen und dieser einen Dateinamen als Parameter übergeben. Die Konsolenanwendung öffnet die Datei, arbeitet damit und schließt sich wieder. Dabei wird an das GUI ein Rückgabewert übergeben. Durch die Verwendung der Klasse Process und ihre Members funktioniert die Ausführung des Kommandozeilen-Programmes funktioniert.  Ich übergebe den Namen der ausführbaren Datei sowie ein Argument, das den vollständigen Pfad einer Datei darstellt, die das Kommandozeilen-Programm verarbeiten soll.  Hier mein Quellcode:

    p = gcnew Process();
    try
    {
    	ProcessStartInfo^ psi = gcnew ProcessStartInfo("cmd", "/K \"conv6.exe C:\\Temp\\Test123.xls\"");
    	psi->CreateNoWindow = true;
    	p->StartInfo = psi;
    	p->EnableRaisingEvents = true;
    	p->Exited += gcnew EventHandler(this, &ExtPrgmStrt::Form1::processExited);
    	p->Start();
    }
    catch ( Exception^ e ) 
    {
    	label1->Text = ( e->Message );
    }
    void processExited(System::Object^ sender, System::EventArgs ^e)
    {
    	label1->Text = "Prozess Exit-Code: " + Convert::ToString(p->ExitCode);
    }

    Problem:  Ich kann den Exit (Return) Code des Kommandozeilen-Programmes in der DOS-Box sehen - leider muss ich die DOS-Box manuell schließen (mit dem DOS-Befehl exit). Die CreateNoWindow Eigenschaft auf true gesetzt scheint keine Wirkung zu haben. Des Weiteren bekomme ich den Exit-Code in meiner GUI-Anwendung erfolgreich zurück, aber nur nachdem ich die DOS-Box manuell schließe.

    Kann jemand mir bitte helfen?  Wie kann man richtig das Erscheinen der DOS-Box unterdrücken und dennoch den Exit-Code ins GUI einlesen?

    Montag, 28. Januar 2013 13:56

Antworten

  • Hallo Kollegen, ich habe gerade selbst mein Problem gefunden - öfters ist es halt so, dass das Problem vor dem Bildschirm sitzt.  ;-)

    Die nachstehende Zeile funktioniert wie gewünscht:

    ProcessStartInfo^ psi = gcnew ProcessStartInfo("cmd", "/C \"conv6.exe C:\\Temp\\Test123.xls\"");

    Das "\C... am Angfang des zweiten Parameters ist ganz wichtig: das \C gibt an, dass der Befehlsinterpreter den festgelegten Befehl bzw. das Programm ausführen und danach enden soll.  Für debugging Zwecke hatte ich \K - dieser Parameter gibt an, dass das angegebene Programm bzw. der Befehl ausgeführt werden soll und zeigt dann die MS-DOS- Eingabeaufforderung an, d.h. die DOS-Box bleibt offen.
    • Als Antwort markiert devashsource Montag, 28. Januar 2013 14:47
    Montag, 28. Januar 2013 14:44