【问题标题】:When calling Win32 ShellExecute within ANY language, how can I stop program execution until ShellExecute is done?在任何语言中调用 Win32 ShellExecute 时,如何在 ShellExecute 完成之前停止程序执行?
【发布时间】:2017-05-05 17:48:43
【问题描述】:

这个问题与关于 ShellExecute 的大多数问题相似,但有一个例外:我想使用 ShellExecute,因为它使用简单,并且可以从包括现已淘汰的 Visual FoxPro 在内的许多编程语言中用几行代码调用它。

现有的大多数解决方案都依赖于使用线程进行处理,寻找进程(如果它是一个通用的进程名称则不可靠)或使用起来更复杂的 ShellExecuteEx。我对其他解决方案不满意。

问题是我有一个文件操作需要几秒钟才能完成:解压缩档案。我怎么知道我已经完成了?

【问题讨论】:

    标签: command-line process shellexecute


    【解决方案1】:

    解决方案是在正在执行的命令中创建一个semaphore。这可以通过运行批处理文件来完成,但如果不需要,还有另一种方法可以使用 cmd.exe 使用单线处理它:

    ShellExecute(0, 'open', 'cmd.exe', '/c 7z.exe e Invoices.zip | find "Everything is Ok" > semaphore.txt', workingDirectory, 1)
    

    这个单行代码使用 CMD 将 7zip 的输出通过管道传输到 Find,它会查找指示完成的文本行。当然,如果有错误,这将失败。

    如果您没有等待的输出(用于管道进入 FIND),您可以使用 & echo 这样:

    ... & echo > semaphore.txt
    

    这会等到 ... 完成,然后将换行符回显到 semaphore.txt。

    最后,您的工作目录中会有一个 semaphore.txt 文件。您所要做的就是寻找该文件出现,并且您知道执行已完成。删除此文件并继续执行您的程序。

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多