Kommandozeilenparameter nachträglich an QProcess übergeben?

Alles rund um die Programmierung mit Qt
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Kommandozeilenparameter nachträglich an QProcess übergeben?

Beitrag von mephistho »

Hi,

ich stör schon wieder ;) Und ne wirklich treffende Überschrift hab ich auch nich gefunden.

Folgendes:
Ich kann das Softphone Phoner aus der Kommandozeile starten und mit einem Parameter versehen. Leider immer nur mit EINEM Parameter.

<Pfad>\Phoner.exe \MINIMIZE

startet das gute Stück z.B. minimiert (oh wunder)

<Pfad>\Phoner.exe CONNECT 37

startet das gute Stück und lässt es direkt die Nummer 37 wählen.

<Pfad>\Phoner.exe \MINIMIZE CONNECT 37 funktioniert, wie gesagt, leider nicht.

Ich kann das allerdings nachträglich machen. Also erst minimiert starten und dann im selben Kommandofenster "Phoner.exe CONNECT 37" eingeben und die soeben aus diesem Fenster gestartete Phoner-Instanz wählt die Nummer 37. Danach ist dann auch Phoner.exe DISCONNECT usw. möglich

Kann ich das mit einem QProcess realisieren? Ich habe schon über system(...) nachgedacht, damit komm ich aber nicht weiter, weil ich zwei getrennte Phoner-Instanzen brauche, die ich dann auch getrennt steuern und unterschiedliche Nummern wählen lassen möchte. Ich habe also zwei QProcesses PhonerOne und PhonerTwo.

Code: Alles auswählen

PhonerOne->write(cmd)
Funktioniert leider nicht. cmd würde "CONNECT 37" o.ä. enthalten.

Ich danke wie immer für jeden Ansatz.

Grüße

meph
Zuletzt geändert von mephistho am 4. Juli 2007 15:11, insgesamt 1-mal geändert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Phoner scheint keine zwei Instanzen zu erlauben, sonst hättest Du auf der Kommandozeile schon eine 2. Instanz erhalten. Probier erstmal ob du überhaupt 2 Instanzen an den Start bringen kannst.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Ja, zwei Instanzen funktionieren definitiv.

Habe mir bisher eine kleine Qt-Oberfläche gebastelt, die direkt beim Start zwei Phoner-Instanzen minimiert startet.

Nächster Schritt wäre halt die CONNECT und DISCONNECT Parameter an die jeweiligen Prozesse zu übergeben.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Dann versuch es mal mit QProcess::write(QString).
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Re: Kommandozeilenparameter nachträglich an QProcess übergeb

Beitrag von mephistho »

Äh, danke aber:
mephistho hat geschrieben:

Code: Alles auswählen

PhonerOne->write(cmd)
Funktioniert leider nicht. cmd würde "CONNECT 37" o.ä. enthalten.

Ich danke wie immer für jeden Ansatz.

Grüße

meph
Und QProcess::write() schluckt auch leider keinen QString
write ( const char *, qint64 ) : qint64
write ( const QByteArray & ) : qint64
Gruß,
meph
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Also ein bißchen Doku lesen erwarte ich schon.

Code: Alles auswählen

PhonerOne->write(cmd.toAscii())
Ich weiß aber nicht ob es damit klappt, ist nru ein Versuch.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Mein cmd is schon ein QByteArray. Das passt schon. Da steht auch das richtige drin: CONNECT 37


Trotzdem danke!
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

also so wie ich das sehe, schreibst du Phone.exe es solle CONNECT 37 ausführen. ich glaube desweiteren, dass Phone seine Paramtere am anfang initialisiert. d.h du kannst nachdem phone gestartet wurde nicht mehr sagen dass es connecten soll.
Versuche doch mal ein terminal oder eine cmd mit dem QProcess zu öffnen und dann deine Parameter zu schreiben.
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Das hab ich schon getestet:
Wenn ich von Hand ein cmd starte, kann ich dort erst "Phoner.exe \MINIMIZE" eingeben, woraufhin Phoner minimiert gestartet wird.

Wenn ich dann im selben cmd-Fenster "Phoner.exe CONNECT 37" eingebe, wählt die zuvor gestartete Phoner-Instanz 37.

Ich versuche jetzt gerade, zunächst ein cmd starten zu lassen und dort dann nach und nach die entsprechenden Befehle einzugeben.

Also:

cmd starten -> Phoner.exe \MINIMIZE eingeben -> Phoner.exe CONNECT <Nr> eingeben -> usw.

Aber leider will das nicht so richtig.

Wenn ich das cmd-Fenster einfach mit "Process->start("cmd")" starte, bekomme ich es ja nicht mal zu Gesicht. Also mit startDetached() starten...
Dann sehe ich es, aber wenn ich mit Process->wirte("befehle") hineinschreiben will, kommt nix an. Ich setze den OpenMode vorher mit Process->open(QIODevice::WriteOnly); auf schreibbar. ReadWrite hab ich auch schon getestet, macht keinen Unterschied.

Müsste es nicht so sein, dass mein write()-Text z.B. zu Testzwecken in einem gestarteten Notepad-Fenster erscheint? Oder wohin schreibt dieses write() sonst?

Danke für eure Mühen!

Gruß
meph
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Ich komm nich mehr mit. Ich fühl mich verarscht. Aber das kann mir bestimmt jemand erklären und ne Lösung nennen:

Ich starte mir schon im Konstruktor mein cmd-Fenster als PhonerOne-Prozess:

Code: Alles auswählen

	PhonerOne = new QProcess(this);
	
	QString path = "cmd";
	QStringList arguments;
	
	PhonerOne->start(path, arguments);
	if(PhonerOne->waitForStarted()) QMessageBox::information(0, "Info", "PhonerOne erfolgreich gestartet!");
	else QMessageBox::critical(0, "Error", "PhonerOne konnte nicht gestartet werden!");
Dann hab ich mir einen Slot gebastelt der die entsprechenden Befehle zum Starten von Phoner.exe in die Konsole schreiben soll.

Code: Alles auswählen

void PhoneGUI::startPhonerOne()
{
	QTextStream cmd_output(PhonerOne);
	
	QString cmd = "D:/Programme/Phoner1/Phoner.exe /MINIMIZE\n";
	
	if(PhonerOne->isWritable()) 
	{	
		QMessageBox::information(0, "Info", "PhonerOne is writable!");
		
		cmd_output << cmd.toLatin1().constData() << endl;
	}
	else QMessageBox::critical(0, "Error", "PhonerOne not writable!");
}
Leider werden die Befehle erst ausgeführt, wenn ich mein ganzes Programm beende. Dann startet sich mein Phoner wie gewünscht minimiert.

Ich bin verwirrt. Sehe aber vielleicht vom ganzen Rumprobieren den Wald vor lauter Bäumen nicht.

Hilfe :cry:
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

Versuchs mal mit "\r\n" nach einem Phoner befehl, ansonsten attach mal dein ganzes Programm, dann seh ich mir die sache mal an.
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Danke!

Qt 4.3.0. Kompiliert mit qmake...
Dateianhänge
PhoneGUI.rar
(1.88 KiB) 189-mal heruntergeladen
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

eine frage:
was passiert wenn ich keine isnd-Leitung besitze und CONNECT 37 aufrufe?
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

So, hab mir die Sache mal angeguckt...
Folgendes habe ich festgestellt:
-> CMD wird von Qt blockiert. d.h wird die cmd von einem QProcess
aufgerufen, führt sie kein anderes Programm aus
-> Ich habe es geschafft, den PhonerOne auch wärend des Betriebs des
GUIs zu starten, kurz darauf ist Phoner eingefroren, nachdem ich den
Gui beendete taute Phoner wieder auf.

Du hast jetzt 3 Optionen:
Option A: Du versuchst die CMD in einem Thread aufzurufen.
Option B: Du bittest den Programmierer con Phoner um den Quellcode und
implementierst dann seinen Code
Option C: Du gibst es auf.

Also ich hab alles versucht, aber die cmd stellt sich bockig an, versuch das mit dem Thread erstmal und sag mal bescheid.

Carpe Diem!
Markus
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Alles klar, ich werds testen.

Vielen Dank bis hier her für deinen Aufwand & ein schönes WE.
Antworten