Bläddra i källkod

* update std handles after initing c

peter 24 år sedan
förälder
incheckning
65513e55d1
1 ändrade filer med 36 tillägg och 4 borttagningar
  1. 36 4
      rtl/win32/initc.pp

+ 36 - 4
rtl/win32/initc.pp

@@ -1,3 +1,6 @@
+{
+  $Id$
+}
 unit initc;
 
 interface
@@ -9,6 +12,7 @@ interface
 {$endif}
 
  {$LINKLIB cygwin}
+ {$linklib kernel32}
 
 { this unit is just ment to run
   startup code to get C code to work correctly PM }
@@ -16,6 +20,9 @@ interface
 
 implementation
 
+{$i textrec.inc}
+
+
 procedure cygwin_crt0(p : pointer);cdecl;external;
 
 {
@@ -35,17 +42,42 @@ end;
 
 procedure C_exit(status : longint);popstack;external name '_exit';
 
+const
+   STD_INPUT_HANDLE = $fffffff6;
+   STD_OUTPUT_HANDLE = $fffffff5;
+   STD_ERROR_HANDLE = $fffffff4;
+
+function GetStdHandle(nStdHandle:DWORD):longint;external 'kernel32' name 'GetStdHandle';
+
+procedure UpdateStdHandle(var t:TextRec;var stdHandle:longint;newHandle:longint);
+{ Check if the stdHandle is the same as the one in the TextRec, then
+  also update the TextRec }
+begin
+  if t.Handle=stdHandle then
+   t.Handle:=newHandle;
+  stdHandle:=newHandle;
+end;
+
+
 initialization
-cygwin_crt0(nil);
+  cygwin_crt0(nil);
+{ Reinitialize std handles that can be changed }
+  UpdateStdHandle(TextRec(Input),StdInputHandle,GetStdHandle(STD_INPUT_HANDLE));
+  UpdateStdHandle(TextRec(Output),StdOutputHandle,GetStdHandle(STD_OUTPUT_HANDLE));
+  TextRec(StdOut).Handle:=StdOutputHandle;
+  UpdateStdHandle(TextRec(Stderr),StdErrorHandle,GetStdHandle(STD_ERROR_HANDLE));
 
 finalization
 { should we pass exit code ?
   its apparently only used by _exit so it doesn't matter PM }
-C_exit(0);
+  C_exit(0);
 
 end.
+{
   $Log$
-  Revision 1.2  2000-07-13 11:33:57  michael
+  Revision 1.3  2000-12-30 17:48:36  peter
+    * update std handles after initing c
+
+  Revision 1.2  2000/07/13 11:33:57  michael
   + removed logs
- 
 }