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

时间:2013-04-09 12:25:02

标签: vb6 watchdog

我想创建一个运行两个子进程的程序。现在,我希望当我的应用程序被任务管理器终止或者崩溃时,它的两个子进程应该自动终止。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

在Windows中,您可以使用Job Objects - 最接近Linux中处理组的内容。只需研究API,它与XP兼容(可能是SP3)及以上版本。

您必须将VB6流程分配给作业,然后您生成的每个其他流程都隐含在此作业中。

看看Performing equivalent of “Kill Process Tree” in c++ on windows

答案 1 :(得分:0)

让客户端使用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中计算器的荷兰名称,改为使用您自己的程序名称)

答案 2 :(得分:0)

如果我错了,请纠正我:你有一个应用程序启动另外两个进程(你无法访问源代码),并且你希望在你的应用程序结束时杀死这两个进程?

当您的应用程序启动一个监视应用程序状态并负责关闭其他两个进程的额外进程时,可以执行此操作

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

Option Explicit

Public pstrArg() As String

Private Sub Main()
  pstrArg = Split(Command, " ")
  Load frmMonitor
End Sub

此模块加载一个名为frmMonitor的表单,其上带有一个计时器控件:

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

确保监控应用程序的启动功能是子主,因此您可以使用命令行参数调用它

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

'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

每次单击命令按钮时,都会启动计算器 当您关闭表单时,监视器应用程序将关闭所有计算器,然后自行完成