【问题标题】:Visual Basic: killing the process of an Application ObjectVisual Basic:终止应用程序对象的进程
【发布时间】:2013-08-07 15:42:40
【问题描述】:

在 Visual Basic 中,我创建一个应用程序对象并启动它:

gApp = New CANoe.Application
gMeasurement = gApp.Measurement
gApp.Open(arrArgs(0), False, False)
gMeasurement.Start()

应用程序完成数据处理后,可能会发生两种可能的情况:(i) 数据文件已损坏,并且(在正常情况下)会出现警报窗口,以及 (ii) 数据文件正常。在 (ii) 情况下,我可以使用 gApp.Quit() 完成应用程序。但是,如果 (i) gApp.Quit() 不起作用,因为程序需要用户输入(尽管通常我根本看不到窗口)。

问题1:如何比较gApp对应的流程?目前我正在以这种方式退出:

        For Each p As Process In Process.GetProcesses
            If p.ProcessName = "CANoe32" Then
                p.Kill()
            End If
        Next

通常这是一个糟糕的解决方案,因为可能会运行更多的 CANoe32 实例(尽管在这种特殊情况下,系统上只能运行此二进制文件的一个进程)。

问题 2 如果 gApp 有子窗口,那么退出 gApp 的更优雅的解决方案是什么?

任何cmets都非常有帮助

【问题讨论】:

  • 如果给定的程序没有响应(因为期望用户输入),你唯一能做的就是杀死它(就像你正在做的那样)。关于子窗口,它们由外部程序自己管理,因此在主程序关闭时也会关闭。
  • @varocarbas:非常感谢您的评论。检查天气有儿童窗户有多难?是否可以更好地获得Application 对应的Process(无需扫描整个系统进程列表?
  • 无法对这个问题给出一般性的答案。如前所述,子窗口由目标应用程序管理,因此它们的行为由它决定。仅当目标应用程序为每个子窗口创建一个新进程时,您才可以通过进程管理子窗口(例如:具有您打开的不同实例的 Excel);否则,您只能通过 gApp 访问它们(如果允许这样做)。总而言之,对于这类事情,您有两种选择:询问对此特定应用程序有经验的人或进行一些反复试验/测试。

标签: vba kill-process raiserror raiseevent


【解决方案1】:

一个可能的解决方案是使用类似于这张票的东西:

how-do-i-get-the-process-id-from-a-created-excel-application-object

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多