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.