在任何语言中调用 Win32 ShellExecute 时,如何在 ShellExecute 完成之前停止程序执行?

When calling Win32 ShellExecute within ANY language, how can I stop program execution until ShellExecute is done?

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

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

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

解决方案是从正在执行的命令中创建一个 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 文件。你所要做的就是寻找这个文件出现,你就知道执行完成了。删除此文件并继续您的程序。