2013-04-09 132 views
-1

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

+0

如何创建和启动子进程?使用Shell函数,CreateProcess API,DCOM或其他方法? – Arvo 2013-04-09 13:39:24

+0

@Arvo实际上,我的程序开始一个服务,当我的程序终止时需要停止。在这种情况下,只能使用Shell函数或CreateProcess,我准备好使用这些。 – user2245523 2013-04-09 15:27:31

+0

“服务”是指Windows服务吗?你将问题定义为与应用程序产生的子进程有关。 – 2013-04-09 16:33:41

回答

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计算器的荷兰名字,用自己的程序名称代替)

+0

可能是,我没有写清楚。但是,在我的问题中,条件是相反的。在你的例子中,当VB6程序终止时,我想让计算器自动关闭。 – user2245523 2013-04-09 15:24:39

+0

我认为他建议在你的子进程中使用这个逻辑,假设他们也是你负责的vb代码。然后,当你的主窗户关闭时,孩子们会认识到这一点并关闭自己。 – Cemafor 2013-04-09 20:03:51

+0

在想要关闭的窗口中使用此选项,并将“Rekenmachine”替换为要跟随状态的窗口的标题。我认为你有权访问你想要自动关闭的进程的源代码。 – Hrqls 2013-04-10 05:15:46

0

纠正我,如果我错了:你有启动其他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 

确保启动FUNC您可以使用命令行参数对其进行调用

您可以对此进行如下测试: 将监控应用程序编译到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 

这将您单击命令按钮 当您关闭该窗体每次启动一个计算器,监控应用将关闭所有计算器,然后完成自己

+0

是不是有任何替代方案,是否需要创建新的应用程序? – user2245523 2013-04-10 11:09:23

+0

我不这么认为:因为你想监视你自己的应用程序崩溃以及...如果你的应用程序崩溃,那么你不能做任何事情......或者你必须知道它可能崩溃的地方,在这种情况下,你可能会做些什么:) – Hrqls 2013-04-10 12:34:29