windows delphi winapi redirect delphi-xe

windows - ¿Cómo puedo verificar si mi aplicación de la consola Delphi se redirige a un archivo o canalización?



winapi redirect (2)

El enfoque que presento aquí se siente raro, pero no puedo encontrar una mejor manera de detectar si la salida estándar ha sido redireccionada o no desde una consola de pantalla. El enfoque que utiliza GetFileType no puede detectar todas las formas de redirección, ya que algunas redirecciones son para dispositivos del tipo FILE_TYPE_CHAR .

Llame a GetConsoleMode() pasando el identificador de salida estándar. Si GetConsoleMode() falla, su consola ha sido redirigida.

program RedirectionDetection; {$APPTYPE CONSOLE} uses   Windows; function ConsoleRedirected: Boolean; var   Mode: DWORD; begin Result := not GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), Mode); end; begin   if ConsoleRedirected then begin     Writeln(''I have been redirected'');   end else begin     Writeln(''I am a console'');     Readln;   end; end.

Tengo una aplicación de consola que debe deshabilitar o habilitar algunas operaciones cuando la salida se redirecciona (externamente) a un archivo o conducto (myapp.exe> ​​Foo.bar)

¿Cómo puedo verificar si mi aplicación de consola Delphi se redirige a un archivo o canalización?


puede usar las funciones GetStdHandle y GetFileType .

primero recupera el manejador de salida de la consola usando la función GetStdHandle y luego puede verificar el tipo del manejador con la función GetFileType .

{$APPTYPE CONSOLE} {$R *.res} uses Windows, SysUtils; function ConsoleRedirected: Boolean; var FileType : DWORD; begin FileType:= GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)); Result := (FileType=FILE_TYPE_PIPE) or (FileType=FILE_TYPE_DISK); end; begin try if ConsoleRedirected then Writeln(''Hello From File'') else Writeln(''Hello Console''); except on E: Exception do Writeln(E.ClassName, '': '', E.Message); end; end.