2012년 11월 5일 월요일

VB6 API 이용 외부 프로그램 실행 - 동기적 실행

API 함수 및 상수를 많이 이용한다.

※동기적 실행이란 다른 프로그램 종료시까지 대기를 한 후,
   끝남과 동시에 다음 코딩라인으로 넘어가면서 실행된다는 뜻.

선언부 ↓
========================================================================
Public Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lptitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type


Public Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessID As Long
    dwThreadID As Long
End Type



' API함수 선언
Public Declare Function WaitForSingleObject Lib "kernel32" _
              (ByVal hHandle As Long, _
               ByVal dwMilliseconds As Long) As Long

Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
              (ByVal lpApplicationName As Long, _
               ByVal lpCommandLine As String, _
               ByVal lpProcessAttributes As Long, _
               ByVal lpThreadAttributes As Long, _
               ByVal bInheritHandles As Long, _
               ByVal dwCreationFlags As Long, _
               ByVal lpEnvironment As Long, _
               ByVal lpCurrentDriectory As Long, _
               lpStartupInfo As STARTUPINFO, _
               lpProcessInformation As PROCESS_INFORMATION) As Long

Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long


' API함수 상수선언
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const INFINITE = -1&
Public Const STARTF_USESHOWWINDOW = &H1
Public Const SW_SHOWMINIMIZED = 2
Public Const SW_SHOWMAXIMIZED = 3
Public Const SW_SHOWMINNOACTIVE = 7
Public Const SW_SHOWDEFAULT = 10



' Shell 명령을 실행시킨 후 해당 Shell이 완전히 종료될 때까지 대기하는 함수
Public Sub RunAndWait(RunCommand As String)
    Dim vProc As PROCESS_INFORMATION
    Dim vStart As STARTUPINFO
    Dim vRv As Long

    vStart.cb = LenB(RunCommand)
    vStart.dwFlags = STARTF_USESHOWWINDOW
    vStart.wShowWindow = SW_SHOWDEFAULT 'SW_SHOWMAXIMIZED

    ' Process 실행   
    vRv = CreateProcess(0&, RunCommand, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, vStart, vProc)
    Screen.ActiveForm.MousePointer = 11
    DoEvents

    ' 대기    vRv = WaitForSingleObject(vProc.hProcess, INFINITE)
    Screen.ActiveForm.MousePointer = 0
    DoEvents
    ' Process 종료    vRv = CloseHandle(vProc.hProcess)
End Sub

========================================================================

폼에 버튼 생성 후 다음과 같이 코딩

 Private Sub Command1_Click()
    RunAndWait "c:\windows\notepad.exe"
    MsgBox "메모장이 종료되었습니다."
End Sub

Public Function WinExecAndWait(strExecFile As String) As Long
    Dim WshShell As Object
    ''strExecFile = "c:\windows\notepad.exe"   실행파일 PullPath
   
    Set WshShell = CreateObject("Wscript.Shell")
    Call WshShell.Run(strExecFile, 1, 1)
End Function

댓글 없음:

댓글 쓰기