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