【问题标题】:Share Excel.Application executable among multiple WSF processes?在多个 WSF 进程之间共享 Excel.Application 可执行文件?
【发布时间】:2015-10-30 02:53:24
【问题描述】:

我有一个系统通过 WSF 启动大约 50 个 VBS 脚本,这些脚本需要留在那里直到系统的另一部分连接到它们,然后它们充当服务器一段时间,直到对等方断开连接,然后它们退出并获取重新启动。

出于初始化目的,它们都使用 EXCEL.EXE 从电子表格中读取大量参数,通过

Set objExcel = CreateObject("Excel.Application")

我们不能同时运行 50 个 EXCEL.EXE,因此重新启动是按顺序进行的,因此运行的 EXCEL.EXE 不应超过一个:通常为零,因为它们仅用于 15-20秒,然后释放。

但是,有时会出现问题,WSF 脚本退出,而它启动的 EXCEL.EXE 仍然存在。所以我们确实看到了多达十几个 EXCEL.EXE 进程。

我的问题是关于使用GetObject() 而不是CreateObject()。是否可以使用GetObject(),以便如果已经有一个 EXCEL.EXE 正在运行,它会使用那个而不是启动一个新的?如果需要,还需要哪些其他步骤?

这里还有一个补充问题,关于为什么 EXCEL.EXE 在启动它们的 VBS 退出后仍然存在,但我可以想象 VBS 可以退出(或被杀死)的方式来允许它。

请注意,这个问题也部分与 EXCEL.EXE 的重入有关,我对此一无所知。

我不是这些脚本的作者,而且就外部对象而言,我在 VBS 方面的能力不是很强,所以我完全有可能在这里问一个琐碎的问题。

【问题讨论】:

  • 你有没有看过How to use GetObject in VBScript,要获得正在运行的实例,你应该能够执行Set objExcel = GetObject( , "Excel.Application")之类的操作。
  • 这个问题有问题吗?有人吗?
  • 奇怪。也许有些人只是在标题中看到“Excel”,并且在没有正确阅读问题的情况下盲目(并且错误地)投反对票,理由是 Excel 与编程无关。但这只是一个猜测,我根本看不出这个问题有什么问题。

标签: windows excel vbscript activex wsh


【解决方案1】:

GetObject() 的用法记录在 this old KB article 中。创建第一个实例需要进行错误处理。像这样:

Dim excel
On Error Resume Next
Set excel = GetObject(, "Excel.Application")
If Err.number = 429 Then
   Set excel = CreateObject("Excel.Application")
End If
If Err.number <> 0 Then
    WScript.Echo "Could not start Excel: " & err.Description
    End
End If
'' etc

但是,看到僵尸 Excel.exe 进程幸存是一个广泛的问题,这强烈表明脚本运行时没有正常退出。也许您现有脚本中的错误处理不太理想,当您用多个脚本猛击单个实例时,这不太可能变得更好。当 Excel 跟不上时,它确实会变得非常暴躁。使用 OpenXML api 或 Excel Services 是更好的方法。

【讨论】:

  • 谢谢。僵尸是由于脚本在不方便的时间被杀死,这可能由于各种合理的原因而发生,在这里没有密切关系。
猜你喜欢
  • 2012-01-22
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2013-10-12
  • 2012-04-12
  • 2020-12-05
相关资源
最近更新 更多