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



  • Damit kannst du Programme fernsteuern, mit C++ willst du sowas nicht machen...



  • hmm ich muss mich dann erstmal mit meinem Betreuer zusammen setzten, weil die Aufgabe bestand daraus, dass ich ein C-Code habe mit dem ich Daten an einem LabVIEW vi übermitle, er die dann ausführt und irgendwo abspeichert.
    Diese Daten soll dann C wieder lesen.
    C ist dann sozusagen meine Regelung



  • Ok, d.h. du willst nur ein Programm starten!? Das geht unter Windows mit CreateProcess()...



  • das starten habe ich mit ShellExecute() gemacht.
    Ist dies auch richtig?

    Ich muss sozusagen Parameter übergeben



  • CreateProcess() startet einen neuen Prozess und funktioniert nur mit Programm-Dateien (EXE Files).

    ShellExecute() hingegen öffnet (zumindest mit lpOperation == "open" ) eine beliebige Datei mit der zugehörigen Standard-Anwendung, sofern für den jeweiligen Datei-Typ eine passende Anwendung registriert ist. Mit ShellExecute wird auch nicht zwangsläufig ein neuer Prozess gestartet, z.B. wenn die jeweilige Ziel-Anwendung bereits läuft und DDE beherrscht. Dann wird nämlich die Datei einfach an die laufende Anwendung übergeben.

    Du kannst auch mit ShellExecute() eine Programm-Datei öffnen bzw. starten. CreateProcess() ist hier aber die bessere Wahl, denn es bietet mehr Optionen und liefert einen HANDLE auf den neuen Prozess (und auch einen auf dessen Haupt-Thread) zurück.

    BTW: Ob und wie sich ein Programm "fern steuern" lässt hängt völlig von dem jeweiligen Programm ab. Tastatur-Eingaben könntest Du via SendMessage() simulieren. Die passenden Nachrichten-Typen sind WM_KEYDOWN bzw. WM_KEYUP.



  • Vielen Dank für die hilfreichen Tipps.
    Ich werde micht jetzt mit den Befehlen näher beschäftigen, bei fragen Melde ich mich 😃


  • Mod

    Wenn dieses Programm eine Automatisation/COM Schnittstelle hat wurde ich daran arbeuten diesezu nutzen. Dazu braucht man dann aber nichtmal C++.
    Das geht dann auch mit VBScript.



  • Ich schreibe lieber mal meine konkrete Aufgabe hierhin. Habe mich glaube ich ein bisschen falsch ausgedrückt.

    Zuverfügung stehen mir eine Festo Compact Workstation und LabVIEW. Die Anlage ist mit einem Easyport USB am Rechner angeschlossen.

    Über LabVIEW kann ich diese Anlage steuern, mit steuern meine ich Sensor auslesen Pumpe ein oder ausschalten.
    Der erste schritt war es eine DLL zu schreiben, die in LabVIEW eingefügt wird, damit es über ein C-Code laufen soll (den Code habe ich nur auf ein und ausgabe beschränkt gehabt). ERLEDIGT
    Nun Soll ich ein Quellcode entwickeln, wo LabVIEW sozusagen im Hintergrund laufen soll und ich über mein C-Code zB. die Pumpe ein und ausschalten kann. Die Eingaben sollen über die Kommandozeile laufen.


  • Mod

    Wenn ich nach Labview und Command line suche bekomme ich tausende von Hits...

    Wozu brauchst Du dazu en C/C++ Programm. Das kann doch jeder Batch?



  • Da hast du Recht, aber meine Aufgabe ist es mit C/C++ zu machen.


  • Mod

    Dann ist Deine Frage mit ShellExecute bzw. CreateProcess beantwortet.



  • Ja, Vielen Dank!



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


Anmelden zum Antworten