![]() |
[gelöst] UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE
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. ![]() 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 ![]() * 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. ![]() 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: ![]()
Delphi-Quellcode:
aber es bleibt bei Zugriffsverletzungen oder
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)); .... Zitat:
[add] Versuche mir grade hier den Wert der Konstante auszurechnen ... mal sehn ob der übereinstimmt. ![]() [add2] passt :) |
AW: UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE
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 :wall:
Delphi-Quellcode:
:freak:
@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 :freak:) |
AW: [gelöst] UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE
'ne winzige Falle gab es noch
![]() 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:
ergibt
set abc=123
echo Test%abc% echo. dir "C:\ProgramData"
Code:
8592 ist das ESC-Zeichen (kleiner Pfeil lisks) ... das Code-Tag mag es nicht
←[?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: *****-*****←[16;1H Verzeichnis von C:\ProgramData←[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 ←]0;C:\Windows\System32\cmd.exe C:\Develop\ActiveScripting\Win32\Debug> ← |
AW: [gelöst] UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE
Prima, dass Du über Deinen (steinigen) Weg hier berichtest und Deine Lösung auch gleich mitteilst! :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 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