首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

大神帮忙看看。vb.net关于从shell获取信息的有关问题

2012-04-10 
大神帮忙看看。。vb.net关于从shell获取信息的问题!VB.NET codeMethodImpl(MethodImplOptions.Synchronized

大神帮忙看看。。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.ThreadingImports System.Runtime.CompilerServicesImports 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 FunctionEnd Class 



[解决办法]
输出重定向
给你一个完整的例子
VB.NET code
Public Class Form1    'By 苦苦的潜行者    '输入和输出重定向,使用说明:先点击button1,    '然后在textbox1中输入dos命令,    '然后点击button2即可在textbox2中接收到信息    '例如ping 127.0.0.1    Dim P As New Process    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click        P.StartInfo.FileName = "cmd.exe"        P.StartInfo.UseShellExecute = False        P.StartInfo.RedirectStandardInput = True        P.StartInfo.RedirectStandardOutput = True        P.StartInfo.RedirectStandardError = True        P.StartInfo.CreateNoWindow = True        P.Start()    End Sub    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click        P.StandardInput.WriteLine("@" & TextBox1.Text)        P.StandardInput.WriteLine("@exit")   '此句必须有,否则读取不到输出的信息        TextBox2.Text = P.StandardOutput.ReadToEnd()        P.Close()    End SubEnd Class 

热点排行