Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ausgaben an StdOut aus DLL lesen (https://www.delphipraxis.net/144816-ausgaben-stdout-aus-dll-lesen.html)

Tyrael Y. 17. Dez 2009 09:57


Ausgaben an StdOut aus DLL lesen
 
Hallo zusammen,
ich konnte den Titel irgendwie nicht besser formulieren.

Ich habe eine C DLL in der einige Funktionen sind.
Diese Funktionen werden in einer GUI Anwendung von mir aufgerufen.
Ich weiss, daß sich innerhalb der Funktionen Ausgaben an stdout mittels writeln befinden.

Wie kann ich diese Ausgaben in meinem GUI-Programm lesen?

Ich denke, ich müsste beim Start meiner GUI Anwendung einen nicht sichtbaren Konsolenprozess starten.
Zu diesem Prozess wahrscheinlich eine Pipe aufbauen und aus dieser Pipe dann die Ausgaben lesen.
Passt die Überlegung einigermassen oder müsste ich anders vorgehen?

Wie müsste ich konkret das Ganze machen?

Tyrael Y. 17. Dez 2009 13:56

Re: Ausgaben an StdOut aus DLL lesen
 
Ich habe eine kleine Testapplikation erstellt.
Wenn ich in den Projektoptionen bei Linker/Konsolenanwendung markiere krieg ich mit folgendem Weg die Ausgaben aus der Console in mein Memo. Es erscheint halt aber ein sichtbares Konsolenfenster.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  stdout := GetStdHandle(STD_OUTPUT_HANDLE);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    coord: _COORD;
    readed: Cardinal;
    text: string;
begin
  ExecuteFunctionFromDLL();
 
  coord.x := 0;
  coord.y := 0;
  SetLength(text, 2048);
  ReadConsoleOutputCharacter(stdout, PChar(text), 2048, coord, readed);
  memo1.Lines.Text := Text;
end;
Lass ich das mit der Konsolenanwendung in den Optionen weg und schreibe statt dessen...
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  AllocConsole;
  stdout := GetStdHandle(STD_OUTPUT_HANDLE);
end;
...erscheint wieder ein Konsolenfenster, aber beim Test krieg ich weder in der Konsole, noch im Memo einen Text.

Ändere ich den BuutonKlick aber in
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
    coord: _COORD;
    readed: Cardinal;
    text: string;
begin
  writeln('foo');
 
  coord.x := 0;
  coord.y := 0;
  SetLength(text, 2048);
  ReadConsoleOutputCharacter(stdout, PChar(text), 2048, coord, readed);
  memo1.Lines.Text := Text;
end;
...seh ich das foo im Konsolenfenster und auch in der Memo.

Scheint ein Rechteproblem im Zusammenhang mit DLL´s zu sein.
Nur wie löse ich es über den Weg mit AllocConsole?

...to be continued

wicht 17. Dez 2009 13:59

Re: Ausgaben an StdOut aus DLL lesen
 
Das schreiben ins StdOut muss ja über irgendeine Funktion geschehen.
Diese Funktion könnte man eventuell auf eine eigene umbiegen, um so an die Daten zu kommen. Leider weiß ich so auch nicht, wie die Funktion heißen könnte, die dafür in Frage kommt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz