在VB6中创建在程序终止时自动终止的子进程

在VB6中创建在程序终止时自动终止的子进程,vb6,watchdog,Vb6,Watchdog,我想创建一个运行两个子进程的程序。现在,我想当我的应用程序被任务管理器终止或崩溃时,它的两个子进程应该自动终止。如何执行此操作?让客户端使用FindWindow API检查主机是否仍在运行 例如:启动计算器,运行以下示例项目,然后关闭计算器。。关闭计算器后,此示例项目也将关闭 '1 form with: ' 1 timer: name=Timer1 Option Explicit Private Declare Function FindWindow Lib "user32" Alias "

我想创建一个运行两个子进程的程序。现在,我想当我的应用程序被任务管理器终止或崩溃时,它的两个子进程应该自动终止。如何执行此操作?

让客户端使用FindWindow API检查主机是否仍在运行

例如:启动计算器,运行以下示例项目,然后关闭计算器。。关闭计算器后,此示例项目也将关闭

'1 form with:
'  1 timer: name=Timer1
Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub Form_Load()
  With Timer1
    .Interval = 100
    .Enabled = True
  End With 'Timer1
End Sub

Private Sub Timer1_Timer()
  Dim hwnd As Long
  hwnd = FindWindow(vbNullString, "Rekenmachine")
  If hwnd = 0 Then Unload Me
End Sub

(Rekenmachine是windows中计算器的荷兰语名称,请改用您自己的程序名)

如果我错了,请纠正我:您的应用程序启动了另外两个进程(其中您没有访问源代码的权限),并且希望在应用程序结束时终止这两个进程

这可以在应用程序启动一个额外进程时完成,该进程监视应用程序的状态并负责关闭其他两个进程

例如,一个粗略的监控应用程序可能存在一个模块:

Option Explicit

Public pstrArg() As String

Private Sub Main()
  pstrArg = Split(Command, " ")
  Load frmMonitor
End Sub
此模块加载名为frmonitor的表单,表单上有一个计时器控件:

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub Form_Load()
  With Timer1
    .Interval = 100
    .Enabled = True
  End With 'Timer1
End Sub

Private Sub Timer1_Timer()
  Dim intIndex As Integer
  If FindWindow(vbNullString, pstrArg(0)) = 0 Then
    For intIndex = 1 To UBound(pstrArg)
      TerminateProcess pstrArg(intIndex)
    Next intIndex
    End
  End If
End Sub

Private Sub TerminateProcess(strName As String)
  Dim Process As Object
  For Each Process In GetObject("winmgmts:").ExecQuery("Select Name from Win32_Process Where Name = '" & strName & "'")
    Process.Terminate
  Next
End Sub
确保监控应用程序的启动函数是sub-Main,以便可以使用命令行参数调用它

您可以按如下方式进行测试: 将监控应用程序编译到MonitorApp.exe中,并将其放置在与名为frmTest的1个现有表单的测试项目相同的文件夹中:

'1 form with:
'  1 timer control: name=Timer1
'  1 command button : name=Command1

Option Explicit

Private Sub Command1_Click()
  Shell "calc.exe"
End Sub

Private Sub Form_Load()
  Shell App.Path & "\MonitorApp.exe frmTest calc.exe"
End Sub
这将在每次单击命令按钮时启动计算器 当您关闭表单时,监视器应用程序将关闭所有计算器,然后在您可以使用的Windows中完成自己的操作,这是Linux中最接近进程组的操作。只要研究一下API,它与w/XP(可能是SP3)及以上版本兼容

您必须将VB6进程分配给作业,然后生成的其他每个进程都会隐式地成为该作业的一部分


看看。

如何创建和启动子进程?使用Shell函数、CreateProcess API、DCOM或其他任何方法?@Arvo实际上,我的编程正在启动一个服务,当我的程序终止时,需要停止该服务。在这种情况下,只能使用Shell函数或CreateProcess,我已经准备好使用它们了。您所说的“服务”是指Windows服务吗?你的问题似乎是关于应用程序生成的子进程。可能是,我没有写清楚。但是,在我的问题中,情况正好相反。在您的示例中,我希望当VB6程序终止时计算器自动关闭。我认为他建议在您的子进程中使用此逻辑,假设它们也是您负责的vb代码。然后,当主窗口关闭时,子窗口将识别并关闭自己。在要关闭的窗口中使用此选项,并将“Rekenmachine”替换为要跟踪其状态的窗口的标题。我假设您可以访问要自动关闭的流程的源代码。如果您只能访问主流程的源代码,而主流程启动了另外两个您没有源代码的流程,那么如果不创建另一个监控流程,您将无法执行此操作。由于您的主机崩溃,它无法再执行任何操作,因此您需要另一个进程,该进程可以使用上述代码来监视主机的状态。然后,它可以使用这个线程中的一个答案来终止其他进程:。。在这之后,关闭它自己——难道没有其他不需要创建新应用程序的替代方案吗?我不这么认为:因为你也想监控自己应用程序的崩溃。。。如果你的应用程序崩溃,那么你什么都做不了。。。或者你必须知道它可能会在哪里崩溃,在这种情况下,你可以采取一些措施:)哇,很好。我学到了一些新东西。谢谢