2011-06-17 36 views
5

Tôi cần viết một ứng dụng nhỏ trong VB6 để chạy các cá thể của ứng dụng VB6 khác và theo dõi các tiến trình đang chạy, nhưng tôi không biết làm thế nào để lấy thông tin tiến trình trong VB6. Tôi có thể thấy một số thứ tôi cần với tiện ích tasklist nhưng tôi thực sự không biết cách tạo quy trình (chỉ định quy trình hoặc tên ứng dụng nếu có thể) và tìm nạp thông tin về các quy trình từ hệ điều hành.Quá trình giám sát/điều phối trong VB6

Ứng dụng này là để chạy trên máy Windows XP.

Có ai biết về hướng dẫn bắt đầu làm quen hoặc trang web hữu ích cho loại điều này không?

Trả lời

6

Có nhiều chức năng Windows API bạn có thể sử dụng để thực hiện việc này. Tôi sẽ bắt đầu bằng cách xem EnumProcesses (VB6 example and declaration here) có thể được sử dụng để thu thập thông tin về tất cả các quy trình đang chạy. Bạn cũng có thể sử dụng OpenProcess để bắt đầu thẩm vấn Windows về một quy trình cụ thể (another VB6 example).

Ngoài ra còn có fairly nice example on MSDN.

Và tất nhiên, có CreateProcess (AllApi link) hoặc ShellExecute (AllApi) cho các quá trình sinh sản - cựu cung cấp cho bạn kiểm soát nhiều hơn việc tạo ra các quá trình này, trong khi sau này là lời kêu gọi đơn giản hơn nhiều.

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

Một cách tiếp cận có thể sẽ được sử dụng WMI (some useful snippets to adapt).

Cuối cùng, đây là một số hướng dẫn mà chỉ cho bạn cách để làm điều đó (tôi khuyên bạn nên cố gắng tự mình đầu tiên mặc dù :):

Dưới đây là một số câu hỏi có liên quan mặc dù bạn có thể đã thấy chúng khi bạn tìm kiếm trang web này trước khi đăng bài:

3

Vì bạn nói rằng ứng dụng khác là ** cũng VB6 **, nó sẽ dễ dàng hơn để làm cho ứng dụng khác vào một exe ActiveX. Sau đó, bạn có thể nhận được tham chiếu đến các đối tượng trong ứng dụng khác trực tiếp từ ứng dụng đầu tiên của bạn. COM giải quyết tất cả cho bạn.

+0

Kỹ thuật này chắc chắn có ứng dụng của nó và tôi muốn đề nghị nó như là một khả năng bản thân mình đối với các loại ceratin mới. Tuy nhiên nó không giúp ích nhiều nếu các chương trình con không được viết bởi bạn, và thậm chí sau đó nó có thể yêu cầu khá nhiều viết lại. Nó cũng đòi hỏi quá trình đăng ký COM có thể là một nhược điểm trong nhiều kịch bản. – Bob77

2

Bạn không cần phải đi spelunking cho quá trình chỉ để có được một xử lý cho quá trình con mà bạn đẻ trứng.Hàm VB6 Shell() trả về mã số quy trình bạn có thể sử dụng để gọi OpenProcess bằng. CreateProcess cung cấp cho bạn xử lý trực tiếp.

Ok, đây là một ví dụ siêu tước của một chương trình trong VB6 để sinh sản và theo dõi chương trình. Ví dụ được mã hóa để bắt đầu và liên tục khởi động lại 3 bản sao của lệnh shell (chương trình con mẫu nhỏ). Nó cũng được viết để giết bất kỳ trẻ em đang chạy khi nó được chấm dứt, và có lựa chọn thay thế tốt hơn để sử dụng trong nhiều trường hợp. Xem A Safer Alternative to TerminateProcess().

Bản trình diễn này cũng báo cáo lại mã thoát của mỗi quá trình thoát. Bạn có thể nhập exit 1234 hoặc somesuch để xem điều này hoạt động.

Để tạo bản trình diễn, hãy mở Dự án VB6 mới bằng Biểu mẫu. Thêm một Hộp văn bản nhiều dòng Text1 và Bộ hẹn giờ Timer1 (được sử dụng để thăm dò ý kiến ​​trẻ em để hoàn thành). Dán mã này vào Biểu mẫu:

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 

Hy vọng điều này sẽ giúp trả lời câu hỏi.

+0

vì vậy CreateProcess tạo ra một tiến trình con, sau đó, không phải là một quy trình tự do? Tôi đã hy vọng các quá trình sẽ tiếp tục chạy nếu màn hình/điều phối bị sập trong một mớ hỗn độn. –

+0

Quá trình liên kết gia đình trong Windows thường khá yếu. Các tiến trình con sẽ tiếp tục chạy ngay cả khi cha mẹ chấm dứt. – Bob77

+0

Er, bình luận ở trên nói về việc sử dụng chung của CreateProcess() hoặc Shell của VB(). Mẫu mã mà tôi thêm vào sẽ giết con của nó một cách rõ ràng khi thoát. – Bob77

0

thứ gì đó đơn giản hơn sẽ sử dụng ổ cắm.

Khởi chạy máy chủ ứng dụng và trên máy khách của bạn triển khai giao tiếp với máy chủ của bạn. Với điều đó bạn sẽ cung cấp liên lạc.

tôi cũng nói vậy. bởi vì tôi không thể là những gì bạn cố gắng làm

Xin lỗi nó chỉ được áp dụng nếu khách hàng của bạn được thực hiện trong nhà tôi bạn có tùy chọn thay đổi thêm

Các vấn đề liên quan