AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi [gelöst] UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE
Thema durchsuchen
Ansicht
Themen-Optionen

[gelöst] UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE

Ein Thema von himitsu · begonnen am 4. Nov 2023 · letzter Beitrag vom 13. Nov 2023
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

[gelöst] UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE

  Alt 4. Nov 2023, 15:19
Mahlzeit,

ich versuche mich grade an den neuen Pseudo-Consolen (ConPTY), also nicht die uralte ConsolenAPI (WinPTY) ala WriteConsoleOutput (wozu es im Gegensatz leider Unmassen an Beispielen gäbe),
aber irgendwie will da was nicht so, wie ich will.
https://learn.microsoft.com/de-de/wi...pseudoconsoles

Ja, zuerst einmal ein Bug in der API-Deklaration des Delphi 11.3.
* der erste Parameter müsste eigentlich VAR sein, oder zumindestens ein Pointer.
* * VAR wie beim InitializeProcThreadAttributeList
* * Pointer ala https://www.delphipraxis.net/205348-...ainer-wie.html
* hab diesen Fehler noch nicht gemeldet ... wollte noch warten, bis es funktioniert

Dann ein noch Fehler in der Demo bei Microsoft.
* hpc müsste &hpc sein

Jo, in der eigentlichen Hilfe wird auch noch das PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE nirgendwo erwähnt.
https://learn.microsoft.com/en-us/wi...hreadattribute

Jaaaa, das geNILe beim ersten InitializeProcThreadAttributeList ist schon OK.
Nur bissl ungünstig, dass Emba es als VAR deklariert hat.



Hab schon gefühlt alle Möglichkeiten beim ersten Parameter versucht
und auch hpc in verschiedenen Varianten,
sowie statt meinem eigentlichen GetMemory das HeapAlloc der C++-Demo.


Demo: https://learn.microsoft.com/en-us/wi...onsole-session
Delphi-Quellcode:
const
  PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = $00020016;

var
  FInput, FInputWrite: THandle;
  FOutput, FOutputRead: THandle;
  FConsoleApp: string;
  FConsoleSize: COORD;
  FConsoleFlags: DWORD;
  FConsole: HPCON;
  FConsoleProcess: THandle;
  FConsoleThreadID: DWORD;

var
  SI: STARTUPINFOEX;
  RS: SIZE_T;
  PI: PROCESS_INFORMATION;
begin
  Result := S_OK;
  SI.lpAttributeList := nil;
  try
    if not CreatePipe(FInput, FInputWrite, nil, 0) or not CreatePipe(FOutputRead, FOutput, nil, 0) then
      Exit(HResultFromWin32(GetLastError));

    FConsoleSize := COORD(TSmallPoint.Create(80, 40));
    FConsoleFlags := 0; // PSEUDOCONSOLE_INHERIT_CURSOR=$1 : Inherit cursor position from my parent process-console.

    Result := CreatePseudoConsole(FConsoleSize, FInput, FOutput, FConsoleFlags, FConsole);
    if FConsole = INVALID_HANDLE_VALUE then
      FConsole := 0;
    if Failed(Result) then
      Exit;

    ZeroMemory(@SI, SizeOf(SI));
    SI.StartupInfo.cb := SizeOf(STARTUPINFOEX);
    InitializeProcThreadAttributeList(PProcThreadAttributeList(nil)^, 1, 0, RS);
    SI.lpAttributeList := HeapAlloc(GetProcessHeap, RS, 0); //GetMemory(RS);
    if not Assigned(SI.lpAttributeList) then
      Exit(E_OUTOFMEMORY);
    //SI.StartupInfo.dwXSize := FConsoleSize.X; // see UpdateProcThreadAttribute+FConsole
    //SI.StartupInfo.dwYSize := FConsoleSize.Y; // ...
    //SI.StartupInfo.dwFlags := STARTF_USESIZE;
    //SI.StartupInfo.hStdInput := FInput;
    //SI.StartupInfo.hStdOutput := FOutput;
    //SI.StartupInfo.hStdError := FOutput;
    if not InitializeProcThreadAttributeList(SI.lpAttributeList^, 1, 0, RS) then
      Exit(HResultFromWin32(GetLastError));
    if not UpdateProcThreadAttribute(SI.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE, {Pointer(FConsole)}@FConsole, SizeOf(FConsole), nil, RS) then
      RaiseLastOSError;//Exit(HResultFromWin32(GetLastError));

    ....
aber es bleibt bei Zugriffsverletzungen oder
Zitat von ERROR_INVALID_PARAMETER:
Falscher Parameter


[add]
Versuche mir grade hier den Wert der Konstante auszurechnen ... mal sehn ob der übereinstimmt.
https://github.com/wine-mirror/wine/...lude/winbase.h -> PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE
[add2]
passt
$2B or not $2B

Geändert von himitsu ( 4. Nov 2023 um 16:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE

  Alt 4. Nov 2023, 16:05
Och neeeeeee, echt jetzt?

Emba hat den letzten Parameter "pReturnSize" als VAR definiert und da ich eh bereits eine Variable dafür rum liegen hatte ............

In der Demo wurde dort zwar NULL übergeben und ich dachte nicht, dass es was aus macht, ABER

@FConsole, SizeOf(FConsole), nil, PNativeUInt(nil)^) then




So, dann mal weiter ... hoffe der nachfolgende Rest geht auch.

[add]
erschreckender Weise ist es wirklich Pointer(FConsole) und nicht @FConsole ... die Demo stimmt also (auch wenn es falsch aussieht )
$2B or not $2B

Geändert von himitsu ( 4. Nov 2023 um 16:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: [gelöst] UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE

  Alt 10. Nov 2023, 09:53
'ne winzige Falle gab es noch
https://www.delphipraxis.net/214050-ttimer-dll.html

Soo, die PseudoConsole schickt heimlich mit, in welchem Arbeitsverzeichnis es läuft und welcher Prozess grade ausgeführt wird (also auch ob der vorherige beendet wurde).
←[4;1H = Arbeitsverzeichnis
←]0; = aktueller Prozess

(heimlich, weil im neuen Windows-Terminal sieht man das ja nicht)

cmd.exe unsichtbar in der Console starten (es ginge auch direkt eine ConsolenAnwendung, aber ich möchte eine fortlaufende Session haben)
und dann
Delphi-Quellcode:
set abc=123
echo Test%abc%
echo.
dir "C:\ProgramData"
ergibt
Code:
←[?25l←[2J←[m←[HMicrosoft Windows [Version 10.0.22621.2428]
(c) Microsoft Corporation. Alle Rechte vorbehalten.←[4;1HC:\Develop\ActiveScripting\Win32\Debug>←]0;C:\Windows\System32\cmd.exe←[?25h←[?25lset abc=123←[6;1HC:\Develop\ActiveScripting\Win32\Debug>echo Test%abc%
Test123←[9;1HC:\Develop\ActiveScripting\Win32\Debug>echo.←[12;1HC:\Develop\ActiveScripting\Win32\Debug>dir "C:\ProgramData"
 Volume in Laufwerk C: hat keine Bezeichnung.
 Volumeseriennummer: *****-*****&#8592;[16;1H Verzeichnis von C:\ProgramData&#8592;[18;1H10.11.2023  06:13    <DIR>         ActiveBackupforBusinessAgent
22.04.2023  19:57    <DIR>         AirDroid
22.10.2023  04:33    <DIR>         AnyDesk
08.11.2023  17:40    <DIR>         Docker
...
04.01.2023  10:23    <DIR>         Windows App Certification Kit
07.05.2022  11:39    <DIR>         WindowsHolographicDevices
27.01.2023  00:43    <DIR>         WindowsPerformanceRecorder
               0 Datei(en),             0 Bytes
              26 Verzeichnis(se), 312.794.443.776 Bytes frei
&#8592;]0;C:\Windows\System32\cmd.exe
C:\Develop\ActiveScripting\Win32\Debug>
8592 ist das ESC-Zeichen (kleiner Pfeil lisks) ... das Code-Tag mag es nicht
$2B or not $2B

Geändert von himitsu (10. Nov 2023 um 11:20 Uhr)
  Mit Zitat antworten Zitat
Bodenseematze

Registriert seit: 10. Jul 2023
68 Beiträge
 
#4

AW: [gelöst] UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE

  Alt 13. Nov 2023, 10:17
Prima, dass Du über Deinen (steinigen) Weg hier berichtest und Deine Lösung auch gleich mitteilst!
  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:24 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