【问题标题】:How do I read the standard output from a child process in VB6?如何在 VB6 中读取子进程的标准输出?
【发布时间】:2009-02-20 21:07:49
【问题描述】:

在 VB6 中创建进程时(与this 问题相关:),我使用的是以下结构:

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

在我开始我的进程之前,需要对 STARTUPINFO.hStdOutput 进行什么操作才能让我的 VB6 应用读取我的托管进程的输出?

谢谢!!

【问题讨论】:

    标签: winapi vb6 stdout


    【解决方案1】:

    跟进this other question by the OP,我发布了另一种方法来执行命令并获取标准输出:

    ' References: "Windows Script Host Shell Object Model" '
    
    Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" ( _
      ByVal dwMilliseconds As Long)
    
    Function ExecuteCommand(cmd As String, ExpectedResult as Long) As String
      Dim shell As New IWshRuntimeLibrary.WshShell
      Dim exec As IWshRuntimeLibrary.WshExec
    
      Set exec = shell.Exec(cmd)
      While exec.Status = 0
         Sleep 100
      Wend
    
      If exec.ExitCode = ExpectedResult Then
        ExecuteCommand = exec.StdOut.ReadAll
      Else
        ExecuteCommand = vbNullString     ' or whatever '
      End
    End Function
    

    【讨论】:

    • 这很完美!谢谢!有没有办法在子进程执行期间隐藏窗口(在本例中为控制台窗口)?
    • 恐怕不行。由于某种原因,只有“shell.Run”方法可以隐藏窗口。但是在那里你不会得到标准输出。如果您无法选择忽略窗口,那么您又回到了 Win32 API 调用方法。
    • 我想我解决了这个问题:我将构建我的 .NET 应用程序(子进程)作为 Windows 应用程序(而不是控制台应用程序)。这样,不会显示任何 UI。
    • 这是您可以做到的一种方式。 :-) 您也可以尝试将 .NET 应用程序公开给 COM 并直接使用它。
    【解决方案2】:

    Microsoft 在这里举了一个例子来说明如何做到这一点。

    【讨论】:

    【解决方案3】:

    AttachConsole(ATTACH_PARENT_PROCESS)

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 1970-01-01
      • 2011-02-17
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多