我以前使用下面的函数来启动并等待一个进程的结束.
它可以在32位或64位操作系统上启动和等待32位进程.
但是在64位操作系统上,当我启动64位进程(WaitForSingleObject = WAIT_OBJECT_0)时,它立即返回.
例如,如果我的应用程序(32位),在32位操作系统上启动mstsc.exe是可以的,但是不要等待64位操作系统,因为mstsc.exe是64位程序.
任何解决方案?
function gShellExecuteAndWait( vHandle : HWND; vOperation : string; vFichier : string; vParametres : string; vRepertoire : string; vAffichage : Integer; vDuree : DWORD; var vErreur : string ) : Boolean; var vSEInfo : TShellExecuteInfo; vAttente : DWORD; begin // Initialisation Result := True; vErreur := ''; vAttente := 0; // Initialisation de la structure ShellExecuteInfo ZeroMemory(@vSEInfo,SizeOf(vSEInfo)); // Remplissage de la structure ShellExecuteInfo vSEInfo.cbSize := SizeOf(vSEInfo); vSEInfo.fMask := SEE_MASK_NOCLOSEPROCESS; vSEInfo.Wnd := vHandle; vSEInfo.lpVerb := PAnsiChar(vOperation); vSEInfo.lpFile := PAnsiChar(vFichier); vSEInfo.lpParameters := PAnsiChar(vParametres); vSEInfo.lpDirectory := PAnsiChar(vRepertoire); vSEInfo.nShow := vAffichage; // L'exécution a réussi if ShellExecuteEx(@vSEInfo) then begin // Attendre la fin du process ou une erreur while True do begin case WaitForSingleObject(vSEInfo.hProcess,250) of WAIT_ABANDONED : begin Result := False; vErreur := 'L''attente a été annulée.'; Break; end; WAIT_OBJECT_0 : begin Break; end; WAIT_TIMEOUT : begin // Initialisation vAttente := vAttente + 250; // Le délai d'attente n'a pas été atteint if vAttente < vDuree then begin Application.ProcessMessages(); end // Le délai d'attente est dépassé else begin Result := False; vErreur := 'Le délai d''attente a été dépassé.'; Break; end; end; WAIT_Failed : begin Result := False; vErreur := SysErrorMessage(GetLastError()); Break; end; end; end; end // L'exécution a échoué else begin Result := False; vErreur := SysErrorMessage(GetLastError()); end; end;
解决方法
我的猜测是发生以下情况:
>您在64位Windows下的WOW64仿真器中运行了32位进程.
>您尝试启动一个名为mstsc.exe的新进程.
>系统搜索路径,并在系统目录中找到它.
>因为在WOW64下运行,系统目录是32位系统目录SysWOW64.
>该过程开始,并立即检测到它是一个32位进程,在64位系统下运行在WOW64下.
>然后,32位mstsc.exe确定需要启动它所做的64位版本的mstsc.exe,传递任何命令行参数,然后立即终止.
这将解释为什么你的新流程立即终止.
一些可能的解决方案:
>在启动新进程之前禁用文件系统重定向.显然你应该立即重新启用它.>创建一个与您的可执行文件相同目录的小型64位程序,其唯一的工作就是启动程序.您可以启动此过程,并要求启动其他进程.这将允许您从模拟器的离合器及其重定向中逃脱.