Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何以管理员身份运行进程并等待其终止?_Delphi_Winapi - Fatal编程技术网

Delphi 如何以管理员身份运行进程并等待其终止?

Delphi 如何以管理员身份运行进程并等待其终止?,delphi,winapi,Delphi,Winapi,在上述问题的答案中,评论中提出了一些建议,但从未完全定稿。所以这个问题的基础是得到一个完整的,正确的,高质量的答案 以下是我根据上述问题的答案和评论得出的代码: procedure RunFileAsAdminWait(hWnd: hWnd; aFile, aParameters: string); var sei: TShellExecuteInfo; msg: tagmsg; begin FillChar(sei, SizeOf(sei), 0); sei.cbSize :=

在上述问题的答案中,评论中提出了一些建议,但从未完全定稿。所以这个问题的基础是得到一个完整的,正确的,高质量的答案

以下是我根据上述问题的答案和评论得出的代码:

procedure RunFileAsAdminWait(hWnd: hWnd; aFile, aParameters: string);
var
  sei: TShellExecuteInfo;
  msg: tagmsg;
begin
  FillChar(sei, SizeOf(sei), 0);
  sei.cbSize := SizeOf(sei);
  sei.Wnd := hWnd;
  sei.fMask := SEE_MASK_FLAG_NO_UI or SEE_MASK_NOCLOSEPROCESS;
  sei.lpVerb := 'runas';
  sei.lpFile := PChar(aFile);
  sei.lpParameters := PChar(aParameters);
  sei.nShow := SW_SHOWNORMAL;

  if ShellExecuteEx(@sei) then
  begin
    while MsgWaitForMultipleObjects(1, sei.hProcess, False, INFINITE, QS_ALLINPUT) <> WAIT_OBJECT_0 do
      while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do
        DispatchMessage(msg);

    CloseHandle(sei.hProcess);
  end;
end;
但是,在对上述调用MsgWaitForMultipleObjects的方式的回答中有一条注释:只有当MsgWaitForMultipleObjects专门返回WAIT_OBJECT_0+1时,才应该处理消息。相应地处理其他返回值雷米·勒博

请建议更正作为答案,以使其完整,质量良好的代码

的文档告诉您如何解释返回值。以下是特定调用的可能返回值:

WAIT_OBJECT_0+0表示返回的等待,因为进程已发出信号。通过退出循环来处理这个问题。您的子进程已终止。 WAIT_OBJECT_0+1表示返回的等待,因为消息已添加到队列中。通过泵送消息队列,然后继续循环来处理此问题。 WAIT__0+0不可能,因为您没有等待互斥对象。 由于使用了无限超时,因此无法等待超时。 等待失败是一个意外错误。这是不可能遇到的。对此,您应该调用RAISELASTERROR进行响应。 正如在评论中所讨论的,代码中还有其他错误,我将不再重复


此外,您的方法可能会导致重入问题,相当于调用Application.ProcessMessages。最好在线程中等待,并在等待返回时发送消息

调用ShellExecuteEx时不检查错误。你不能称之为TranslateMessage。您可以通过阅读文档来处理Remy的代码。看起来您不想学习自己,只想让别人为您编写代码。您是否阅读了MsgWaitForMultipleObjects的文档?你能不能不理解这些文档的某个特定部分?@DavidHeffernan我读了MSDN页面,但无法收集到关于在这种特殊情况下应该做什么的线索。我也在谷歌上搜索了一下,读了4到5篇不同的论坛帖子,都有答案,但没有一个特定的答案对这个问题的特定问题是“正确的”。这就是我在这里发帖的原因。如果我冒犯了您,很抱歉。我们是我,我对运行Application.ProcessMessages的内容非常怀疑。我希望你知道这样做的危险。我们是我,我将把等待放在一个单独的事件中,并在等待完成时向主线程发送消息。因此,如果您正在努力理解您阅读的文档,请告诉我们哪些部分您理解,哪些部分您不理解。请让我们明白,你不是在偷懒,也不是在期待我们编写你的代码。对我来说,我喜欢帮助人们学习。没有什么能让我只做工作而不让你学习。所以,要明确你想要学习。但正如我上面所说的,您选择的解决方案很可能是错误的方法。@DavidHeffernan这是Remy关于WAIT_OBJECT_0+1的返回值的评论。之后应该做什么?即,应处理哪些消息以及如何处理,使用哪种呼叫?这就是我不知道该怎么做的。