Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - stdout unter VCL Anwendung


Knulli - Mi 09.01.13 22:04
Titel: stdout unter VCL Anwendung
Ich will unter Windows mit einer anderen Anwendung kommunizieren.

Bisher haben wir das über Named Pipes getan, doch nun fragt der andere, ob ich nicht auch auf stdout meinen Salm ausgeben kann.

Jemand ne Idee, wie ich in einer fensterbasierten Anwendung auf stdout was ausgeben kann?

WriteFile mit Handle 0 geht nicht. (Ungültiges Handle, 0 hatte mir GetStdHandle(STD_OUTPUT_HANDLE) zurückgegeben)

Knulli


jaenicke - Mi 09.01.13 23:05

Du musst erst eine Konsole mit [url]AllocConsole[/url] erzeugen. ;-)
Dann kannst du einfach Writeln benutzen.

Named Pipes benutze ich für die gezielte Kommunikation aber lieber.


Knulli - Mi 20.02.13 18:23

Wir wollten ja Daten austauschen. Mit AllocConsole erzeuge ich doch aber eine neue Konsole in der niemend zuhört. Oder?

Also habe ich AttachConsole genommen. Soweit ich das verstehe, greife ich mir damit die Console des aufrufenden Prozesses.

Damit war es mir nun möglich, wenn meine Anwendung von cmd.exe heraus aufgerufen wird, Texte dorthin auszugeben.

Soweit so gut. Nun fragt mich der andere aber, warum er meinen Salm nicht in eine Textdatei umleiten kann.

Schlimm diese Unix Freaks!!!

Mache ich was falsch oder ist seine Herangehensweise falsch?

Knulli

Hier mal etwas Text von meiner Seite, er wollte "TraffiCage.exe > output.txt" machen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
  ConsolePresent := AttachConsole(ATTACH_PARENT_PROCESS) AND (GetStdHandle(STD_OUTPUT_HANDLE) <> INVALID_HANDLE_VALUE);
  OutputToConsole(-1, -1, Now(), 'Startup Test', true);
...

procedure TFTraffiCage.OutputToConsole(aBoxNum, aAntenna: Integer; aDateTime: TDateTime; aAnimalTag: String; aAnimalIn: Boolean);
var
  st: String;
  iLevels: Integer;
  JSONObject: TlkJSONobject;
begin
  if not ConsolePresent then exit;

  JSONObject    := TlkJSONobject.Create;
...
  iLevels := 0;
  st := GenerateReadableText(JSONobject, iLevels);
  Writeln(StringReplace(st, cCrLf, '', [rfReplaceAll]));
  FreeAndNil(JSONobject);
end;