首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在VB6中读取子进程的标准输出?

在VB6中读取子进程的标准输出,可以使用Windows API函数CreateProcessReadFile来实现。以下是一个简单的示例代码:

代码语言:vb
复制
Option Explicit

Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

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 Sub Form_Load()
    Dim si As STARTUPINFO
    Dim pi As PROCESS_INFORMATION
    Dim hOutputRead As Long
    Dim hOutputWrite As Long
    Dim hInputRead As Long
    Dim hInputWrite As Long
    Dim lRet As Long
    Dim sBuffer As String
    Dim lBytesRead As Long
    
    ' Create pipes for redirecting input/output
    lRet = CreatePipe(hOutputRead, hOutputWrite, 0, 0)
    lRet = CreatePipe(hInputRead, hInputWrite, 0, 0)
    
    ' Set up STARTUPINFO structure
    si.cb = Len(si)
    si.hStdOutput = hOutputWrite
    si.hStdInput = hInputRead
    si.hStdError = hOutputWrite ' Redirect standard error to output
    si.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
    si.wShowWindow = SW_HIDE ' Hide the window
    
    ' Start the child process
    lRet = CreateProcess(vbNullString, "cmd.exe /c dir", 0, 0, 1, 0, 0, vbNullString, si, pi)
    
    ' Close handles to child process and its main thread
    Call CloseHandle(pi.hProcess)
    Call CloseHandle(pi.hThread)
    
    ' Read output from child process
    Do
        sBuffer = String(256, Chr(0))
        lBytesRead = 0
        lRet = ReadFile(hOutputRead, sBuffer, Len(sBuffer) - 1, lBytesRead, 0)
        sBuffer = Left(sBuffer, lBytesRead)
        Debug.Print sBuffer
    Loop While lRet <> 0
    
    ' Clean up
    Call CloseHandle(hOutputRead)
    Call CloseHandle(hOutputWrite)
    Call CloseHandle(hInputRead)
    Call CloseHandle(hInputWrite)
End Sub

这个示例代码使用CreateProcess函数创建一个子进程,并将子进程的标准输出重定向到一个管道。然后,使用ReadFile函数读取子进程的输出,并在VB6的调试窗口中显示。

注意,这个示例代码仅供参考,实际使用时可能需要进行适当的修改。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

何在进程读取(外部)进程标准输出标准错误输出结果

最近接手一个小项目,要求使用谷歌aapt.exe获取apk软件包信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程输出结果,当时还研究了一番,只是没有做整理。...它是我们启动进程时,控制进程启动方式参数。...我们之后将hWrite交给我们创建进程,让它去将信息写入管道。而我们父进程,则使用hRead去读取进程写入管道内容。...设置标准输出标准错误输出句柄 si.hStdError = hWrite; // 把创建进程标准错误输出重定向到管道输入 si.hStdOutput = hWrite...我们使用STARTF_USESTDHANDLES原因是:我们使用了标准输出标准错误输出句柄。

3.9K10

在 Node.js 通过进程操作标准输入输出

翻译:疯狂技术宅 原文:http://2ality.com/2018/05/child-process-streams.html 在本,我们在 Node.js 把 shell 命令作为进程运行。...然后异步读取这些进程 stdout 并写入其 stdin。...在 A 行,我们将进程 stdin 连接到当前进程 stdin。 B 行等待该过程完成。 等待进程通过 Promise 退出 函数 onExit()如下所示。...从子进程读取数据 下面的代码使用异步迭代(C行)来读取进程 stdout 内容: 1const {chunksToLinesAsync, chomp} = require('@rauschma...在进程之间进行管道连接 在下面的例子,函数transform() 将会: 从 source 进程 stdout 读取内容。 将内容写入 sink 进程 stdin。

3.3K30
  • python 从subprocess运行进程实时获取输出

    起因是这样,c++程序开发后 功能号和指令,校验需要人工去看对照二进制代码,量大还费力, 于是打算利用python 去调用 c++程序去校验指令, 首先要做就是用python 获取c++程序...printf() 或cout 输出; 环境linux python 3.8.x 以下代码实现,获取子程序输出 command='....linux shell指令,如果要用shell 指令ls 要将false 变成true, 通过指定stderr=subprocess.STDOUT,将子程序标准错误输出重定向到了标准输出,以使我们可以直接从标准输出同时获取标准输出标准错误信息...p.poll() 返回进程返回值,如果为None 表示 c++进程还未结束. p.stdout.readline() 从 c++标准输出里获取一行....参考文章1 pythonsubprocess.Popen()使用 参考文章 2 python 从subprocess运行进程实时获取输出

    10.3K10

    Python 异步: 在非阻塞子进程运行命令(19)

    该命令将在我们可以使用非阻塞 I/O 写入和读取进程运行。 1....这很有用,因为它允许命令在进程执行,并允许 asyncio 协程读取、写入和等待它。...Asyncio create_subprocess_exec() 示例 我们可以探索如何在 asyncio 进程运行命令。在这个例子,我们将执行“echo”命令来报告一个字符串。...命令输入和输出将由 shell 处理,例如标准输入、标准错误和标准输出。 我们可以让 asyncio 程序处理进程输入或输出。...在这个例子,我们将执行“echo”命令来报告一个字符串。 echo 命令将直接在标准输出上报告提供字符串。下面列出了完整示例。

    3K40

    用Python复制文件九种方法

    以下是演示“如何在Python复制文件”九种方法。...Os System()方法 它是运行任何系统命令最常见方式。使用system()方法,可以在subshell调用任何命令。在内部,这种方法会调用标准C库函数。 此方法返回命令退出状态。...如果您应用程序正在使用多个线程读取/写入文件,您可能会面对它。 ? 8.使用进程Call()方法在Python复制一个文件 进程模块提供了一个简单界面来处理进程。...它使我们能够启动进程,附加到其输入/输出/错误管道,并检索返回值。 流程模块旨在替代传统模块和功能,*os.system,os.spawn ,os.popen ,popen2。。...9.使用进程Check_output()方法在Python复制文件 使用进程check_output()方法,可以运行外部命令或程序并捕获其输出。它还支持管道。 ?

    1.9K70

    MIT6.828实验1 —— Lab Utilities

    进入xv6-riscv-fall19项目后可以看到两个比较重要目录:kernel为xv6内核源码,里面除了os工作核心代码(进程调度),还有向外提供接口(system call);user则是用户程序...使用fork()创建进程,在进程先从管道1read()再向管道2write(),父进程则与之相反。...在退出父进程前关闭其标准输入fd,此时read()将读取到eof(值为0),此时同样关闭进程标准输入fd,退出进程,这样进程链上所有进程就可以退出。...思路是使用两层循环读取标准输入: 内层循环依次读取每一个字符,根据空格进行参数分割,将参数字符串存入二维数组,当读取到'\n'时,退出当前循环;当接收到ctrl+d(read返回长度<0)时退出程序...用户进程和内核进程之间是如何切换上下文?系统调用函数名、参数和返回值是如何在用户进程和内核进程之间传递

    2.3K00

    CreatePipe匿名管道通信

    在生成进程之前,父进程首先调用Win32 API SetStdHandle()使进程、父进程可共用标准输入、标准输出标准错误句柄。...管道缓冲已满而数据还没有写完,WriteFile()将要等到另一进程对管道数据读取以释放出更多可用空间后才能够返回。...在下面将要给出程序示例,将由父进程(管道服务器)创建一个进程(管道客户机),进程回见个其全部标准输出发送到匿名管道,父进程再从管道读取数据,一直到进程关闭管道写句柄。...,再创建进程进程将继承父进程标准输出,然后再将父进程标准输出恢复为其初始状态。...创建进程只是向标准输出标准错误发送一些文本信息,其中发送给标准输出文本将重定向输出到管道,发送给标准错误文本将不改变输出

    1K10

    Java魔法堂:调用外部程序

    认识java.lang.Runtime#exec方法 作用:用于调用外部程序,并重定向外部程序标准输入、标准输出标准错误到缓冲池。功能就是和windows“运行”一样。 ?...即通过Runtime#exec调用外部程序时,外部程序标准输出流和标准错误流已经被Java程序接管。那么在命令企图通过>和>>实现输出重定向显然已无效果。 ?...另外,缓冲池容量是一定,因此若外部程序在运行过程不断向缓冲池输出内容,当缓冲池填满,那么外部程序将暂停运行直到缓冲池有空位可接收外部程序输出内容为止。...boolean isAlive() // 获取进程异常输出流,如果子进程以`ProcessBuilder`创建,且通过`ProcessBuilder.redirectError`设置重定向,那么该方法返回...`null` InputStream getErrorStream() // 获取进程标准输出

    1.6K10

    抓取网页数据高级技巧:结合 Popen() 与 stdout 处理异步任务

    我们将参考爬虫代理提供服务,详细讲解如何在实际项目中集成这些技术。2. 异步任务必要性传统单线程爬虫由于需要依次等待每个请求返回,往往在面对大量网页数据时效率低下。...通过 Popen() 调用进程并结合 stdout 读取进程输出,可以实现异步爬虫优化。3....它能够启动进程,并通过 stdout 获取进程输出流,使得主进程可以在等待进程完成时继续处理其他任务。Popen() 方法支持异步操作,配合多线程或异步库,可以进一步提升爬虫并发性能。4....proxy_port}", url], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # 读取标准输出和错误输出...数据存储扩展:可以进一步将提取到新闻标题存储到数据库 MySQL 或 MongoDB),并结合分类和检索功能,实现大规模新闻数据管理和分析。8.

    15310

    Linux通过匿名管道进行进程间通信

    如果open_mode是”r”,主调用程序就可以使用被调用程序输出,通过函数返回FILE指针,就可以能过stdio函数(fread)来读取程序输出;如果open_mode是”w”,主调用程序就可以向被调用程序发送数据...,即通过stdio函数(fwrite)向被调用程序写数据,而被调用程序就可以在自己标准输入读取这些数据。...可见,进程读取了父进程写到filedes[1]数据,如果在父进程没有sleep语句,父进程可能在进程结束前结束,这样你可能将看到两个输入之间有一个命令提示符分隔。...四、把管道用作标准输入和标准输出 下面来介绍一种用管道来连接两个进程更简洁方法,我们可以把文件描述符设置为一个已知值,一般是标准输入0或标准输出1。...例子 在下面的例子,首先打开管道,然后fork一个进程,然后在进程,使标准输入指向读管道,然后关闭进程读管道和写管道,只留下标准输入,最后调用execlp函数来启动一个新进程od,但是

    1.3K21

    WindowsAPI 之 CreatePipe、CreateProcess

    比如一个控制台程序打印一行文字: 图片 会在windows弹出对话框输出: 图片 为什么会输出到这里而不是别的地方呢?因为这里就是所说StdOut(标准输出地方。...同时在创建进程时候,必须将进程标准输入句柄设置为父进程创建匿名管道时得到读管道句柄,将进程标准输出句柄设置为父进程创建匿名管道时得到写管道句柄。然后在进程就可以读写匿名管道了。...管道缓冲已满而数据还没有写 完,WriteFile()将要等到另一进程对管道数据读取以释放出更多可用空间后才能够返回。...在生成进程之前,父进程首先调用Win32 API SetStdHandle()使进程、父进程可共用标准输入、标准输出标准错误句柄(StdOut、StdIn、StdErr)。...当父进程进程发送数据时,用SetStdHandle()将 管道读句柄赋予标准输入句柄(这样就不会从标准输入读入数据,而从读句柄所表示位置读取数据);在从子进程接收数据时,则用SetStdHandle

    4K10

    一起学Excel专业开发24:使用类模块创建对象3

    图1 2.自定义集合没有默认属性,因此不能使用标准集合语法gclsCells(1)来简化Item属性,在访问集合成员时,必须显示地指定Item属性。...解决方法 方法1:使用Visual Basic 6 在VB6,可以指定一个属性为某个类默认属性。...步骤1:在Excel VBE,将CCells类模块导出,导出文件名为CCells.cls。 步骤2:在VB6打开CCells.cls。...步骤3:将鼠标放置在Item属性过程任何地方,单击菜单“工具——过程属性”。 步骤4:在“过程属性”对话框,单击“高级”按钮,选择“过程标识符”组合框“(缺省)项,如下图2所示。...步骤7:将CCells.cls导回到Excel VBE。此时,在VB6对该类模块所作修改生效。 方法2:使用文本编辑器 如果没有安装VB6,可以通过文本编辑器记事本来创建这些过程及其属性。

    93620

    听GPT 讲Rust源代码--librarystd(3)

    它定义了一些结构体、枚举和特性,用于处理进程、命令、输入输出等。 下面详细介绍各个结构体和特性作用: Child:表示进程。它包含了进程相关信息,进程ID、状态等。...还提供了方法来操作进程等待进程退出、杀死进程等。 ChildStdin:表示进程标准输入流。它可以用于向进程发送数据。 ChildStdout:表示进程标准输出流。...它可以用于读取进程输出数据。 ChildStderr:表示进程标准错误流。它可以用于读取进程输出错误信息。 Command:表示执行命令。...Output:表示进程执行结果。它包含了进程输出、错误信息以及退出状态等。 Stdio(imp::Stdio):表示标准输入、标准输出标准错误流配置。...它们可以被其他Rust代码使用,以实现对标准输入、标准输出标准错误输出读取和写入操作。

    18030

    进程通信--管道

    接着创建进程进程会继承父进程打开文件,也就是继承父进程文件描述符表,此时父子进程就会共享同一个文件资源,进程可以通过4号文件描述符向文件中进行写入,父进程就可以通过3号文件描述符从文件中进程读取...进程会默认打开三个标准输入标准输出:0,1,2…如何默认打开0,1,2? 所有的,命令都是bash进程,只要bash打开了,默认进程就都打开了。...pipefd[0] 和 pipefd[1] 值 return 0; } 上述代码主要作用是演示如何在C++中使用 pipe() 函数创建管道,并进行简单错误处理和输出操作。...(rfd) 读取消息并输出到控制台 进程关闭不需要管道读取端 (pipefd[0]),调用 subProcessWrite() 发送消息,然后关闭写入端 (pipefd[1])。...当父进程需要某一个进程时候,只需要将信息传入对应管道写端,然后对应进程从管道读端读取数据。

    7010

    Python用subprocessPopen来调用系统命令

    可是这两个命令过于简单,不能完毕一些复杂操作,给执行命令提供输入或者读取命令输出,推断该命令执行状态,管理多个命令并行等等。...參数stdin, stdout, stderr分别表示程序标准输入、输出、错误句柄。他们能够是PIPE,文件描写叙述符或文件对象,也能够设置为None,表示从父进程继承。...我们不能将close_fds设置为True同一时候重定向进程标准输入、输出与错误(stdin, stdout, stderr)。 假设參数shell设为true,程序将通过shell来运行。...表示与进程通信标准流。 subprocess.STDOUT 创建Popen对象时,用于初始化stderr參数,表示将错误通过标准输出输出。...Popen.communicate(input=None) 与进程进行交互。向stdin发送数据,或从stdout和stderr读取数据。可选參数input指定发送到进程參数。

    1.8K20

    python模块之subprocess类与常量

    stdin, stdout, stderr参数特殊值,意味着使用管道重定向输入输出 subprocess.STDOUT:可传递给stderr参数特殊值,表示重定向标准错误到标准输出 Popen 在一个新进程执行子程序...进程文件句柄继承自父进程。除此之外,stderr还可以是STDOUT,表示标准错误输出重定向到标准输出。 preexec_fn:限于POSIX系统,设置一个可调用对象,先于进程程序执行。...communicate(input=None, timeout=None):进程交互:发送数据到stdin,读取stdout或stderr数据知道读取到结束符。...如果为负数,表示进程因为某个信号退出 stdout:捕获进程标准输出,默认为byte类型,如果run()函数调用时指定了encoding或errors,或设置了text=True则为string类型...如果未捕获标准输出返回None stderr:捕获进程标准错误,默认为byte类型,如果run()函数调用时指定了encoding或errors,或设置了text=True则为string类型。

    2.5K10

    听GPT 讲Rust Cargo源代码(1)

    这个示例文件作用是演示如何在自定义凭据机制中将诊断输出输出到指定文件,而不是默认标准输出。...ProcessBuilder还提供了很多方法来配置进程行为,设置标准输入、标准输出和错误流重定向,设置进程工作目录等。...Running: 它是ProcessBuilder另一个结构,用于表示正在运行进程。Running提供了一些方法来管理运行进程等待进程运行结束、发送信号给进程等。...ProcessBuilder在Cargo源代码中广泛应用于执行各种命令行操作,编译源代码、运行测试、构建文档等。它提供了统一接口和一致方式来启动和管理进程,简化了进程操作和控制。...这样做好处是,使用者在调用Cargo工具时能够更方便地捕获和处理错误。 ProcessError结构体包含了以下几个字段: output: 表示执行进程返回输出信息,包括标准输出标准错误输出

    12010

    60秒问答:请问下面的程序一共输出多少个hello,world”

    【青铜:都知道】 还有一个很重要东西是,在fork()调用处,整个父进程空间会原模原样地复制到进程,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。【白银:别人知道我不知道】 2....P2进程 当i=0时:fork()产生一个进程P2,同时它自己输出一个'-'。P2继承P1诸如环境变量,P2首现会输出一个'-'。...P3进程 P3进程为P2进程,它会复制其父进程P2指令,变量值,程序调用栈,环境变量,缓冲区等,它会输出一个'-'。...P4 此时P1进入程序后,当i=1时,fork()产生另一个它进程P4,同时输出一个'-'。P4同样会输出一个'-'。 ? 相同颜色是同一个进程 ## 打印多少? ### 1....(键盘,直接相应中断) 这是因为printf(“-”);语句有buffer,所以,对于上述程序,printf(“-”);把“-”放到了缓存, 在fork时候,缓存被复制到了进程空间,所以,就多了两个

    1.4K40
    领券