Programming/Dot.NET

외부프로그램 실행 및 출력화면 가져오기

bcheul 2010. 10. 7. 15:52

Microsoft Visual Studio .NET 2007 에서 지원하는 Framework 을 사용하는 경우에, Visual Basic 에서도 도스창으로 입출력 되는 내용을 프로그램 내에서 캡춰하여 사용할 수 있게 되었습니다.  사실 프로그램을 SHELL 명령어가 아닌 독립된 프로세스로 실행하기 때문에, 프로세스 제어가 더욱 강력해졌다고 볼수 있습니다. 
본글에서는 프로세스를 생성해서 외부 프로그램을 실행하고, 출력되는 화면을 Redirect 시켜서, 화면에 출력하는 방법에 대해서 설명하고자 합니다. 

먼저, 프로세스의 생성 및 실행 방법은 다음과 같습니다. 


        Dim  Executable As String = "프로그램.exe"
        Dim CommandLine As String = "프로그램 매게 변수(옵션) ...."

        Dim MyStartInfo As New Diagnostics.ProcessStartInfo(Executable, CommandLine)

        MyStartInfo.UseShellExecute = False                                  ' CMD.EXE 등을 사용하지 않음, 직접실행
        MyStartInfo.RedirectStandardOutput = True                     ' 프로그램 출력(STDOUT)을 Redirect 함
        MyStartInfo.RedirectStandardIn = False                             ' STDIN 은 Redirect 하지 않음
        MyStartInfo.CreateNoWindow = True                               ' 프로그램 실행 윈도우즈를 만들지 않음
 
        Dim MyProcess as New Diagnostics.Process
        MyProcess.StartInfo = MyStartInfo
        MyProcess.Start                                                                 ' 프로세스를 실행함 
    

이처럼 하는 경우에,  실행되는 프로세서에서 출력되는 메시지는 Visual Basic 내부로 Redirect 되게 됩니다. 이 Redirect 되어지는 값을 사용하기 위해서, 추가적으로 스트림을 열어주어야 합니다. 

        Dim STDOUT As New StreamReader(MyProcess.StandardOutput.BaseStream)

프로세스의 종료 여부는 HasExited 속성으로 판별하게 되는데, 이 속성과 While...Wend 루프를 함께 사용하면, 다음과 같이 됩니다. 

        While Not (MyProcess.HasExited) 

               Dim dummy As String = STDOUT.ReadLine                             ' 프로세스의 출력된 값에서, 라인 한개를 읽습니다
 
               '
               '  읽어 들인 라인으로 다른 작업을 하면 되구요.
               '
 
              Applications.DoEvents()                                                             ' 다른 프로세스에 영향을 주지 않도록...
        End While


위의 기능을 Class 로 만들어서 프로그램을 실행하고, 결과를 내부 버퍼에 QUE  한 다음에, 이것을 필요에 따라서 프로그램에서 읽어서 사용해도 크게 무리는 없습니다. 물론, 해당 프로세스에서 일정량 버퍼링을 하지만, 이상하게 그 버퍼링이 크지 않는 느낌입니다. 

추가적으로 타이머를 넣어서 일정 시간동안 프로세스에서 출력되는 결과가 없다든지, 하는 경우에 프로세스 진행을 변경하는 것두 하나의 방법입니다. 


***** MP4TE 0.3.2.x : MP4BOX.EXE 실행후, 화면 캡춰에 사용