! 發展單位:風禹科技驗證有限公司 ! 撰寫人:鄭子璉(Tzu-Lien, Cheng, 璉璉) ,成大水博肄,微軟最有價值專家 ! Web: http://tlcheng.twbbs.org/TLCheng/ E-Mail: qvb3377@ms5.hinet.net ! -------------------------------------------------------------------------------------- Module modProcess Use kernel32 Use modFileTool Integer, Parameter, Public :: SIZESTARTUPINFO = 68 ! 設定回傳目標之常數 (CreateProcess Return) Integer, Parameter :: CPR_hProcess = 0 Integer, Parameter :: CPR_hThread = 1 Integer, Parameter :: CPR_dwProcessId = 2 Integer, Parameter :: CPR_dwThreadId = 3 Contains Integer Function myShell(lpFile, lpParameters, lpDirectory, nShowCmd, bWait) Character*(*) :: lpFile, lpParameters, lpDirectory Integer :: nShowCmd Logical(4) :: bWait Optional :: lpParameters, lpDirectory, nShowCmd, bWait Integer :: hProcess logical(4) :: pWait If (Present(bWait)) Then pWait = bWait Else pWait = .True. End If hProcess = myCreateProcess(lpFile, lpParameters, lpDirectory, nShowCmd, CPR_hProcess) If (pWait) Then iret = WaitForSingleObject(hProcess, INFINITE) myShell = 0 Else myShell = hProcess End If End Function Integer Function myCreateProcess(lpFile, lpParameters, lpDirectory, nShowCmd, nReturnHandle) Character*(*) :: lpFile, lpParameters, lpDirectory Integer :: nShowCmd, nReturnHandle Optional :: lpParameters, lpDirectory, nShowCmd, nReturnHandle Character(MAX_PATH) :: tParameters Character, Pointer :: pParameters, pDirectory Type (T_STARTUPINFO) sui Type (T_PROCESS_INFORMATION) pi Integer :: pShowCmd, pReturnHandle, iret logical(4) :: bret If (Present(nShowCmd)) Then pShowCmd = nShowCmd Else pShowCmd = SW_SHOWNORMAL End If If (Present(lpDirectory)) Then pDirectory => lpDirectory Else pDirectory => NULL_CHARACTER End If If (Present(lpParameters)) Then tParameters = ' ' // lpParameters // Char(0) pParameters => tParameters Else pParameters => NULL_CHARACTER End If If (Present(nReturnHandle)) Then pReturnHandle = nReturnHandle Else pReturnHandle = CPR_hProcess End If ! 設定 STARTUPINFO sui%cb = SIZESTARTUPINFO sui%lpReserved = 0 sui%lpDesktop = NULL sui%lpTitle = NULL sui%dwX = 0 sui%dwY = 0 sui%dwXSize = 0 sui%dwYSize = 0 sui%dwXCountChars = 0 sui%dwYCountChars = 0 sui%dwFillAttribute = 0 sui%dwFlags = 0 sui%wShowWindow = pShowCmd sui%cbReserved2 = 0 sui%lpReserved2 = 0 bret = CreateProcess ( & lpFile, & pParameters, & NULL_SECURITY_ATTRIBUTES, & NULL_SECURITY_ATTRIBUTES, & .FALSE., & DETACHED_PROCESS, & NULL, & pDirectory, & sui, & pi) If (bret .eqv. .TRUE.) Then Select Case (pReturnHandle) Case (CPR_hProcess) iret = pi%hProcess Case (CPR_hThread) iret = pi%hThread Case (CPR_dwProcessId) iret = pi%dwProcessId Case (CPR_dwThreadId) iret = pi%dwThreadId Case Default iret = pi%hProcess End Select Else End If myCreateProcess = iret End Function End Module