从excel运行外部程序的最佳方法是什么?它可能会运行几分钟.关于如何做到这一点的最佳实践是什么?理想的情况下,
一个模型对话框,让用户知道进程正在执行.
如果可执行文件失败,则用户应收到通知.
应该强制执行超时.
取消按钮应位于对话框中.
但欢迎任何最佳做法.我对调用.dll或.exe的解决方案感兴趣.最好是与Excel '03或更早版本一起使用的东西,但我也很想听到移动到更高版本的原因.
您应该查看这两篇Microsoft KB文章
如何从Visual Basic 和Visual Basic启动Win32应用程序
如何使用32位应用程序来确定外壳进程何时结束
他们都快速为您提供启动流程的框架,然后检查其完成情况.每篇知识库文章都有一些可能相关的其他参考文献.
后一篇知识库文章假设您希望等待无限量的时间让shell进程结束.
你可以修改ret&= WaitForSingleObject(proc.hProcess,INFINITE)函数调用,在一段有限的时间后以毫秒为单位返回 - 用表示毫秒的正值替换INFINITE并将整个事件包装在Do While循环中.返回值告诉您进程是否已完成或计时器是否已用完.如果过程结束,返回值将为零.
如果返回值非零,则进程仍在运行,但控制权将返回给您的应用程序.在此期间,您可以正确控制应用程序,可以确定是否更新某种UI状态,检查取消等.或者您可以再次循环并等待一些.
如果您正在炮击的程序是您编写的内容,甚至还有其他选项.您可以挂钩其中一个窗口并让程序发布消息,您可以将其附加到并用作状态反馈.如果您需要考虑它,最好留给单独的项目.
您可以使用流程结构从被调用的流程获取返回值.您的进程需要返回一个值才有用.
我对这种需求的一般方法是:
使用取消按钮在进程开始时为用户提供非模态状态对话框,单击该按钮将设置稍后要检查的标志.向用户提供任何状态很可能是不可能的,因此给他们一个经过时间或其中一个动画GIF可能有助于管理期望.
开始这个过程
等待该过程完成,每500ms进行一次取消检查
如果该过程完成,请关闭对话框并继续.
如果进程未完成,请查看用户是否单击取消,如果是,则向进程窗口发送关闭消息.这可能不起作用,可能需要终止该过程 - 如果您这样做,请小心.如果它不能正常关闭,你最好的选择可能是放弃这个过程.您还可以检查此时的超时,并尝试采用与用户点击取消相同的路径.
比尔希望这有帮助.