Seite 1 von 2
Kommandozeilenparameter nachträglich an QProcess übergeben?
Verfasst: 4. Juli 2007 13:55
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.
Funktioniert leider nicht. cmd würde "CONNECT 37" o.ä. enthalten.
Ich danke wie immer für jeden Ansatz.
Grüße
meph
Verfasst: 4. Juli 2007 14:02
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.
Verfasst: 4. Juli 2007 14:05
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.
Verfasst: 4. Juli 2007 14:55
von macman
Dann versuch es mal mit QProcess::write(QString).
Re: Kommandozeilenparameter nachträglich an QProcess übergeb
Verfasst: 4. Juli 2007 15:13
von mephistho
Äh, danke aber:
mephistho hat geschrieben:
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
Verfasst: 4. Juli 2007 15:57
von macman
Also ein bißchen Doku lesen erwarte ich schon.
Ich weiß aber nicht ob es damit klappt, ist nru ein Versuch.
Verfasst: 4. Juli 2007 18:50
von mephistho
Mein cmd is schon ein QByteArray. Das passt schon. Da steht auch das richtige drin: CONNECT 37
Trotzdem danke!
Verfasst: 4. Juli 2007 21:45
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.
Verfasst: 5. Juli 2007 10:37
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
Verfasst: 6. Juli 2007 10:56
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

Verfasst: 6. Juli 2007 12:25
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.
Verfasst: 6. Juli 2007 12:59
von mephistho
Danke!
Qt 4.3.0. Kompiliert mit qmake...
Verfasst: 6. Juli 2007 13:39
von CaptnChaos
eine frage:
was passiert wenn ich keine isnd-Leitung besitze und CONNECT 37 aufrufe?
Verfasst: 6. Juli 2007 14:35
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
Verfasst: 6. Juli 2007 16:23
von mephistho
Alles klar, ich werds testen.
Vielen Dank bis hier her für deinen Aufwand & ein schönes WE.