J’ai une application de console qui doit désactiver ou activer certaines opérations lorsque la sortie est redirigée (en externe) vers un fichier ou un tube (myapp.exe> Foo.bar)
Comment puis-je vérifier si mon application de console Delphi est redirigée vers un fichier ou un tube?
vous pouvez utiliser les fonctions GetStdHandle
et GetFileType
.
D’abord, vous récupérez le handle de sortie de la console à l’aide de la fonction GetStdHandle, puis vous pouvez vérifier le type du handle avec la fonction 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.
L’approche que je vous présente ici semble hackée mais je ne trouve pas de meilleur moyen de détecter si la sortie standard a été ou non redirigée depuis une console d’écran. L’approche utilisant GetFileType
ne peut pas détecter toutes les formes de redirection car certaines redirections concernent des périphériques de type FILE_TYPE_CHAR
.
Appelez GetConsoleMode()
passant le handle de sortie standard. Si GetConsoleMode()
échoue, votre console a été redirigée.
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.