2016-11-20 3 views
1

は、私がこれをしなかったアセンブリで記述された機能を持っていました。下記を参照してください。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は使います。標準出力のための

+0

[Console.Outがファイルにリダイレクトされたかどうかをどのように判断できますか?](http://stackoverflow.com/questions/743885/how-can-i-determine-whe-console-out-ファイルにリダイレクトされました) –

+0

@DavidHeffernan:そうではありません。私はFreePascalソリューションを探しています。 – tonypdmtr

+0

一番上の答えでwinapi関数を呼び出します。または、同じことを言う数え切れないほどの詐欺師の1人を見つけてください。ここには1つのhttp://stackoverflow.com/questions/9021916/how-do-i-check-if-my-delphi-console-app-is-redirected-to-a-file-or-pipeにはさらに多くのものがあります –

答えて

1

使用

GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)); 

。 stdinのために何をすべきかは明らかです。

+0

十分です。返された値がどのように使用されているかを理解するためには少しばかり作業をしなければなりませんでしたが、うまく機能しました。私は仕事関数を含めるように私の質問を更新しました。 – tonypdmtr

+1

それはあなたが知っていることすべてが書かれています。それから明らかでなければならない。魔法の定数を使用しないでください。 –

関連する問題