' *** myProc類 vb.Net版本***
' *** 功能:運行一個可執行文件,並重定向它的標準輸出stdOut以及錯誤輸出errOut給主程序。 ***
' Imports System.Windows.Forms
' 載入窗體庫
Public Class myProc_test ' 測試代碼
Dim cmdProc1 As New myProc ' 初始化myProc實例
Private Sub Form1_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
cmdProc1.kill() ' 在主程序結束時釋放資源。
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 調用樣例
cmdProc1.run("D:\CPUMiner\Minerd.exe", "-o 127.0.0.1:8332 -u foo -p bar -t 2", "D:\CPUMiner")
' 功能:執行進程
' 調用方法:run(程序文件名稱,參數,工作文件夾)
cmdProc1.hnd(AddressOf Invoker)
' 功能:掛載事件處理器
' 調用方法:hnd(AddressOf 事件委託器)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
cmdProc1.kill()
' 功能:殺死進程
' 調用方法:kill()
End Sub
Private Sub myProc_Evnt(msg As String) ' 由委託觸發的事件處理程序
If msg.IndexOf("myProc.errOut") = 0 Then
TextBox1.AppendText(msg.Substring(14) + vbCrLf)
End If
If msg.IndexOf("myProc.stdOut") = 0 Then
TextBox1.AppendText(msg.Substring(14) + vbCrLf)
End If
If msg.IndexOf("myProc.exited") = 0 Then
TextBox1.AppendText("程序已經退出。" + vbCrLf)
End If
If msg.IndexOf("myProc.disposed") = 0 Then
TextBox1.AppendText("程序已經銷燬。" + vbCrLf)
End If
End Sub
Private Sub Invoker(msg As String) ' myProc事件委託,負責在兩個類之間傳遞事件信息
Dim mi As myProc.dlEvntHnd
mi = New myProc.dlEvntHnd(AddressOf myProc_Evnt)
If IsNothing(msg) = False Then
Me.BeginInvoke(mi, msg)
End If
End Sub
End Class
Public Class myProc
Public Delegate Sub dlEvntHnd(ByVal msg As String)
Dim objProc As System.Diagnostics.Process
Dim objHnd As dlEvntHnd
Dim blRunning As Boolean
'''
''' 執行一個帶有參數和工作目錄的外部程序。爲了避免運行異常,調用前請先檢驗程序文件是否存在。
'''
''' 程序文件名,若指定了工作文件夾,則可以使用相對路徑。
''' 命令行參數。
''' 工作目錄。
Public Sub run(argUrl As String, argArg As String, argPwd As String)
blRunning = False
objProc = New System.Diagnostics.Process()
objProc.StartInfo.CreateNoWindow = True
objProc.StartInfo.UseShellExecute = False
objProc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
objProc.StartInfo.FileName = argUrl
objProc.StartInfo.Arguments = argArg
objProc.StartInfo.WorkingDirectory = argPwd
objProc.EnableRaisingEvents = True
objProc.StartInfo.RedirectStandardError = True
objProc.StartInfo.RedirectStandardOutput = True
objProc.StartInfo.RedirectStandardInput = False
AddHandler objProc.ErrorDataReceived, AddressOf _hndErrOut
AddHandler objProc.OutputDataReceived, AddressOf _hndStdOut
AddHandler objProc.Exited, AddressOf _hndExit
AddHandler objProc.Disposed, AddressOf _hndDisp
Try
objProc.Start()
Catch ex As System.ComponentModel.Win32Exception
Throw
End Try
objProc.BeginErrorReadLine()
objProc.BeginOutputReadLine()
blRunning = True
End Sub
'''
''' 殺死正在運行的當前進程。如果進程不在運行,則不做任何動作。
'''
Public Sub kill()
If blRunning = True Then
If objProc.HasExited = False Then
objProc.Kill()
End If
End If
End Sub
'''
''' 掛載事件處理程序。
'''
''' hnd = AddressOf Invoker, 代表一個dlEvntHnd類型的事件投遞程序,負責響應事件並將字符串類型的事件信息傳遞給主程序。
Public Sub hnd(ByVal hnd As dlEvntHnd)
objHnd = hnd
End Sub
Private Sub _hndErrOut(sender As Object, e As System.Diagnostics.DataReceivedEventArgs)
If IsNothing(objHnd) = False And IsNothing(e.Data) = False Then
objHnd("myProc.errOut:" + e.Data.ToString())
End If
End Sub
Private Sub _hndStdOut(sender As Object, e As System.Diagnostics.DataReceivedEventArgs)
If IsNothing(objHnd) = False And IsNothing(e.Data) = False Then
objHnd("myProc.stdOut:" + e.Data.ToString())
End If
End Sub
Private Sub _hndExit(sender As Object, e As EventArgs)
If IsNothing(objHnd) = False Then
RemoveHandler objProc.ErrorDataReceived, AddressOf _hndErrOut
RemoveHandler objProc.OutputDataReceived, AddressOf _hndStdOut
RemoveHandler objProc.Exited, AddressOf _hndExit
RemoveHandler objProc.Disposed, AddressOf _hndDisp
objProc.Close()
blRunning = False
objHnd("myProc.exited")
End If
End Sub
Private Sub _hndDisp(sender As Object, e As EventArgs)
If IsNothing(objHnd) Then
objHnd("myProc.disposed")
End If
End Sub
End Class
C#文件執行類的VB.NET版本
主要區別在於事件處理要採用AddHandler和RemoveHandler,以及AddressOf三個關鍵字,其它基本一樣。
VB的操作略微繁瑣,但仍然可以實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.