2011-06-14 68 views
0

我有一個創建一個進程後續功能:MsgWaitForMultipleObjects返回訪問被拒絕

function .CreateProcess(aAppletPath: string; var aError : string; aProcessInfo: TProcessInformation): Boolean; 
var 
    StartInfo: TStartupInfo; 
begin 
    FillChar(StartInfo, SizeOf(TStartupInfo),#0); 
    FillChar(aProcessInfo, SizeOf(TProcessInformation),#0); 
    StartInfo.cb := SizeOf(TStartupInfo); 
    if False then begin 
    StartInfo.dwFlags := STARTF_USESHOWWINDOW; 
    StartInfo.wShowWindow := SW_HIDE; 
    end; 
    if Windows.CreateProcess(nil, PChar(aAppletPath), nil, nil, False, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil, StartInfo, aProcessInfo) then begin 
    Result := True; 
    WaitForInputIdle(aProcessInfo.hProcess, oTimeOutSecs * 1000); 
    end 
    else begin 
    Result := False; 
    end; 
end; 

而且我有這個方法等待應用程序終止:

function WaitForProcessTerminate(aHandle: THandle) : Boolean; 
var 
    vResult : LongWord; 
    Msg: TMsg; 
    PHandles: Pointer; 
begin 
    vResult := 0; 
    PHandles := @aHandle; 
    PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE); 
    while True do begin 
    vResult := Windows.MsgWaitForMultipleObjects(1, PHandles^, False, oTimeOutSecs * 1000, QS_ALLINPUT); 
    if vResult = WAIT_OBJECT_0 + 1 then begin 
     if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin 
     TranslateMessage(Msg); 
     DispatchMessage(Msg); 
     end; 
    end 
    else begin 
     Break; 
    end; 
    end; 
    case vResult of 
     WAIT_ABANDONED: Result := False; 
     WAIT_OBJECT_0: Result := True; 
     WAIT_TIMEOUT: Result := False; 
    else begin 
     Result := False; 
    end; 
    end; 
    if not Result then begin 
    ShowMessage(SystemErrorMessage); 
    end; 
end; 

的問題是等待功能總是返回WAIT_FAILEDAccess denied消息。我究竟做錯了什麼?此代碼是德爾福2010年和我打電話的應用程序是一個Java應用程序。

+1

請在調用'CreateProcess'之前調用'UniqueString(aAppletPath)'; API可以修改你傳遞給它的字符串,所以你應該確保*你的*調用者不會得到一個修改後的值。 – 2011-06-14 21:09:41

回答

3

沒關係的傢伙。這是我的錯誤。功能:

function .CreateProcess(aAppletPath: string; var aError : string; aProcessInfo: TProcessInformation): Boolean; 

應該是:

function .CreateProcess(aAppletPath: string; var aError : string; var {should be var!!} aProcessInfo: TProcessInformation): Boolean; 

我的道歉。

+1

更好的是,在調用函數之前,使用'out'向調用者表明他們不需要分配任何東西。 – 2011-06-14 21:07:16

+0

感謝您的提示 – 2011-06-14 21:08:28