加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 10:08:14 所属栏目:大数据 来源:网络整理
导读:我以前使用下面的函数来启动并等待一个进程的结束. 它可以在32位或64位操作系统上启动和等待32位进程. 但是在64位操作系统上,当我启动64位进程(WaitForSingleObject = WAIT_OBJECT_0)时,它立即返回. 例如,如果我的应用程序(32位),在32位操作系统上启动mstsc.
我以前使用下面的函数来启动并等待一个进程的结束.

它可以在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位程序,其唯一的工作就是启动程序.您可以启动此过程,并要求启动其他进程.这将允许您从模拟器的离合器及其重定向中逃脱.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读