Я хочу создать программу, которая будет запускать два дочерних процесса. Теперь я хочу, чтобы, когда мое приложение завершалось диспетчером задач или вылетало из строя, два его дочерних процесса должны автоматически завершаться. Как я могу это сделать?
Создать дочерний процесс в VB6, который автоматически завершается при завершении программы.
Ответы (3)
В Windows вы можете использовать объекты задания - - самое близкое к процессным группам в Linux. Просто изучите API, он совместим с XP (возможно, SP3) и выше.
Вы должны назначить свой процесс VB6 заданию, тогда любой другой процесс, который вы создаете, неявно является частью этого задания.
Взгляните на Выполнение эквивалента «Kill Process Tree» в c ++ для windows.
позвольте клиенту проверить, работает ли мастер по-прежнему, используя 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 других процесса (из которых у вас нет доступа к исходному коду), и вы хотите, чтобы эти 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
Убедитесь, что функция запуска приложения мониторинга является подчиненной, чтобы вы могли вызывать ее с аргументами командной строки.
Вы можете проверить это следующим образом: скомпилируйте приложение мониторинга в MonitorApp.exe и поместите его в ту же папку, что и тестовый проект, имеющий одну форму с именем 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
Это будет запускать калькулятор каждый раз, когда вы нажимаете кнопку команды. Когда вы закрываете форму, приложение монитора закроет все калькуляторы, а затем завершит свою работу.