exe datei in neuem dos-fenster öffnen



  • Hallo zusammen,
    ich möchte zwei exe files miteinander koppeln. Zum Beispiel: Ich habe 2 Dateien : File_1.exe und File_2.exe. Ich möchte nun in File_1.exe die Datei File_2.exe in einem neuen Fenster starten. Kann mir da jemand bitte weiterhelfen?
    Mit dem Befehl system ("File_2.exe") kann ich das programm starten, jedoch nicht in einem neuen Fenster.

    Grüße,
    Markus



  • system ("start File_2.exe")



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • oder

    #include <windows.h>
    
    int main( )
    {
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
    
        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        ZeroMemory( &pi, sizeof(pi) );
    
        CreateProcess(
            0,
            "\"D:\\deine.exe\"",
            0, 0, 0
            CREATE_NEW_CONSOLE,
            0, 0,
            &si,
            &pi
        );
    
        // Warten, bis der Prozess endet
        WaitForSingleObject( pi.hProcess, INFINITE );
    
        // Prozess- und Threadhandle schließen
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
    

    vgl. ➡ CreateProcess

    Greetz, Swordfish



  • Vielen Dank, das hat geklappt (mit Create Process....).
    Mein File_2.exe fordert von mir einen returnbefehl zum beenden des programms auf, sodass ich dann zu file_1.exe zurückkehren kann. Kann ich von File_1.exe aus mein File_2.exe mit der returntaste (wenns geht automatisch, da ich des öfteren zwischen den beiden exe files hin und herspringen will) beenden?
    Danke euch.
    Grüße,
    Markus



  • Markus Anfänger schrieb:

    Kann ich von File_1.exe aus mein File_2.exe mit der returntaste (wenns geht automatisch, da ich des öfteren zwischen den beiden exe files hin und herspringen will) beenden?[...]

    Erklär mir doch bitte mal, was deine 2 Programme machen und was deren gegenseitiger Aufruf bewerkstelligen soll. Biiieetteee!

    Greetz, Swordfish



  • Hallo Swordfish,

    alles klar, also:
    File 1.exe erzeugt eine Steuerungsdatei (stinknormale textdatei) für File 2.exe. File 2.exe greift auf diese zu und führt dann berechnungen durch und schreibt ergebnisfiles (auch textdateien). Je nach den Berechnungsergebnissen muss sich dann auch wieder die Steuerungsdatei ändern, sodass wieder File 1.exe die Steuerungstextdatei ändern muss um dann File 2.exe wieder zu starten. Problem dabei ist, File 1.exe hab ich geschrieben, File 2.exe ist ein kommerzielles Programm auf dessen Quellcode ich nicht zugreifen kann, wenn File 2 fertiggerechnet hat, dann wird um das Drücken der Returntaste gebeten, erst dann läüft aber mein File 1.exe weiter (File 2 ist bei meinem programm file 1 in eine schleife gebettet). Ich will das ganze automatisieren und auf das ewige Returntastedrücken verzichten.

    Merci beaucoup,

    Markus



  • Versuch mal' mit WM_KEYDOWN und WM_KEYUP den druck der Entertaste zu simulieren. Musst dir natürlich vorher 'n handle auf das Fenster holen ( FindWindow( ) ).

    Greetz, Swordfish



  • CreateProcess mit STARTF_USESTDHANDLES und redirect des StdInputs:
    http://support.microsoft.com/kb/190351/en-US



  • Danke Jochen. Man ist ja lernfähig 😉

    Greetz, Swordfish



  • Also so, wenn ich das richtig verstanden habe, Jochen?

    #include <conio.h>
    #include <windows.h>
    
    int main( )
    {
        PROCESS_INFORMATION pi;
        STARTUPINFO si;
    
        memset( %si, 0, sizeof( STARTUPINFO ) );
    
        si.cb = sizeof( STARTUPINFO );
        si.dwFlags = STARTF_USESTDHANDLES;
        si.hStdOutput = GetStdHandle( STD_OUTPUT_HANDLE );
        si.hStdInput  = GetStdHandle( STD_INPUT_HANDLE );
        si.hStdError  = GetStdHandle( STD_ERROR_HANDLE );
    
        CreateProcess(
            0,
            "\"Child.EXE\"",
            0, 0,
            true,
            CREATE_NEW_CONSOLE,
            0, 0,
            &si,
            &pi
        );
    
        _ungetch( '\n' );    
    
        // Warten, bis der Prozess endet
        WaitForSingleObject( pi.hProcess, INFINITE );
    
        // Prozess- und Threadhandle schließen
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
    }
    

    lieg' ich richtig?

    Greetz, Swordfish



  • hallo jochen,
    danke erstmal aber hiiiilfe, kenn mich nicht mehr aus.



  • @Markus Anfänger:
    Vielleicht kann ich es dir erklären:
    Jedes Konsolenfenster hat 3 "Geräte" (devices):

    • Standard Input (stdin in C)
    • Standard Output (stdout in C)
    • Standard Error (stderr in C)

    wenn du zB:

    printf( "Hello" )
    

    machst, wird "Hello" in der Regel nach stdout geschrieben. Diese Handles kannst du dir auch mit

    GetStdHandle( STD_INPUT_HANDLE );  // ,
    GetStdHandle( STD_OUTPUT_HANDLE ); // bzw.
    GetStdHandle( STD_ERROR_HANDLE );  //
    

    geben lassen. Nun kannst du in deiner STARTUPINFO die Handles, die die neue Konsole bekommen soll, eintragen:

    STARTUPINFO si;
    
    memset( %si, 0, sizeof( STARTUPINFO ) );
    
    si.cb = sizeof( STARTUPINFO );
    si.dwFlags = STARTF_USESTDHANDLES; // Sets the standard input, standard output,
                                       // and standard error handles for the process
                                       // to the handles specified in the hStdInput,
                                       // hStdOutput, and hStdError members of the
                                       // STARTUPINFO structure. The CreateProcess
                                       // function's fInheritHandles parameter must
                                       // be set to TRUE for this to work properly.
    
    si.hStdOutput = GetStdHandle( STD_OUTPUT_HANDLE ); // \
    si.hStdInput  = GetStdHandle( STD_INPUT_HANDLE );  //  > Handles setzen.
    si.hStdError  = GetStdHandle( STD_ERROR_HANDLE );  // /
    

    Dann noch der Aufruf, um den Prozess zu starten:

    CreateProcess(
        0,
        "\"Child.EXE\"",
        0, 0,
        true,
        CREATE_NEW_CONSOLE,
        0, 0,
        &si,
        &pi
    );
    

    Da dein aufgerufenes Programm ein drücken der Entertaste verlangt:

    _ungetch( '\n' );  // legt '\n' als das als nächstes zu lesende Zeichen fest.
    

    Dann noch warten, bis der Prozess endet:

    WaitForSingleObject( pi.hProcess, INFINITE );
    

    und schon hast du fertig! ( hoff' ich zumindest 😉 )

    Greetz, Swordfish



  • Swordfish schrieb:

    Also so, wenn ich das richtig verstanden habe, Jochen?

    Nicht ganz richtig verstanden...
    Du willst ja bei der zweiten Applikation die RETURN Taste drücken, oder?
    Dann musst Du die Eingabe der zweiten App auf einen Pipe umleiten und dann dort ein "RETURN" reinschreiben.
    Wenn Du es nur auf Deine eigene StdIn/Out/Err umleitest, musst Du halt in Deinem Fenster Return drücken... ich dachte der OP will es aber automatisch machen, oder?

    PS: Was für ein bescheuertes Programm ist es denn, welches Return verlangt???
    Solche Fehler machen eigentlich nur anfänger die es nicht kapieren, dass Consolen-Programme sich sofort beenden, wenn sie fertig sind... (siehe diverse Diskussionen hier: "Warum geht mein Programm sofort wieder zu nach dem Start?")



  • ja, ich will bei dem 2. Programm die Returntaste drücken, jedoch vom 1. Programm aus. Wie funktioniert das mit dem Pipe????

    P.S.: das programm 2 ist eine kommerzielle software und eine neu version, bei der alten war das noch nicht, ich frag mich schon ob das nicht reine schikane des programmierers ist, ich kanns nämlich auch nicht nachvollziehen.



  • Jochen Kalmbach schrieb:

    Du willst ja bei der zweiten Applikation die RETURN Taste drücken, oder?
    Dann musst Du die Eingabe der zweiten App auf einen Pipe umleiten und dann dort ein "RETURN" reinschreiben.
    Wenn Du es nur auf Deine eigene StdIn/Out/Err umleitest, musst Du halt in Deinem Fenster Return drücken...

    Naja, ich dachte, da der mit CreateProcess() erstellte Prozess doch meine Handles bekommt, kann ich mit

    _ungetch( '\n' );
    

    den Tastendruck simulieren, da doch dieses '\n' dann von der anderen Anwendung unweigerlich gelesen wird.

    Greetz, Swordfish



  • Swordfish schrieb:

    _ungetch( '\n' );

    Hat nichts mit der WinAPI zu tun, und somit kann man damit auch keine Tastendrücke simulieren. Das ist eine reine CRT Funktion, die das Zeichen in einen internen Puffer schreibt und Du es mit anderen CRT-Funktionen wieder auslesen kannst. Aber mit WinAPI Funktionen kannst Du dieses Zeichen nie bekommen (z.B. ReadConsole).


Log in to reply