Über Visual Studio 2013 C++ ein Programm steuern im allg



  • Alles Klar, ich schau es mir dann an.



  • Mal von den offensichtlichen Syntax-Fehler abgesehen, ist "D:\\Test Easyport.vi" keine Programm-Datei und kann dementsprechend auch nicht mittels** CreateProcess() **gestartet werden.

    Die Befahls-Zeile müsste eher so aussehen (ist natürlich bloß ein Beispiel!):
    ** "C:\Programme\Ein Programm das VI Dateien Öffnen kann\Program.exe" --open "D:\Test Easyport.vi" **

    Bzw. als C String Literal mit den benötigten "Escape" Zeichen dann so:
    ** "\"C:\\Programme\\ein Programm das VI Dateien öffnen kann\\Program.exe\" --open \"D:\\Test Easyport.vi\"" **

    Außerdem musst Du deine STARTUPINFO Struktur vorher mit sinnvollen Werten initialisieren...

    Mein Tipp: Lass es erstmal mit der Win32 API bleiben 😉

    DeathCubeK schrieb:

    Wenn es einfach darum geht in C/C++ ein Programm mit bestimmten Aufruf-Parametern zu starten, dann musst Du dafür gar nicht auf die Win32 API runter gehen!

    Das kannst Du in reinem C mittels** system() **bzw.** spawn() **Aufruf lösen. Das ist einfacher und dazu auch noch portabel. Wenn Du auch die Textausgabe des Kinder-Prozesses abgreifen/verarbeitet willst, schau dir mal** QProcess **aus Qt an...



  • Alles Klar kein CreateProcess()
    sondern system() oder spawn() was wäre denn sinnvoller?



  • laz53 schrieb:

    Alles Klar kein CreateProcess()
    sondern system() oder spawn() was wäre denn sinnvoller?

    ** system() führt den angegebenen Befehl in der "Shell" aus, d.h. unter Windows im Kommandozeilen-Interpreter (CMD.EXE). Deshalb funktionieren dort auch Befehle wie "dir" oder "echo", die ja keine eigenen Programme, sondern eingebaute Befehle von CMD.EXE sind. Ganz so, als würdest Du den Befehl von Hand in die Eingabeaufforderung eintippen. spawn() hingegen startet einfach einen neuen Prozess, d.h. Du musst auf jeden Fall eine Programm-Datei angeben. Außerdem kann spawn() asynchron arbeiten, wenn Du das erste Parameter auf _P_NOWAIT setzt. Dann wartet er nicht, bis das Programm beendet wurde, sondern gibt er Dir sofort einen Handle zurück. Das Hauptprogramm kann dann parallel weiter laufen. Um auf das Ende des Kinder-Prozesses zu warten, benutzt Du in diesem Fall cwait() **.

    Was Du letzten Endes benutzt hängt davon ab, was Du machen willst. Um einfach ein Programm zu starten (mit bestimmten Parametern), ist** spawn() normalerweise passender. Wenn der Befehl in einer Shell laufen soll, muss es system() **sein...

    //Start process with parameters - don't forget the terminating NULL !!!
    intptr_t handle = _spawnl(_P_NOWAIT, "C:\\Programme\\Mein Programm\\program.EXE", "Param #1", "Param #2", /*[...]*/, "Param #N", NULL)
    
    if(handle == -1)
    {
       printf(stderr, "Failed to create sub-process!\n");
       abort();
    }
    
    printf("Process started successfully.\n")
    
    /*Do something else here, while the sub-process is running in the background...*/
    /* [...] */
    
    printf("Now waiting for sub-process to terminate...\n")
    int exit_code;
    if(_cwait(&exit_code, handle, _WAIT_CHILD) == -1)
    {
       printf(stderr, "Failed to wait for sub-process!\n");
       abort();
    }
    
    printf("Process has terminated (Exit code: %d).\n", exit_code)
    


  • Vielen Dank DeathCubeK für die Hilfeichen Tipps.



  • Mal eine andere Frage... LabView ist doch dazu gemacht, so Steuerungen und GUIs dafür zu machen... Warum sollte man ein externes Programm schreiben, das die Hauptfunktionalität von einer teuren LabView-Lizenz außer Kraft setzt?



  • decimad schrieb:

    Mal eine andere Frage... LabView ist doch dazu gemacht, so Steuerungen und GUIs dafür zu machen... Warum sollte man ein externes Programm schreiben, das die Hauptfunktionalität von einer teuren LabView-Lizenz außer Kraft setzt?

    Bin zugegebenermaßen kein LabView Experte, aber vielleicht möchte er bestimmte Arbeitsabläufe automatisieren bzw. skripten. Das ist mit GUI-Anwendungen im Allgemeinen eher schwierig (auch wenn es so etwas wie AutoIt gibt).


Anmelden zum Antworten