Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Handle von Konsolen-App? (https://www.delphipraxis.net/211320-handle-von-konsolen-app.html)

himitsu 2. Sep 2022 15:17

AW: Handle von Konsolen-App?
 
Das STARTUPINFO gibt der Anwendung ein optionales Handle. (ist das leer, dann werden die Standrad-Handles des Systems verwendet)

Du schreibst in
Delphi-Quellcode:
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)

charly52 3. Sep 2022 18:24

AW: Handle von Konsolen-App?
 
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

himitsu 3. Sep 2022 19:27

AW: Handle von Konsolen-App?
 
Wie schickst du diese Chars?

das Encoding ist schon wichtig.

Delphi.Narium 3. Sep 2022 20:08

AW: Handle von Konsolen-App?
 
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.

himitsu 3. Sep 2022 23:15

AW: Handle von Konsolen-App?
 
ReadLn ist es egal, es kommt allen Kombinationen zurecht, also CR, CR+LF oder LF (so wie die TStringList)

charly52 5. Sep 2022 09:09

AW: Handle von Konsolen-App?
 
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);
Zitat:

Zitat von himitsu (Beitrag 1511211)
ReadLn ist es egal, es kommt allen Kombinationen zurecht, also CR, CR+LF oder LF (so wie die TStringList)

Nur CR geht NICHT




Zitat:

Zitat von Delphi.Narium (Beitrag 1511208)
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

himitsu 5. Sep 2022 10:09

AW: Handle von Konsolen-App?
 
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. :stupid:

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;

charly52 6. Sep 2022 14:00

AW: Handle von Konsolen-App?
 
Liste der Anhänge anzeigen (Anzahl: 1)
ok, da ist ja wieder viel Stoff zu verdauen.

Möchte aber vorher ein weiteres evtl. neues? Problem zur Diskusion stellen.

Ich habe ja eine Version, die meine ConsolenApp creiert und was hin schickt.
Jetzt ist aber der Effekt so, daß wenn ich mein CreateProcess() in einem Formular habe, dann müssen die Parameter alle Wide-String-Variante sein, sonst mault der Compiler.

Wenn ich das ganze Create/WriteFile in eine Unit auslagere, dann muss es Ansi-String sein.

Ich habe die Projekte "CreateProcess" und "WebKernel" in eine Gruppe CreateProcessGroup gepackt und alles zusammengezipt.

Ich häng dieses zip mit an.

Vieleicht kann mir das ja jemand erklären. Danke

Charly

charly52 6. Sep 2022 14:11

AW: Handle von Konsolen-App?
 
Zitat:

Zitat von himitsu (Beitrag 1511241)
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;

procedure _ReadUString(var t: TTextRec; var s: UnicodeString);

Hi himitsu, auch auf die Gefahr das ich als begriffstutzig gelte,

was mach ich mit _ReadUString?
Wie kann ich das in meiner Konsole nutzen?

Vieleicht kannst du ja mal mein Projekt anschauen. :-)

Sorry für die viele Fragerei und Danke

Charly

charly52 6. Sep 2022 14:13

AW: Handle von Konsolen-App?
 
Hi


Zitat:

Zitat von himitsu (Beitrag 1511241)
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]


Wie bzw. wo kann man das umschalten? In meinem Programm

oder in den Eigenschaften der Konsole/CMD oder wer auch immer mit meiner KonsolenApp hochkommt?

Charly :-(


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 Uhr.
Seite 2 von 3     12 3      

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