Delphi 7 32位执行并等待64位进程

NMD*_*NMD 13 delphi process

我曾经使用下面的函数启动并等待unil结束进程.

它适用于在32位或64位OS上启动和等待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;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 15

我的猜测是发生以下情况:

  1. 您在64位Windows下的WOW64仿真器中运行了32位进程.
  2. 您尝试启动名为的新进程mstsc.exe.
  3. 系统在路径上搜索并在系统目录中找到它.
  4. 因为您在WOW64下运行,所以系统目录是32位系统目录SysWOW64.
  5. 该过程启动并立即检测到它是在64位系统下在WOW64下运行的32位进程.
  6. 然后,32位mstsc.exe确定它需要启动它所执行的64位版本mstsc.exe,传递任何命令行参数,然后立即终止.

这可以解释为什么您的新流程会立即终止.

一些可能的解决方

  1. 在启动新进程之前禁用文件系统重定向.显然你应该在之后立即重新启用它.
  2. 创建一个小的64位程序,该程序与可执行文件位于同一目录中,其唯一的工作是启动程序.您可以启动此过程并要求它启动其他过程.这将允许您逃离模拟器的离合器及其重定向.

  • 第三个选项可能是使用[`CreateToolhelp32Snapshot()`](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682489.aspx)枚举正在运行的进程,如果您的生成进程快速终止,检查终止进程是否产生了任何进程,如果是,则在其报告的processID上调用`OpenProcess()`并根据需要等待它. (4认同)