控制台命名管道

Option Explicit

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const STARTF_USESTDHANDLES = &H100&
Private Const STARTF_USESHOWWINDOW = &H1

Private Type SECURITY_ATTRIBUTES
        nLength
As Long
        lpSecurityDescriptor
As Long
        bInheritHandle
As Long
End Type

Private Type STARTUPINFO
    cb
As Long
    lpReserved
As Long
    lpDesktop
As Long
    lpTitle
As Long
    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 CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) 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 Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Sub Form_Load()
    MsgBox retunCmdResult(
"ping www.baidu.com") '这里会显示ping返回的信息,用纯字符串处理即可。
End Sub

Public Function retunCmdResult(strCommand As String) As String
   
Dim Proc As PROCESS_INFORMATION '进程信息
    Dim Start As STARTUPINFO '启动信息
    Dim SecAttr As SECURITY_ATTRIBUTES '安全属性
    Dim hReadPipe As Long '读取管道句柄
    Dim hWritePipe As Long '写入管道句柄
    Dim lngBytesRead As Long '读出数据的字节数
    Dim strBuffer As String * 256 '读取管道的字符串buffer
    Dim Command As String 'DOS命令
    Dim ret As Long 'API函数返回值
    Dim lpOutputs As String '读出的最终结果
   
   
'设置安全属性
    With SecAttr
    .nLength
= LenB(SecAttr)
    .bInheritHandle
= True
    .lpSecurityDescriptor
= 0
   
End With
   
   
'创建管道
    ret = CreatePipe(hReadPipe, hWritePipe, SecAttr, 0)
   
If ret = 0 Then
    MsgBox
"无法创建管道", vbExclamation, "错误"
   
Exit Function
   
End If
   
   
'设置进程启动前的信息
    With Start
    .cb
= LenB(Start)
    .dwFlags
= STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
    .hStdOutput
= hWritePipe '设置输出管道
    .hStdError = hWritePipe '设置错误管道
    End With
   
   
'启动进程
    Command = strCommand 'DOS进程以ipconfig.exe为例
    ret = CreateProcess(vbNullString, Command, SecAttr, SecAttr, True, NORMAL_PRIORITY_CLASS, ByVal 0, vbNullString, Start, Proc)
   
If ret = 0 Then
    MsgBox
"无法启动新进程", vbExclamation, "错误"
    ret
= CloseHandle(hWritePipe)
    ret
= CloseHandle(hReadPipe)
   
Exit Function
   
End If
   
   
'因为无需写入数据,所以先关闭写入管道。而且这里必须关闭此管道,否则将无法读取数据
    ret = CloseHandle(hWritePipe)
   
   
'从输出管道读取数据,每次最多读取256字节
    Do
    ret
= ReadFile(hReadPipe, strBuffer, 256, lngBytesRead, ByVal 0)
    lpOutputs
= lpOutputs & Left(strBuffer, lngBytesRead)
    DoEvents
   
Loop While (ret <> 0) '当ret=0时说明ReadFile执行失败,已经没有数据可读了
   
   
'读取操作完成,关闭各句柄
    ret = CloseHandle(Proc.hProcess)
    ret
= CloseHandle(Proc.hThread)
    ret
= CloseHandle(hReadPipe)
   
    retunCmdResult
= lpOutputs
End Function

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值