gpt4 book ai didi

windows - 如何在 VB6 中执行更多代码之前等待 shell 进程完成

转载 作者:可可西里 更新时间:2023-11-01 12:29:54 31 4
gpt4 key购买 nike

我有一个小型 VB6 应用程序,我在其中使用 Shell 命令来执行程序。我将程序的输出存储在一个文件中。然后我正在读取这个文件并使用 VB6 中的 msgbox 将输出放在屏幕上。

这就是我的代码现在的样子:

sCommand = "\evaluate.exe<test.txt "
Shell ("cmd.exe /c" & App.Path & sCommand)

MsgBox Text2String(App.Path & "\experiments\" & genname & "\freq")

问题是 VB 程序使用 msgbox 打印的输出是文件的旧状态。有什么方法可以在我的 shell 命令程序完成之前暂停 VB 代码的执行,以便我获得输出文件的正确状态而不是之前的状态?

最佳答案

执行此操作所需的秘诀是 WaitForSingleObject function ,它会阻止应用程序进程的执行,直到指定的进程完成(或超时)。它是 Windows API 的一部分,在您的代码中添加适当的声明后,可以轻松地从 VB 6 应用程序调用。

该声明看起来像这样:

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle _
As Long, ByVal dwMilliseconds As Long) As Long

它有两个参数:要等待的进程的句柄,以及指示要等待的最长时间的超时间隔(以毫秒为单位)。如果您未指定超时间隔(值为零),则该函数不会等待并立即返回。如果您指定无限超时间隔,则该函数在进程发出它已完成的信号时返回。

有了这些知识,剩下的唯一任务就是弄清楚如何处理您启动的流程。事实证明这非常简单,并且可以通过多种不同的方式完成:

  1. 一种可能性(以及我的做法)是使用 ShellExecuteEx function ,同样来自 Windows API,作为 VB 6 中内置的 Shell 函数的直接替代品。这个版本更加通用和强大,但使用适当的声明也很容易调用。

    它返回它创建的进程的句柄。您所要做的就是将该句柄作为 hHandle 参数传递给 WaitForSingleObject 函数,然后您就可以开始工作了。在您调用的进程终止之前,您的应用程序的执行将被阻止(暂停)。

  2. 另一种可能性是使用 CreateProcess function (再次来自 Windows API)。此函数在与调用进程(即您的 VB 6 应用程序)相同的安全上下文中创建一个新进程及其主线程。

    Microsoft 发布了一篇知识库文章,详细介绍了这种方法,甚至提供了完整的示例实现。您可以在此处找到该文章:How To Use a 32-Bit Application to Determine When a Shelled Process Ends .

  3. 最后,也许最简单的方法是利用内置 Shell 函数的返回值是应用程序任务 ID 这一事实。这是一个唯一的编号,用于标识您启动的程序,它可以传递给 OpenProcess function获取可传递给 WaitForSingleObject 函数的进程句柄。

    但是,这种方法的简单性确实是有代价的。一个非常重要的缺点是它会导致您的 VB 6 应用程序变得完全无响应。因为它不会处理 Windows 消息,所以不会响应用户交互,甚至不会重绘屏幕。

    好人在 VBnet在以下文章中提供了完整的示例代码:WaitForSingleObject: Determine when a Shelled App has Ended .
    我希望能够在此处重现代码以帮助避免链接失效(VB 6 已经好几年了;不能保证这些资源会永远存在),但是分发许可证在代码本身似乎明确禁止这样做。

关于windows - 如何在 VB6 中执行更多代码之前等待 shell 进程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5685972/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com