Создать дочерний процесс в VB6, который автоматически завершается при завершении программы.

Я хочу создать программу, которая будет запускать два дочерних процесса. Теперь я хочу, чтобы, когда мое приложение завершалось диспетчером задач или вылетало из строя, два его дочерних процесса должны автоматически завершаться. Как я могу это сделать?


person user2245523    schedule 09.04.2013    source источник
comment
Как вы создаете и запускаете дочерние процессы? Используете функцию Shell, CreateProcess API, DCOM или любые другие методы?   -  person Arvo    schedule 09.04.2013
comment
@Arvo На самом деле мое программирование запускает службу, которую нужно остановить, когда моя программа завершится. В случае, если это возможно только с помощью функции Shell или CreateProcess, я готов их использовать.   -  person user2245523    schedule 09.04.2013
comment
Под службой вы подразумеваете службу Windows? Вы сформулировали вопрос так, как будто он касается дочерних процессов, порожденных вашим приложением.   -  person Ilya Kurnosov    schedule 09.04.2013


Ответы (3)


В Windows вы можете использовать объекты задания - - самое близкое к процессным группам в Linux. Просто изучите API, он совместим с XP (возможно, SP3) и выше.

Вы должны назначить свой процесс VB6 заданию, тогда любой другой процесс, который вы создаете, неявно является частью этого задания.

Взгляните на Выполнение эквивалента «Kill Process Tree» в c ++ для windows.

person wqw    schedule 10.04.2013
comment
Вау круто. Узнал что-то новое. Спасибо! - person Hrqls; 11.04.2013

позвольте клиенту проверить, работает ли мастер по-прежнему, используя 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, используйте вместо этого название вашей собственной программы)

person Hrqls    schedule 09.04.2013
comment
Может быть, я не ясно написал. Но, в моем вопросе, условия противоположные. В вашем примере я хочу, чтобы калькулятор автоматически закрывался при завершении программы VB6. - person user2245523; 09.04.2013
comment
Я думаю, он предлагает использовать эту логику в ваших дочерних процессах, предполагая, что они также являются кодом vb, за который вы отвечаете. Затем, когда ваше главное окно закроется, дети узнают это и закроются. - person Cemafor; 10.04.2013
comment
Используйте это в окне, которое хотите закрыть, и замените Rekenmachine заголовком окна, за состоянием которого вы хотите следить. Я предполагал, что у вас есть доступ к исходному коду процесса, который нужно закрыть автоматически. - person Hrqls; 10.04.2013
comment
Если у вас есть доступ только к исходному коду основного процесса, который запускает 2 других процесса, исходный код которых у вас отсутствует, то вы не сможете сделать это, не создав еще один процесс мониторинга. Когда ваш мастер выходит из строя, он больше ничего не может делать, поэтому вам нужен другой процесс, который может использовать приведенный выше код для отслеживания состояния мастера. затем он может завершить другие процессы, используя один из ответов в этом потоке: stackoverflow.com/q/1378604/1584106. . и после этого закройте себя - person Hrqls; 10.04.2013

Поправьте меня, если я ошибаюсь: у вас есть приложение, которое запускает 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

Это будет запускать калькулятор каждый раз, когда вы нажимаете кнопку команды. Когда вы закрываете форму, приложение монитора закроет все калькуляторы, а затем завершит свою работу.

person Hrqls    schedule 10.04.2013
comment
Нет ли альтернативы, для которой не нужно создавать новое приложение? - person user2245523; 10.04.2013
comment
я так не думаю: поскольку вы также хотите отслеживать сбои вашего собственного приложения ... если ваше приложение вылетает, вы ничего не можете сделать ... или вы должны знать, где он может вылететь, в этом случае вы можете сделать что-то об этом :) - person Hrqls; 10.04.2013