Entwickler-Ecke

Windows API - Merkwürdigkeit mit einer Pipe zu einem anderen Programm


GuaAck - Fr 19.08.22 23:28
Titel: Merkwürdigkeit mit einer Pipe zu einem anderen Programm
Hallo,
ich arbeite gern mit Arduinos, da gibt es nützliche Hilfsprogramme zur Analyse, die aber nur Konsolenanwendungen sind, also über "Ausführen" gestartet werden müssen. Da mir das zu umständlich ist, habe ich in Delphi ein Programm gemacht, was mir die von mir genutzten Hilfsprogramme mit den von mir genutzten Options anzeigt. Auf ein Click auf einen Start-Button wird das Hilfsprogramm gestartet. Zur Kommunikation mit dem Hilfsprogramm habe mit CreatePipe eine Pipe eingerichtet. Das Ergebnis des Hilfsprogramms erhalte ich über die Pipe zurück und zeige es in einem TMemo an. Es geht wunderbar.

Mein Problem: Alle diese Hilfsprogramme kennen eine Option "-h" was als Hilfe die Bedeutung aller Options listet. Merkwürdig: Das geht nur bei einigen der Hilfsprogrammen. Über "Ausführen" geht es bei allen Hilfsprogrammen.

Ein Beispiel (Leerzeichen sind wichtig):
"avr-size -x -t D:\...\meinProgramm.elf" geht
"avr-size -h" geht nicht über Delphi, aber über "Ausführen.

Sinngemäß für ein anderes Hilfsprogramm ("avr-nm.exe") geht es auch über Delphi.

Ich habe schon an verschiedenen Stelle Sleeps eingebaut, um Zeitprobleme auszuschließen, ohne Erfolg.

Kann es sein, dass ein Konsolenprogramm Ausgaben macht, die nicht auch in die Pipe geschrieben werden? Oder hat jemand sonst eine Idee?

Grüße
GuaAck


Th69 - Sa 20.08.22 09:26

Was ich mir vorstellen könnte, wäre, daß anstatt auf STDOUT auf STDERR der Hilfetext ausgegeben wird (dies wäre aber eigentlich sehr merkwürdig).
Ob das so stimmt und wie man an dessen Daten per Pipe kommt, weiß ich jedoch nicht.


jaenicke - Sa 20.08.22 12:20

Dafür kann man eine zweite passende Pipe aufmachen. Aus Versehen landet aber nichts in der falschen Pipe.

Ohne ein nachvollziehbares Beispiel lässt sich dazu aber wenig sagen. Wie wäre es, wenn du beide Programme auf ein Minimum reduzierst (je nachdem wie viel davon du hier veröffentlichen würdest) und die Projekte hier anhängst? So dass eben mindestens noch das Starten des anderen Projekts und dessen Ausgabe drin sind?


Ralf Jansen - Sa 20.08.22 16:11

Th69 könnte da das richtige Näschen gehabt haben.

Source: size -h [https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=binutils/size.c;h=47f14fce333750c1f9a80efa51efe33e31a21bc4;hb=4a4495d62d185bdae17ed6aae6ea8249ad07c799#l225]

unter der Annahme ich habe mich zum richtigen Source durchgekämpft ;)
Ausgaben gehen auf stderr


C++-Quelltext
1:
2:
3:
4:
case 'h':
case 'H':
case '?':
  usage (stderr, 1);


Moderiert von user profile iconTh69: URL-Titel hinzugefügt


Th69 - Sa 20.08.22 17:39

Und nm -h [https://sourceware.org/git?p=binutils-gdb.git;a=blob;f=binutils/nm.c;h=e46fffc796f772141e9ad8ea4515be2dc36d49cd;hb=4a4495d62d185bdae17ed6aae6ea8249ad07c799#l1703] gibt auf stdout aus...

C
1:
2:
3:
case 'H':
case 'h':
  usage (stdout, 0);

Und auch der Prozess-Rückgabewert (2. Parameter) ist unterschiedlich.


GuaAck - Sa 20.08.22 19:49

Danke, Ihr seit genial!!! Ich werde das mal versuchen zu lösen, evtl. kann man ja stderr auf stdout umleiten.

Gruß
GuaAck


GuaAck - Sa 20.08.22 22:25

Hallo, voller Erfolg!

Man muss nur bei "CreateProcess" in "StartupInfo" den "Pipe.Input" auch dem "StdError" zuweisen.
Danke nochmals,
Gruß GuaAck