* try to fix win32 problem with Dos program ouptut in command shell

Warning, to debug under win32 with GDB you must use "set new-console on"
This commit is contained in:
pierre 2002-01-22 16:29:52 +00:00
parent 6769598ff4
commit 969167ccf5

View File

@ -128,7 +128,9 @@ type
procedure SwitchBackToIDEScreen; virtual; procedure SwitchBackToIDEScreen; virtual;
private private
DosScreenBufferHandle, DosScreenBufferHandle,
IDEScreenBufferHandle : THandle; IDEScreenBufferHandle,
StartScreenBufferHandle,
NewScreenBufferHandle : THandle;
IDEActive : boolean; IDEActive : boolean;
ConsoleMode,IdeMode : Dword; ConsoleMode,IdeMode : Dword;
procedure BufferCopy(src,dest : THandle); procedure BufferCopy(src,dest : THandle);
@ -583,6 +585,16 @@ end;
{$ifdef win32} {$ifdef win32}
procedure UpdateFileHandles;
begin
{StdInputHandle:=longint(GetStdHandle(STD_INPUT_HANDLE));}
StdOutputHandle:=longint(GetStdHandle(STD_OUTPUT_HANDLE));
{StdErrorHandle:=longint(GetStdHandle(STD_ERROR_HANDLE));}
TextRec(Output).Handle:=StdOutputHandle;
TextRec(StdOut).Handle:=StdOutputHandle;
{TextRec(StdErr).Handle:=StdErrorHandle;}
end;
constructor TWin32Screen.Init; constructor TWin32Screen.Init;
var var
SecurityAttr : Security_attributes; SecurityAttr : Security_attributes;
@ -597,36 +609,38 @@ begin
SecurityAttr.nLength:=SizeOf(Security_attributes); SecurityAttr.nLength:=SizeOf(Security_attributes);
SecurityAttr.lpSecurityDescriptor:=nil; SecurityAttr.lpSecurityDescriptor:=nil;
SecurityAttr.bInheritHandle:=true; SecurityAttr.bInheritHandle:=true;
DosScreenBufferHandle:=CreateConsoleScreenBuffer( NewScreenBufferHandle:=CreateConsoleScreenBuffer(
GENERIC_READ or GENERIC_WRITE, GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,SecurityAttr, FILE_SHARE_READ or FILE_SHARE_WRITE,SecurityAttr,
CONSOLE_TEXTMODE_BUFFER,nil); CONSOLE_TEXTMODE_BUFFER,nil);
IDEScreenBufferHandle:=GetStdHandle(STD_OUTPUT_HANDLE); StartScreenBufferHandle:=GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleMode(GetStdHandle(Std_Input_Handle), @ConsoleMode); GetConsoleMode(GetStdHandle(Std_Input_Handle), @ConsoleMode);
IdeMode:=ConsoleMode; IdeMode:=ConsoleMode;
{$ifdef debug} {$ifdef debug}
{define win32bigwin} {define win32bigwin}
{$endif debug} {$endif debug}
{$ifdef win32bigwin} {$ifdef win32bigwin}
GetConsoleScreenBufferInfo(IDEScreenBufferHandle, GetConsoleScreenBufferInfo(StartScreenBufferHandle,
@ConsoleScreenBufferInfo); @ConsoleScreenBufferInfo);
BigWin.X:=ConsoleScreenBufferInfo.dwSize.X; BigWin.X:=ConsoleScreenBufferInfo.dwSize.X;
BigWin.Y:=200; BigWin.Y:=200;
{ Try to allow to store more info } { Try to allow to store more info }
res:=SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin); res:=SetConsoleScreenBufferSize(NewScreenBufferHandle,BigWin);
if not res then if not res then
error:=GetLastError; error:=GetLastError;
res:=SetConsoleScreenBufferSize(IDEScreenBufferHandle,BigWin); res:=SetConsoleScreenBufferSize(StartScreenBufferHandle,BigWin);
if not res then if not res then
error:=GetLastError; error:=GetLastError;
{$endif win32bigwin} {$endif win32bigwin}
{ make sure that both Screen Handle have the sme buffer } { make sure that both Screen Handle have the sme buffer }
GetConsoleScreenBufferInfo(IDEScreenBufferHandle, GetConsoleScreenBufferInfo(StartScreenBufferHandle,
@ConsoleScreenBufferInfo); @ConsoleScreenBufferInfo);
res:=SetConsoleScreenBufferSize(DosScreenBufferHandle, res:=SetConsoleScreenBufferSize(NewScreenBufferHandle,
ConsoleScreenBufferInfo.dwSize); ConsoleScreenBufferInfo.dwSize);
if not res then if not res then
error:=GetLastError; error:=GetLastError;
IDEScreenBufferHandle:=NewScreenBufferHandle;
DosScreenBufferHandle:=StartScreenBufferHandle;
Capture; Capture;
SwitchBackToIDEScreen; SwitchBackToIDEScreen;
end; end;
@ -635,10 +649,12 @@ destructor TWin32Screen.Done;
begin begin
{ copy the Dos buffer content into the original ScreenBuffer { copy the Dos buffer content into the original ScreenBuffer
which remains the startup std_output_handle PM } which remains the startup std_output_handle PM }
{if StartScreenBufferHandle=IDEScreenBufferHandle then}
BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle); BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);
SetConsoleActiveScreenBuffer(IDEScreenBufferHandle); SetConsoleActiveScreenBuffer(StartScreenBufferHandle);
SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle); SetStdHandle(Std_Output_Handle,StartScreenBufferHandle);
CloseHandle(DosScreenBufferHandle); UpdateFileHandles;
CloseHandle(NewScreenBufferHandle);
inherited Done; inherited Done;
end; end;
@ -813,7 +829,11 @@ end;
procedure TWin32Screen.Capture; procedure TWin32Screen.Capture;
begin begin
BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle); {if StartScreenBufferHandle=IdeScreenBufferHandle then
BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle)
else
BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);}
SaveConsoleScreen;
end; end;
{ dummy for win32 as the Buffer screen { dummy for win32 as the Buffer screen
@ -828,6 +848,9 @@ end;
procedure TWin32Screen.SaveConsoleScreen; procedure TWin32Screen.SaveConsoleScreen;
begin begin
GetConsoleMode(GetStdHandle(Std_Input_Handle), @ConsoleMode); GetConsoleMode(GetStdHandle(Std_Input_Handle), @ConsoleMode);
{ set the IDE buffer as active already now PM }
SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
UpdateFileHandles;
end; end;
procedure TWin32Screen.SwitchToConsoleScreen; procedure TWin32Screen.SwitchToConsoleScreen;
@ -836,6 +859,7 @@ begin
SetStdHandle(Std_Output_Handle,DosScreenBufferHandle); SetStdHandle(Std_Output_Handle,DosScreenBufferHandle);
IDEActive:=false; IDEActive:=false;
SetConsoleMode(GetStdHandle(Std_Input_Handle), ConsoleMode); SetConsoleMode(GetStdHandle(Std_Input_Handle), ConsoleMode);
UpdateFileHandles;
end; end;
procedure TWin32Screen.SwitchBackToIDEScreen; procedure TWin32Screen.SwitchBackToIDEScreen;
@ -848,7 +872,6 @@ begin
GetConsoleScreenBufferInfo(IDEScreenBufferHandle, GetConsoleScreenBufferInfo(IDEScreenBufferHandle,
@ConsoleScreenBufferInfo); @ConsoleScreenBufferInfo);
SetConsoleActiveScreenBuffer(IDEScreenBufferHandle); SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
IdeMode:=(IdeMode or ENABLE_MOUSE_INPUT) and not ENABLE_PROCESSED_INPUT; IdeMode:=(IdeMode or ENABLE_MOUSE_INPUT) and not ENABLE_PROCESSED_INPUT;
SetConsoleMode(GetStdHandle(Std_Input_Handle), IdeMode); SetConsoleMode(GetStdHandle(Std_Input_Handle), IdeMode);
WindowPos.left:=0; WindowPos.left:=0;
@ -909,7 +932,11 @@ end;
end. end.
{ {
$Log$ $Log$
Revision 1.7 2001-11-08 17:06:22 pierre Revision 1.8 2002-01-22 16:29:52 pierre
* try to fix win32 problem with Dos program ouptut in command shell
Warning, to debug under win32 with GDB you must use "set new-console on"
Revision 1.7 2001/11/08 17:06:22 pierre
* impose the correct size for win32 console window * impose the correct size for win32 console window
Revision 1.6 2001/11/08 16:38:25 pierre Revision 1.6 2001/11/08 16:38:25 pierre