如何以Admin身份运行进程并等待它终止?

时间:2016-01-24 10:19:50

标签: delphi winapi

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

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

FROM rails:4.2
MAINTAINER Chen Kinnrot <kinnrot@gmail.com>
RUN mkdir -p /var/app
COPY Gemfile /var/app/Gemfile
WORKDIR /var/app
RUN bundle install
CMD rails s -b 0.0.0.0

但是在上述方式的答案中有一个注释:MsgWaitForMultipleObjects被调用:&#34; 只有当MsgWaitForMultipleObjects()专门返回WAIT_OBJECT_0 + 1时才应该处理消息。相应地处理其他返回值。&#34; - Remy Lebeau

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

1 个答案:

答案 0 :(得分:4)

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

  • WAIT_OBJECT_0 + 0表示等待返回,因为该进程已发出信号。通过退出循环来处理这个问题。您的子进程已终止。
  • WAIT_OBJECT_0 + 1表示因为消息已添加到队列而返回等待。通过抽取消息队列然后继续循环来处理此问题。
  • 由于您没有等待互斥锁对象,因此无法使用
  • WAIT_ABANDONED_0 + 0
  • WAIT_TIMEOUT是不可能的,因为您使用了无限超时。
  • WAIT_FAILED是意外错误。这不可能遇到。您应该致电RaiseLastOSError来回复此问题。

在评论中讨论的代码中还有其他错误,我不再重复。

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