我想创建一个运行两个子进程的程序。现在,我希望当我的应用程序被任务管理器终止或崩溃时,它的两个子进程应该自动终止。我怎样才能做到这一点?
3 回答
在 Windows 中,您可以使用Job Objects——最接近 Linux 中的进程组的东西。只需研究 API,它与 XP(可能是 SP3)及更高版本兼容。
您必须将您的 VB6 进程分配给一个作业,然后您生成的所有其他进程都隐含地成为该作业的一部分。
让客户端使用 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 个进程?
这可以在您的应用程序启动一个额外的进程时完成,该进程监视您的应用程序的状态并负责关闭其他 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
每次单击命令按钮时都会启动一个计算器当您关闭表单时,监视器应用程序将关闭所有计算器,然后自行完成