大神帮忙看看。vb.net关于从shell获取信息的有关问题
大神帮忙看看。。vb.net关于从shell获取信息的问题!
- VB.NET code
<MethodImpl(MethodImplOptions.Synchronized)> _ Sub CBstream(ByVal s As IAsyncResult) Try Dim t As MyStreamReader = CType(s.AsyncState, MyStreamReader) If t.stream.BaseStream Is Nothing Then Exit Sub End If Dim i As Integer = t.stream.BaseStream.EndRead(s) Dim strReceive As String = System.Text.Encoding.Default.GetString(t.bytes, 0, i) m_StringFromShell = strReceive t.stream.BaseStream.BeginRead(t.bytes, 0, 1024, New AsyncCallback(AddressOf CBstream), t) Catch ex As Exception MessageBox.Show("CBstream--" & ex.ToString) End Try End Sub m_StringFromShell = strReceive这一句应该有问题,但是我不知道怎么改,出现的问题是我调试的时候m_StringFromShell是有值的,我用一个类方法返回这个m_StringFromShell的时候,在form中调用这个方法,然后在RichTextBox中显示,没有显示出来,有时也会出现信息,显示的是我调用cmd.exe时的信息,我把这个类也贴上来吧,好让大神们帮忙改改Imports System.Threading Imports System.Runtime.CompilerServices Imports System.IO ''' <summary> ''' 将Form中发送过来的信息处理,再将处理结果返回给Form ''' </summary> ''' <remarks></remarks> Public Class StringOfShell Private m_StringToShell As String '发送到shell的字符串 Private m_StringFromShell As String '从shell返回的字符串 Public Event AddStringToRichTextBox() Friend Class MyStreamReader Public stream As IO.StreamReader Public bytes(1024) As Byte Public Sub New() End Sub End Class <MethodImpl(MethodImplOptions.Synchronized)> _ Sub CBstream(ByVal s As IAsyncResult) Try Dim t As MyStreamReader = CType(s.AsyncState, MyStreamReader) If t.stream.BaseStream Is Nothing Then Exit Sub End If Dim i As Integer = t.stream.BaseStream.EndRead(s) Dim strReceive As String = System.Text.Encoding.Default.GetString(t.bytes, 0, i) m_StringFromShell = strReceive t.stream.BaseStream.BeginRead(t.bytes, 0, 1024, New AsyncCallback(AddressOf CBstream), t) Catch ex As Exception MessageBox.Show("CBstream--" & ex.ToString) End Try End Sub #Region "private viable" Dim sw As StreamWriter Dim sr As New MyStreamReader Dim err As New MyStreamReader Dim p As System.Diagnostics.Process = New System.Diagnostics.Process Dim psI As New System.Diagnostics.ProcessStartInfo(System.Environment.GetEnvironmentVariable("ComSpec")) #End Region ''' <summary> ''' 向shell发送的字符串 ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> ''' Public Property StringToShell() As String Get Return m_StringToShell End Get Set(ByVal value As String) m_StringToShell = value End Set End Property ''' <summary> ''' 从shell得到的字符串 ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Property StringFromShell() As String Get Return m_StringFromShell End Get Set(ByVal value As String) m_StringFromShell = value End Set End Property ''' <summary> ''' 将Form中要执行的语句发送到这里来执行 ''' </summary> ''' <param name="StringToShell"></param> ''' <remarks></remarks> Public Sub ExecuteStringToShell(ByVal StringToShell As String) '这里添加发送给shell执行的语句 'Shell(m_StringToShell) p = New System.Diagnostics.Process '"cmd.exe"为nt的命令行程序 psI = New System.Diagnostics.ProcessStartInfo("cmd.exe") psI.UseShellExecute = False psI.RedirectStandardInput = True psI.RedirectStandardOutput = True psI.RedirectStandardError = True psI.CreateNoWindow = True p.StartInfo = psI p.Start() sw = p.StandardInput sr.stream = p.StandardOutput err.stream = p.StandardError sw.AutoFlush = True sr.stream.BaseStream.BeginRead(sr.bytes, 0, 1024, New AsyncCallback(AddressOf CBstream), sr) err.stream.BaseStream.BeginRead(err.bytes, 0, 1024, New AsyncCallback(AddressOf CBstream), err) sw.WriteLine(StringToShell) End Sub ''' <summary> ''' 获取shell的信息 ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Public Function GetStringFromShell() As String Dim StringFromShell As String '这里添加从shell中获取的信息,将值放到StringFromShell中 StringFromShell = m_StringFromShell '将进程关闭 p.Close() If Not sw Is Nothing Then sw.Close() End If If Not sr Is Nothing Then sr.stream.Close() End If If Not err Is Nothing Then err.stream.Close() End If Return StringFromShell End Function End Class