2012-01-26 25 views
10

Tôi có ứng dụng bảng điều khiển phải tắt hoặc bật một số hoạt động khi đầu ra được chuyển hướng (bên ngoài) sang tệp hoặc đường ống (myapp.exe> ​​Foo.bar)Làm cách nào để kiểm tra xem ứng dụng giao diện điều khiển Delphi của tôi có được chuyển hướng đến tệp hoặc đường ống không?

Làm cách nào để kiểm tra xem ứng dụng giao diện điều khiển Delphi của tôi có được chuyển hướng không vào một tập tin hoặc đường ống?

+0

bản sao có thể có của [Cách phát hiện nếu Console.In (stdin) đã được chuyển hướng?] (Http://stackoverflow.com/questions/3453220/how-to-detect-if-console-in- stdin-has-been-redirect) –

Trả lời

12

bạn có thể sử dụng các chức năng GetStdHandleGetFileType.

trước tiên bạn truy xuất bảng điều khiển đầu ra của bàn điều khiển bằng cách sử dụng hàm GetStdHandle và sau đó bạn có thể kiểm tra loại xử lý bằng hàm 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. 
+3

Tài liệu đề cập rằng 'File_Type_Char' là" thường là thiết bị LPT hoặc bảng điều khiển ", vì vậy phương pháp này có thể không cho bạn biết khi đầu ra của chương trình đang được chuyển hướng đến máy in:' myapp.exe> ​​LPT1'. –

+2

Thật vậy, nhưng op yêu cầu cụ thể cho '.. được chuyển hướng đến một tập tin hoặc pipe..' để anh ta có thể sử dụng' Kết quả: = (FileType = FILE_TYPE_PIPE) hoặc (FileType = FILE_TYPE_DISK); 'mã được nhận xét về câu trả lời của tôi. – RRUZ

+0

@RRUZ Nhiều khả năng đó là hai loại chuyển hướng đầu tiên xuất hiện trong đầu anh ta. Và nếu đó là những gì bạn tin thì tôi không biết tại sao bạn lại bình luận về phiên bản đó. –

9

Cách tiếp cận tôi trình bày ở đây cảm thấy bị hack nhưng tôi không thể tìm thấy cách tốt hơn để phát hiện xem đầu ra tiêu chuẩn đã được chuyển hướng khỏi bảng điều khiển màn hình hay chưa. Cách tiếp cận sử dụng GetFileType không thể phát hiện tất cả các dạng chuyển hướng vì một số chuyển hướng đến các thiết bị kiểu FILE_TYPE_CHAR.


Gọi GetConsoleMode() chuyển bộ xử lý đầu ra tiêu chuẩn. Nếu GetConsoleMode() không thành công thì bảng điều khiển của bạn đã được chuyển hướng.

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. 
+1

nếu 'GetConsoleMode' thất bại trong chế độ console do quyền truy cập chẳng hạn thì sao? – kobik

+2

@kobik Trò chơi kết thúc nếu bạn chưa có quyền truy cập vào bảng điều khiển của riêng mình !! –

+2

những gì tôi yêu cầu là, nếu tuyên bố này là một thực tế: "Nếu GetConsoleMode() không thành công thì giao diện điều khiển của bạn đã được chuyển hướng". – kobik

Các vấn đề liên quan