我正在使用此代碼,我在互聯網上找到它,並在某些設備上等待,但在其他設備上沒有。有人可以解釋我哪裏出錯了。我的應用程序在Truecrypt中加載,然後等待用戶輸入密碼。退出Truecrypt後,它會啓動我的菜單程序。我的聯想Miix 2 8「平板電腦,win8.1(所有最新)將等待,我爸爸的win8.0(全部最新)將等待,但我朋友的華碩M80TA 8」win8.1平板電腦(所有最新)將等待,我的朋友的華碩M80TA 8「win8.1平板電腦(所有最新)不會。另一位朋友的win7筆記本電腦(全部是最新的)不會等待以太網。執行和等待有時不工作
var
aTSI : TStartupInfo;
aTPI : TProcessInformation;
iRet : Integer;
ExitCode: Cardinal;
begin
FillChar(aTSI, SizeOf(aTSI), #0);
FillChar(aTPI, SizeOf(aTPI), #0);
aTSI.CB:=SizeOf(aTSI);
if not CreateProcess(nil, PChar(sEXE), nil, nil, False,
NORMAL_PRIORITY_CLASS,
nil, nil, aTSI, aTPI) then
RaiseLastWin32Error;
repeat
iRet:=MsgWaitForMultipleObjects(1, aTPI.hProcess,
False, INFINITE, (QS_ALLINPUT));
if iRet <> (WAIT_OBJECT_0) then
Application.ProcessMessages;
until iRet = (WAIT_OBJECT_0); // use this for normal programs
ExitCode:= 0;
if not GetExitCodeProcess(aTPI.hProcess, ExitCode) then
RaiseLastWin32Error;
Result:= ExitCode;
CloseHandle(aTPI.hProcess);
end;
很難說。你有沒有做過任何調試?添加跟蹤記錄。此外,代碼至少泄漏一個,有時還會泄漏兩個句柄。你完全理解代碼嗎?如果不是,那麼這將是痛苦的。 – 2014-10-03 14:58:46
此代碼是否在工作線程中?用'QS_ALLINPUT'標誌和'ProcessMessages'結合等待* loop *看起來非常可疑。 – TLama 2014-10-03 15:04:09
此外,它應該只在'iRet =(WAIT_OBJECT_0 + 1)'時調用'Application.ProcessMessages',而不是在'iRet <> WAIT_OBJECT_0'時調用。'RaiseLastWin32Error'已被棄用一段時間,而是使用'RaiseLastOSError'。並且使用'try/finally'來確保無論是否引發異常,句柄總是處於關閉狀態。 – 2014-10-03 18:24:39