-1

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

4

3 回答 3

1

在 Windows 中,您可以使用Job Objects——最接近 Linux 中的进程组的东西。只需研究 API,它与 XP(可能是 SP3)及更高版本兼容。

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

看看在windows 上用 c++ 执行相当于“Kill Process Tree”的操作

于 2013-04-10T16:34:04.360 回答
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中计算器的荷兰语名称,请改用您自己的程序名称)

于 2013-04-09T14:02:17.157 回答
0

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

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

例如,一个粗略的监控应用程序可能存在 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

确保监控应用程序的启动函数是 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

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

于 2013-04-10T10:10:23.967 回答