嗯,我确定它在那里,但我无法找到它..
我想要一个程序(来自Access VBA),然后等待它完成。有一些使用Shell的例子,但看起来像Shell,你必须传递可执行文件,而不仅仅是文件路径/名称。由于这将在多台机器上使用,我无法保证目标机器上的可执行文件(例如,设置了哪个pdf查看器),因此我想使用默认值。
我可以使用Shellexecute使用默认程序启动文件,但是我无法获得窗口句柄来运行等待例程。由于我需要运行多个外部部件,因此我需要等待每个部件完成才能启动下一部件。
因此。任何人都可以帮我理解如何让Shell使用默认程序或如何获取Shellexecute窗口的句柄或建议另一个API来完成我需要的所有部分?
谢谢 - 艾伦
答案 0 :(得分:4)
以下例程根据注册表中的关联以阻止模式打开文件:
Sub OpenFileAndWait(fullName As String)
CreateObject("WScript.Shell").Run """" & fullName & """", 3, True
End Sub
ps.1:param 3
在最大化窗口中打开文档,最后一个参数True
指定等待模式。用双引号括起文件的名称消除了包含" space"的名称的麻烦。用于命令解释器。
ps.2:
关于如何实现这一点已经有很多讨论,并且所提出的方法将您带到复杂的API,例如ShellExecuteEx
,CreateProcess
,WaitForSingleObject
等,每次使用不同的参数集和缺点。这些方法都不完整且令人满意:某些API(Shell
或CreateProcess
)需要指定可执行应用程序,而其他API(ShellExecute
或ShellExecuteEx
)可以使用文件关联,但唉,它们是非阻塞的,获取进程句柄以使用WaitForSingleObject
)非常复杂。