आप प्रक्रियाओं के लिए spelunking सिर्फ बच्चे प्रक्रियाओं है कि आप अंडे देने के लिए एक संभाल पाने के लिए जाने की जरूरत नहीं है।वीबी 6 शैल() फ़ंक्शन प्रोसेस आईडी देता है जिसका उपयोग आप OpenProcess
पर कॉल करने के लिए कर सकते हैं। CreateProcess
आपको सीधे हैंडल देता है।
ठीक है, यहां कार्यक्रमों के प्रसार और निगरानी के लिए वीबी 6 में एक कार्यक्रम का एक सुपर-स्ट्रिप-डाउन उदाहरण है। उदाहरण को शुरू करने के लिए कोड किया गया है और कमांड शेल (तुच्छ नमूना बाल कार्यक्रम) की 3 प्रतियां फिर से शुरू करें। इसे समाप्त होने पर किसी भी चल रहे बच्चों को मारने के लिए भी लिखा जाता है, और ज्यादातर मामलों में उपयोग करने के बेहतर विकल्प हैं। A Safer Alternative to TerminateProcess() देखें।
यह डेमो भी छोड़ने वाली प्रत्येक प्रक्रिया के निकास कोड को वापस रिपोर्ट करता है। आप exit 1234
या कार्रवाई में इसे देखने के लिए कुछ भी दर्ज कर सकते हैं।
डेमो बनाने के लिए एक फॉर्म के साथ एक नई वीबी 6 परियोजना खोलें। एक मल्टीलाइन टेक्स्टबॉक्स Text1
और एक टाइमर Timer1
जोड़ें (जिसका उपयोग बच्चों को पूरा होने के लिए मतदान करने के लिए किया जाता है)। इस कोड को फॉर्म में पेस्ट करें:
Option Explicit
Private Const SYNCHRONIZE = &H100000
Private Const PROCESS_QUERY_INFORMATION = &H400&
Private Const PROCESS_TERMINATE = &H1&
Private Const WAIT_OBJECT_0 = 0
Private Const INVALID_HANDLE = -1
Private Const DEAD_HANDLE = -2
Private Declare Function CloseHandle Lib "kernel32" (_
ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (_
ByVal hProcess As Long, _
ByRef lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (_
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (_
ByVal hProcess As Long, _
ByVal uExitCode As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (_
ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Private Tasks() As String
Private Handles() As Long
Private Sub Form_Load()
Dim I As Integer
'We'll run 3 copies of the command shell as an example.
ReDim Tasks(2)
ReDim Handles(2)
For I = 0 To 2
Tasks(I) = Environ$("COMSPEC") & " /k ""@ECHO I am #" & CStr(I) & """"
Handles(I) = INVALID_HANDLE
Next
Timer1.Interval = 100
Timer1.Enabled = True
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim I As Integer
Timer1.Enabled = False
DoEvents
For I = 0 To UBound(Tasks)
If Handles(I) <> INVALID_HANDLE And Handles(I) <> DEAD_HANDLE Then
TerminateProcess Handles(I), 666
CloseHandle Handles(I)
Handles(I) = DEAD_HANDLE
End If
Next
End Sub
Private Sub Timer1_Timer()
Dim I As Integer
Dim ExitCode As Long
Dim Pid As Long
Timer1.Enabled = False
For I = 0 To UBound(Tasks)
If Handles(I) <> INVALID_HANDLE Then
If WaitForSingleObject(Handles(I), 0) = WAIT_OBJECT_0 Then
If GetExitCodeProcess(Handles(I), ExitCode) <> 0 Then
Text1.SelText = "Task " & CStr(I) & " terminated, " _
& "exit code: " & CStr(ExitCode) _
& ", restarting task." _
& vbNewLine
Else
Text1.SelText = "Task " & CStr(I) & " terminated, " _
& "failed to retrieve exit code, error " _
& CStr(Err.LastDllError) _
& ", restarting task." _
& vbNewLine
End If
CloseHandle Handles(I)
Handles(I) = INVALID_HANDLE
End If
End If
If Handles(I) = INVALID_HANDLE Then
Pid = Shell(Tasks(I), vbNormalFocus)
If Pid <> 0 Then
Handles(I) = OpenProcess(SYNCHRONIZE _
Or PROCESS_QUERY_INFORMATION _
Or PROCESS_TERMINATE, 0, Pid)
If Handles(I) <> 0 Then
Text1.SelText = "Task " & CStr(I) & " started." _
& vbNewLine
Else
Text1.SelText = "Task " & CStr(I) _
& ", failed to open child process." _
& vbNewLine
Handles(I) = DEAD_HANDLE
End If
Else
Text1.SelText = "Task " & CStr(I) _
& ", failed to Shell child process." _
& vbNewLine
Handles(I) = DEAD_HANDLE
End If
End If
Next
Timer1.Enabled = True
End Sub
उम्मीद है कि यह प्रश्न का उत्तर देने में मदद करता है।
इस तकनीक को निश्चित रूप से इसके अनुप्रयोग है और मैं एक संभावना के रूप में अपने आप को यह सुझाव देंगे का विकल्प होता है नए काम के ceratin प्रकार के लिए। हालांकि अगर बच्चे के कार्यक्रम आपके द्वारा लिखे गए नहीं थे, तो यह बहुत मदद नहीं करता है, और फिर भी इसे पुनः लिखने की आवश्यकता हो सकती है। इसे प्रो पंजीकरण पंजीकरण की आवश्यकता है जो कई परिदृश्यों में कमी हो सकती है। – Bob77