【问题标题】: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 文件。您所要做的就是寻找该文件出现,并且您知道执行已完成。删除此文件并继续执行您的程序。