2011-06-17 23 views
5

में प्रक्रिया मॉनीटर/प्रेषक को किसी अन्य वीबी 6 एप्लिकेशन के उदाहरण चलाने और चल रही प्रक्रियाओं पर नजर रखने के लिए वीबी 6 में थोड़ा सा एप्लीकेशन लिखना होगा, लेकिन मुझे नहीं पता कि वीबी 6 में प्रक्रिया जानकारी कैसे प्राप्त करें। मैं tasklist उपयोगिता के साथ जो कुछ चाहता हूं उसे देख सकता हूं लेकिन मुझे वास्तव में पता नहीं है कि प्रक्रिया कैसे बनाएं (यदि संभव हो तो प्रक्रिया या एप्लिकेशन नाम निर्दिष्ट करना) और ऑपरेटिंग सिस्टम से प्रक्रियाओं के बारे में जानकारी प्राप्त करना।वीबी 6

यह एप्लिकेशन Windows XP मशीन पर चलाना है।

क्या किसी को इस तरह की चीज़ के लिए एक आरंभ-शुरू-शुरू ट्यूटोरियल या सहायक वेब पेज के बारे में पता है?

उत्तर

6

ऐसे कई विंडोज एपीआई फ़ंक्शन हैं जिनका उपयोग आप इसे करने के लिए कर सकते हैं। मैं EnumProcesses (VB6 example and declaration here) देखकर शुरू करूंगा जिसका उपयोग सभी चल रही प्रक्रियाओं के बारे में जानकारी इकट्ठा करने के लिए किया जा सकता है। आप किसी विशेष प्रक्रिया (another VB6 example) के बारे में पूछताछ शुरू करने के लिए OpenProcess का भी उपयोग कर सकते हैं।

fairly nice example on MSDN भी है।

और निश्चित रूप से, वहाँ स्पॉन प्रक्रियाओं के लिए है CreateProcess (AllApi link) या ShellExecute (AllApi) - पूर्व आप, इस प्रक्रिया के निर्माण पर अधिक नियंत्रण देता है, जबकि दूसरा एक बहुत सरल कॉल है।

There was another question posted about this a while back with some example code.

एक अन्य संभावित दृष्टिकोण WMI (some useful snippets to adapt) का उपयोग करने के लिए होगा।

अंत में, यहाँ कुछ ट्यूटोरियल पता चलता है कि आप इसे कैसे करना (मैं इसे अपने आप को कोशिश कर पहले का सुझाव देते हैं, हालांकि :):

यहां कुछ संबंधित प्रश्न हैं, हालांकि आप पोस्टिंग से पहले इस साइट की खोज करते समय शायद ही उन्हें देख चुके हैं:

3

के बाद से आप कहते हैं कि अन्य अनुप्रयोग है ** भी VB6 **, यह आसान होगा एक ActiveX exe में अन्य अनुप्रयोग बनाने के लिए। फिर आप अपने पहले आवेदन से सीधे अन्य आवेदन में वस्तुओं के संदर्भ प्राप्त कर सकते हैं। COM यह सब आपके लिए हल करता है।

+0

इस तकनीक को निश्चित रूप से इसके अनुप्रयोग है और मैं एक संभावना के रूप में अपने आप को यह सुझाव देंगे का विकल्प होता है नए काम के ceratin प्रकार के लिए। हालांकि अगर बच्चे के कार्यक्रम आपके द्वारा लिखे गए नहीं थे, तो यह बहुत मदद नहीं करता है, और फिर भी इसे पुनः लिखने की आवश्यकता हो सकती है। इसे प्रो पंजीकरण पंजीकरण की आवश्यकता है जो कई परिदृश्यों में कमी हो सकती है। – Bob77

2

आप प्रक्रियाओं के लिए 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 

उम्मीद है कि यह प्रश्न का उत्तर देने में मदद करता है।

+0

तो CreateProcess एक बाल प्रक्रिया बनाता है, फिर, एक मुक्त खड़ा नहीं है? मैं उम्मीद कर रहा था कि अगर मॉनिटर/प्रेषक गड़बड़ी में गिर जाए तो प्रक्रियाएं चलती रहेंगी। –

+0

विंडोज़ में प्रक्रिया पारिवारिक संबंध आमतौर पर काफी कमजोर होते हैं। माता-पिता समाप्त होने पर भी बाल प्रक्रियाएं चलती रहेंगी। – Bob77

+0

एर, उपरोक्त टिप्पणी CreateProcess() या VB के शैल() के सामान्य उपयोग के बारे में बात कर रही थी। मैंने जो कोड नमूना जोड़ा, वह बाहर निकलने पर स्पष्ट रूप से अपने बच्चों को मार देता है। – Bob77

0

कुछ और सरल सॉकेट का उपयोग करेंगे।

आपको ऐप सर्वर लॉन्च करता है और आपके क्लाइंट पर आपके सर्वर के विरुद्ध संचार लागू करता है। इसके साथ आप अंतःसंचार प्रदान करेंगे।

अच्छी तरह से मैं कहता हूं। क्योंकि मैं न हो कि आप क्या कोशिश

क्षमा करें यह केवल लागू करता है, तो अपने ग्राहकों को घर में किया जाता है मैं तुम्हें जोड़ा परिवर्तन