2013-04-09 127 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