gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:37:46 33 4
gpt4 key购买 nike

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

它可以很好地在 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;

最佳答案

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

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

这可以解释为什么您的新进程立即终止。

一些可能的解决方案:

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

关于Delphi 7 32位执行并等待64位进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23814441/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com