请教:
如何得到PING返回的字符串啊?

解决方案 »

  1.   

    Option Explicit
    Private Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
    Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
    Private Type SECURITY_ATTRIBUTES
            nLength As Long
            lpSecurityDescriptor As Long
            bInheritHandle As Long
    End Type
    Private Type STARTUPINFO
            cb As Long
            lpReserved As String
            lpDesktop As String
            lpTitle As String
            dwX As Long
            dwY As Long
            dwXSize As Long
            dwYSize As Long
            dwXCountChars As Long
            dwYCountChars As Long
            dwFillAttribute As Long
            dwFlags As Long
            wShowWindow As Integer
            cbReserved2 As Integer
            lpReserved2 As Long
            hStdInput As Long
            hStdOutput As Long
            hStdError As Long
    End Type
    Private Type PROCESS_INFORMATION
            hProcess As Long
            hThread As Long
            dwProcessId As Long
            dwThreadId As Long
    End Type
    Private Declare Function CreateProcessAsUser Lib "advapi32.dll" Alias "CreateProcessAsUserA" (ByVal hToken As Long, ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As SECURITY_ATTRIBUTES, ByVal lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As String, ByVal lpCurrentDirectory As String, ByVal lpStartupInfo As STARTUPINFO, ByVal lpProcessInformation As PROCESS_INFORMATION) As Long
    Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Const NORMAL_PRIORITY_CLASS = &H20
    Private Const STARTF_USESTDHANDLES = &H100
    Private Const STARTF_USESHOWWINDOW = &H1
    Private Function ExecuteCommandLineOutput(CommandLine As String, Optional BufferSize As Long = 256, Optional TimeOut As Long) As String
    Dim Proc As PROCESS_INFORMATION
    Dim Start As STARTUPINFO
    Dim SA As SECURITY_ATTRIBUTES
    Dim hReadPipe As Long
    Dim hWritePipe As Long
    Dim lBytesRead As Long
    Dim sBuffer As String
    If VBA.Len(CommandLine) > 0 Then
       SA.nLength = Len(SA)
       'sa.nLength = vba.Len(sa)
       SA.bInheritHandle = 1&
       SA.lpSecurityDescriptor = 0&
       If CreatePipe(hReadPipe, hWritePipe, SA, 0) > 0 Then
          Start.cb = Len(Start)
          Start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
          Start.hStdOutput = hWritePipe
          Start.hStdError = hWritePipe
          If CreateProcessA(0&, CommandLine, SA, SA, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, Proc) = 1 Then
             CloseHandle hWritePipe
             sBuffer = VBA.String(BufferSize, VBA.Chr(0))
             If TimeOut > 0 Then
                Dim BeginTime As Date
                BeginTime = VBA.Now
             End If
             Do Until ReadFile(hReadPipe, sBuffer, BufferSize, lBytesRead, 0&) = 0
                DoEvents
                If TimeOut > 0 Then
                   If VBA.DateDiff("s", BeginTime, VBA.Now) > TimeOut Then
                      ExecuteCommandLineOutput = "Timeout"
                      Exit Do
                   End If
                End If
                ExecuteCommandLineOutput = ExecuteCommandLineOutput & VBA.Trim(VBA.Replace(VBA.Left(sBuffer, lBytesRead), VBA.Chr(0), ""))
             Loop
             CloseHandle Proc.hProcess
             CloseHandle Proc.hThread
             CloseHandle hReadPipe
          Else
            ExecuteCommandLineOutput = "File or command not found"
          End If
       Else
          ExecuteCommandLineOutput = "CreatePipe failed. Error: " & Err.LastDllError & "."
       End If
    End If
    End Function
    Private Sub Command1_Click() '测试
    VBA.MsgBox ExecuteCommandLineOutput("ping www.sina.com.cn", , 0)
    'VBA.MsgBox ExecuteCommandLineOutput("ping www.sina.com.cn", , 5)
    End Sub引用斑竹的大作
      

  2.   

    有一个控件可以完成这项工作,你可以到相关网站上下载到,其实这是PING就可以完成的,你也可以调用它来实现!在大本营的光盘里就好象有这类文章可以参考!
    请你注意以下
      

  3.   

    代码:VB ping sample code using WinSock, IPX and IP:
    http://developer.novell.com/support/sample/tids/wsping/wsping.htmHow to Ping an IP Address Using Visual Basic:
    http://www.mvps.org/vbnet/index.html?code/internet/ping.htm