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



  • 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...



  • #include <iostream>
    #include <Windows.h>
    #include <stdlib.h>
    using namespace std;
    int main()
    {
    	BOOL WINAPI CreateProcess(
    		LPCTSTR "D:\\Test Easyport.vi", 
    		LPTSTR NULL, 
    		LPSECURITY_ATTRIBUTES NULL,
    		LPSECURITY_ATTRIBUTES NULL,
    		BOOL TRUE, 	
    		DWORD NORMAL_PRIORITY_CLASS, 
    		LPVOID NULL, 
            LPCSTR NULL, 
    		LPSTARTUPINFO STARTUPINFO, 
    		LPPROCESS_INFORMATION CloseHandle);	
    	return 0;
    }
    

    Gestern lief dieser Coder noch, mein Programm startete doch heute liefert es mir 23 Fehler und eine Warnung.

    Fehler 1 error C2143: Syntaxfehler: Es fehlt ')' vor 'Zeichenfolge' 8
    Fehler 2 error C2143: Syntaxfehler: Es fehlt ';' vor 'Zeichenfolge' 8
    24 IntelliSense: Es wurde eine ")" erwartet. 8
    Fehler 4 error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante' 9
    Fehler 3 error C2275: 'LPTSTR': Ungültige Verwendung dieses Typs als Ausdruck 9
    Fehler 6 error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante' 10
    Fehler 5 error C2275: 'LPSECURITY_ATTRIBUTES': Ungültige Verwendung dieses Typs als Ausdruck 10
    Fehler 8 error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante' 11
    Fehler 7 error C2275: 'LPSECURITY_ATTRIBUTES': Ungültige Verwendung dieses Typs als Ausdruck 11
    Fehler 10 error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante' 12
    Fehler 9 error C2275: 'BOOL': Ungültige Verwendung dieses Typs als Ausdruck 12
    Fehler 12 error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante' 13
    Fehler 11 error C2275: 'DWORD': Ungültige Verwendung dieses Typs als Ausdruck 13
    Fehler 14 error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante' 14
    Fehler 13 error C2275: 'LPVOID': Ungültige Verwendung dieses Typs als Ausdruck 14
    Fehler 16 error C2143: Syntaxfehler: Es fehlt ';' vor 'Konstante' 15
    Fehler 15 error C2275: 'LPCSTR': Ungültige Verwendung dieses Typs als Ausdruck 15
    Fehler 18 error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'STARTUPINFO' 16
    Fehler 17 error C2275: 'LPSTARTUPINFO': Ungültige Verwendung dieses Typs als Ausdruck 16
    Fehler 19 error C2275: 'STARTUPINFO': Ungültige Verwendung dieses Typs als Ausdruck 16
    Fehler 22 error C2059: Syntaxfehler: ')' 17
    Fehler 21 error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'CloseHandle' 17
    Fehler 20 error C2275: 'STARTUPINFO': Ungültige Verwendung dieses Typs als Ausdruck 17
    Warnung 23 warning C4551: Dem Funktionsaufruf fehlt die Argumentliste 17



  • rofl
    Gestern lief dieser Code noch?
    Willst du uns verarschen?

    Geh und lern erstmal irgend eine Programmiersprache. Die grundlegensten Grundlagen. Und dann meld dich wieder.



  • Wieso sollte ich euch Verarschen wollen, ich hatte es 10 mal
    ausprobiert gehabt und jedes mal öffnete sich das Programm und als
    ich es heute Versucht hatte kamen direkt diese Fehler.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx
    

    Ich hab mich daran gehalten.
    Ich bin auch gerade dabei diese Sprache zu lernen.



  • Der Code kann nie gelaufen sein, weil es nicht mal ansatzweise korrektes C++ ist. D.h. er kann in dieser oder ähnlicher Form niemals kompiliert haben. Und wenn er schon nicht kompiliert, wie soll er dann laufen?

    Du kannst nicht einfach den Prototype einer Funktion aus der MSDN rauskopieren und in dein Programm rein an die Stelle wo du es aufrufen willst.
    Die Syntax für den Prototype (=Deklaration der Funktion) und den Aufruf ist schliesslich nicht gleich.

    Wenn du auf der Seite mal etwas weiter runter liest, dann findest du auch (in den Userkommentaren) Beispiele wie man die Funktion aufruft.
    Oder wenn du einfach mal nach CreateProcess googelst und ein paar Seiten anguckst wirst du auch genügend Beispiele finden.



  • 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