AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Handle von Konsolen-App?

Ein Thema von charly52 · begonnen am 29. Aug 2022 · letzter Beitrag vom 8. Sep 2022
Antwort Antwort
charly52

Registriert seit: 2. Sep 2018
Ort: Salem, Baden
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Handle von Konsolen-App?

  Alt 2. Sep 2022, 15:04
Aus den ersten Suchergebnissen...
https://www.delphipraxis.net/117567-...ung-nicht.html
Zeigt zumindestens schonmal ansatzweise, wie das aussieht
* Pipes erstellen
* * mindestens hStdInput, wo du deine Befehle rein schreiben kannst
* * und eventuell auch noch hStdOutput, wo die Antwort zurück kommt
* dann damit den Prozess starten
* auf dessen Ende warten
* und währenddessen die Ein-/Ausgaben behandeln, also in StdIn reinschreiben und aus StdOut lesen (ja, andersrum, da aus Sicht des gestarteten Programms)
hi himitsu,

danke, das hat schon richtig geholfen.
Kann jetzt meine KonsolenApp starten.
Habe dann im Code von little_budda an der Stelle

//jetzt mit ReadFile/WriteFile kommunizieren

folgendes eingeführt:

Delphi-Quellcode:
  
var
    chBuf : Array[1..2] of Char;
    written : longWord;

begin
  .........
//jetzt mit ReadFile/WriteFile kommunizieren
    while true do
      begin
        chbuf[1]:= '3';
        chbuf[2]:= #13;

        bSuccess:= WriteFile(WriteInput{g_hChildStd_IN_Wr}, chBuf, 2{dwRead}, Written{&dwWritten}, nil);

        if (NOT bSuccess) then
        begin
          err:= GetLastError;
          break;
        end;
      end;
Und jetzt was zum Verständnis.
Wenn ich in der STARTUPINFO Struktur einen "Input-Handle" für die KonsolenApp erzeuge
  CreatePipe(StartStruct.hStdInput, WriteInput, @SecAttr, 0); //die Handles erzeugen sollte ich mit WriteFile doch direkt da reinschreiben könen? Oder nicht?

Oder muss ich in der KonsolenApp auch noch explizit aus dem neuen Handle lesen?
Ich dachte eigentlich, das beim Starten der KonsolenApp deren StdInput schon umgebogen wird?????

Ihr seht, mir fehlt da ganz Grundsätzliches

Danke für weitere Hilfe


Charly
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#2

AW: Handle von Konsolen-App?

  Alt 2. Sep 2022, 15:17
Das STARTUPINFO gibt der Anwendung ein optionales Handle. (ist das leer, dann werden die Standrad-Handles des Systems verwendet)

Du schreibst in WriteFile(PipeWrite, ... und in der anderen Anwendung kommt es dann bei GetStdHandle(STD_INPUT_HANDLE) an, bzw. bei den Delphi-APIs, welche das nutzen, wie z.B. ReadLn (ohne den File-Parameter).

Andersum genauso, wenn die andere Anwendung auf STD_OUTPUT_HANDLE schreibt, bzw. mit WriteLn,
dann kommt es bei dir im PipeRead (STARTUPINFO.hStdOutput)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
charly52

Registriert seit: 2. Sep 2018
Ort: Salem, Baden
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Handle von Konsolen-App?

  Alt 3. Sep 2022, 18:24
Das heist also, daß ich in meiner Konsolenapp _nichts_ tun muß?
Das readln liest ja bereits aus StandardIn.

Bei mir kommt in der KonsolenApp nämlich nichts an wenn ich z.B 2 Chars ('3' und #13) schicke.
ABer in der Variablen "written" steht ne 2 und bSucess ist auch True.
Und eigentlich sollte doch dann meine App die '3' mit nem CR dahinter genau wie ein Kommando wie von der Tastatur
hier ne 3 und Enter behandeln?
Das tut sie nicht!!!!

Charly
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#4

AW: Handle von Konsolen-App?

  Alt 3. Sep 2022, 19:27
Wie schickst du diese Chars?

das Encoding ist schon wichtig.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.555 Beiträge
 
Delphi 7 Professional
 
#5

AW: Handle von Konsolen-App?

  Alt 3. Sep 2022, 20:08
ReadLn ließt bis zum nächsten Zeilenumbruch und der ist unter Windows #13#10. Es gibt dazu auch die Konstante sLineBreak, mit der ist man dann plattformunabhängig, da sie automatisch den für die Zielplattform richtigen Wert enthält.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#6

AW: Handle von Konsolen-App?

  Alt 3. Sep 2022, 23:15
ReadLn ist es egal, es kommt allen Kombinationen zurecht, also CR, CR+LF oder LF (so wie die TStringList)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
charly52

Registriert seit: 2. Sep 2018
Ort: Salem, Baden
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Handle von Konsolen-App?

  Alt 5. Sep 2022, 09:09
Hallo himitsu, Delphi.Narium

erstmal VIELEN Dank für eure Hilfe, ich habe da wirklich nur im Nebel gestochert.
Jetzt gehts. Aber ihr habt beide nur teilweise recht.
Meine Konsole/werauch ímmer kann wohl nur AnsiChar

und somit sende ich:
Delphi-Quellcode:
// chBuf : Array[1..3] of AnsiChar = ('3',#13,#10); //geht
// chBuf : Array[1..3] of AnsiChar = ('3',#10); //geht
    chBuf : Array[1..2] of byte = (51,10); //geht

begin

    bSuccess:= WriteFile(WriteInput{g_hChildStd_IN_Wr}, chBuf, 2 | 3 (je nach definition oben), Written, nil);
ReadLn ist es egal, es kommt allen Kombinationen zurecht, also CR, CR+LF oder LF (so wie die TStringList)
Nur CR geht NICHT




ReadLn ließt bis zum nächsten Zeilenumbruch und der ist unter Windows #13#10. Es gibt dazu auch die Konstante sLineBreak, mit der ist man dann plattformunabhängig, da sie automatisch den für die Zielplattform richtigen Wert enthält.
Es geht auch NUR #10
Aber sLineBreak geht wiederum nicht, da es WideString ist.


Danke Charly
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#8

AW: Handle von Konsolen-App?

  Alt 5. Sep 2022, 10:09
Ja, Delphi-Consolen können nur ANSI, bzw. OEM. (was sich jeweils umschalten ließe)
Aber wenn man nicht die uralten Delphi-Funktionen verwendet, dann wäre auch alles Andere Möglich.

Delphi-Quellcode:
function _WriteWString(var t: TTextRec; const s: WideString; width: Longint): Pointer;
var
  i: Integer;
begin
  i := Length(s);
  _WriteSpaces(t, width - i);
  Result := _WriteLString(t, AnsiString(s), 0);
end;

procedure _ReadUString(var t: TTextRec; var s: UnicodeString);
var
  Temp: AnsiString;
begin
  // !!! FIXME
  _ReadLString(t, Temp, DefaultSystemCodePage);
  s := UnicodeString(Temp);
end;


Das sLineBreak hat per se in seiner Deklaration keinen Typen.
Es müsste sich demnach jeweils an den Zieltyp anpassen (der Compiler dürfte es bereits gecastet übergeben). Und selbst wenn nicht, dann würde es bei Verwendung einfach implizit gecastet.

Zitat:
Nur CR geht NICHT
Laut Code sollte es aber gehn.

Delphi-Quellcode:
procedure _ReadLn(var t: TTextRec);
{$IF not defined(CPU386)}
var
  c: Word;
begin
  while True do
  begin
    c := _ReadCharEx(t);
    if (c and $00ff) = cLF then break; // accept LF as end of line
    if (c and $ff00) shr 8 = cEOF then break;
>>> if (c and $00ff) = cCR then
    begin
      c := _ReadCharEx(t);
>>>>> if (c and $00ff) = cLF then break; // accept CR+LF as end of line
      if (c and $ff00) shr 8 = cEOF then break; // accept CR+EOF as end of line
      Dec(t.BufPos);
      // else CR+ anything else is not a line break.
    end;
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz