は、私がこれをしなかったアセンブリで記述された機能を持っていました。下記を参照してください。Windows上でstdinまたはstdoutがFreePascalでリダイレクトされるかどうかを検出するにはどうすればよいですか?私は標準入力や標準出力が古いターボパスカルの時代には、最新のFPC(V3.0.0)</p> <p>を使用して、コンソールアプリケーションのためにリダイレクトされているかどうかを知っておく必要があり
{ **************************************************************
* Routine : RedirectedStd *
* Purpose : Return Yes (True) if standard handle is being *
* : redirected. *
* Note(s) : Even though handle can take any handle value, *
* : the function will be meaningful only for the *
* : standard input, standard output, and standard *
* : error. It will, however, be True for any *
* : handle that does NOT point to the console. *
* : (Besides, this is what it actually checks for.)*
* : Make sure handle belongs to an open file or *
* : you will get wrong answer (check IOResult). *
************************************************************** }
function RedirectedStd(handle: Word): Boolean; assembler;
const
DEVICE = $0080;
FASTCONSOLE = $0010;
CONSOUT = $0002;
CONSIN = $0001;
asm
mov InOutRes,0
mov ax,$4400 { IOCTL svc, get device information }
mov bx,handle
int $21 { result in DX }
mov ax,1 { assume function is True }
jc @Error { got error with code in AX }
test dx,DEVICE
jz @Out
test dx,FASTCONSOLE
jz @Out
test dx,CONSOUT
jz @Out
test dx,CONSIN
jz @Out
xor ax,ax { function is False }
jmp @Out
@Error:
mov InOutRes,ax
@Out:
end; { RedirectedStd }
この構文はFPCアセンブラでは無効です。 (。私の変換が等価であるかどうかわからない)
function RedirectedStd(handle: Word): Boolean; assembler;
label Error,Done;
const DEVICE = $0080;
FASTCONSOLE = $0010;
CONSOUT = $0002;
CONSIN = $0001;
asm
movw $0,InOutRes
movw $4400,%ax { IOCTL svc, get device information }
movw handle,%bx
int $21 { result in DX }
movw $1,%ax { assume function is True }
jc Error { got error with code in AX }
test DEVICE,%dx
jz Done
test FASTCONSOLE,%dx
jz Done
test CONSOUT,%dx
jz Done
test CONSIN,%dx
jz Done
xor %ax,%ax { function is False }
jmp Done
Error: movw %ax,InOutRes
Done:
end; { RedirectedStd }
任意のアイデア:私はものの、それがクラッシュしOKコンパイル以下のバリアントを持つ私の運を試してみましたか?
EDIT:私は解決策を見つけ出すのに十分な方向性を与えた受け入れ答えに基づいて 、私は次のドロップで私の元のルーチンの置き換えを思い付いた:
function RedirectedStd(handle: Word): Boolean; {$ifndef WINDOWS} unimplemented; {$endif}
begin
RedirectedStd := False;
{$ifdef WINDOWS}
case handle of
0: RedirectedStd := GetFileType(GetStdHandle(STD_INPUT_HANDLE)) <> FILE_TYPE_CHAR;
1: RedirectedStd := GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)) <> FILE_TYPE_CHAR;
2: RedirectedStd := GetFileType(GetStdHandle(STD_ERROR_HANDLE)) <> FILE_TYPE_CHAR;
end;
{$endif}
end; { RedirectedStd }
ああ、あなたがする必要がありますWindowsは使います。標準出力のための
[Console.Outがファイルにリダイレクトされたかどうかをどのように判断できますか?](http://stackoverflow.com/questions/743885/how-can-i-determine-whe-console-out-ファイルにリダイレクトされました) –
@DavidHeffernan:そうではありません。私はFreePascalソリューションを探しています。 – tonypdmtr
一番上の答えでwinapi関数を呼び出します。または、同じことを言う数え切れないほどの詐欺師の1人を見つけてください。ここには1つのhttp://stackoverflow.com/questions/9021916/how-do-i-check-if-my-delphi-console-app-is-redirected-to-a-file-or-pipeにはさらに多くのものがあります –