Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

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