2010-01-20 4 views

답변

10

다음 기능을 사용해보십시오. WaitForSingleObject는 필요한 것을 처리합니다.

function ExecAppAndWait(const sApp, sParams: String; wShow: Word; sCurrentDirectory: String = ''): DWord; 
{ Parameter wShow: SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_MAXIMIZE ...} 
var 
    aSI  : TStartupInfo;  // Win32 : STARTUPINFO 
    aPI  : TProcessInformation; // Win32 : PROCESS_INFORMATION 
    aProc : THandle;    // Win32 
    aCurrentDirectory: PChar; 
    s: String; 
begin 
    s := sApp + ' ' + sParams; 
    FillChar(aSI, SizeOf(aSI), 0); 
    aSI.cb := SizeOf(aSI); 
    aSI.wShowWindow := wShow; 
    aSi.dwFlags := STARTF_USESHOWWINDOW; 


    if sCurrentDirectory = '' then 
    aCurrentDirectory := nil 
    else 
    aCurrentDirectory := PChar(sCurrentDirectory); 

    Win32Check(CreateProcess(nil, PChar(s), nil, nil, 
      False, Normal_Priority_Class, nil, aCurrentDirectory, aSI, aPI)); 
    // in TProcessInformation.hProcess -> Process-Handle 
    aProc := aPI.hProcess; 

    CloseHandle(aPI.hThread); 


    if WaitForSingleObject(aProc, Infinite) <> Wait_Failed then 
    GetExitCodeProcess(aProc, Result); 
    // free Ressource 
    CloseHandle(aProc); 
end; 
2

에서 ShellExecute은 직접 WinAPI를 기능입니다. 실행 된 프로세스에 대한 정보를 얻으려면 대신 ShellExecuteEx을 사용해야합니다.

+0

그런 다음 위의 WaitForSingleObject를 LPSHELLEXECUTEINFO.hProcess –

관련 문제