【问题标题】:Word.Application (Office 2016) object .quit() method hanging in LSWord.Application (Office 2016) 对象 .quit() 方法挂在 LS
【发布时间】:2017-12-28 05:07:37
【问题描述】:

我有一个在客户端(9.0 社会版)上运行的预定 LotusScript 代理。其目的之一是打开 Word 文档并将其保存为 PDF,但这并不重要。下面是相关代码sn-p

Declarations
Dim wrdApp as Variant

Sub Initialize

[Getting the usual Notes Session, Database, View values]
    Set wrdApp = createObject("Word.Application")
    wrdApp.visible = True
starthere:
    'we check to see if there is anything that has been deferred
    Set v = db.GetView("RIT")
    strStatus = "Success"

    Set doc = v.Getfirstdocument()
    If (doc Is Nothing) Then Exit Sub
[Snip]
End Sub

Sub Terminate
    wrdApp.visible = True

    Dim quitCode As Variant
    quitCode = 0
    Call wrdApp.quit(quitCode)
    Print "Quit called, waiting 3 seconds"
' Wait a couple seconds
    Sleep(3)
    Print "Done waiting, setting wrdApp to Nothing"
    Set wrdApp=Nothing
    Print "Exiting agent"
End Sub

我遇到的问题是,自从我们升级到 Office 2016 后,有时代理永远不会终止。在日志中,我看到“等待完成,将 wrdApp 设置为 Nothing”,但没有看到“正在退出代理”。我将打开一个 Word 窗口(当然没有文档),当我查看任务管理器时,我看到一个 WINWORD.EXE 以 0% 的 CPU 和 2 或 3 秒的 CPU 时间运行。当然,只是为了增加阴谋,这也不是每次都会发生。由于代理永远不会结束,所有其他计划代理都会被阻止,直到我杀死僵尸 Word 实例。我已经尝试了我能找到的所有建议(你会注意到我使 Word 可见并使用 Variant 作为退出的参数,我什至出于绝望而投入了 sleep(3) ),但没有任何区别.我们在使用 Office 2010 时从未遇到过这个问题(即使代理代码更加草率)。此外,无论我是否实际打开 Word 文档,都可能发生此问题。有解决办法吗?还是回到 O2010 是唯一的选择?

【问题讨论】:

  • 只是一个测试:你能把你所有的代码都放在 Initialize Sub 中吗?我在代码结束之前终止了 Terminate Sub 有一些不好的经历......
  • 这是我重构了一下的代码。它用于在从 Initialize 调用的子例程中设置和拆除 Word 实例。当我开始遇到问题时,我以这种方式重写了它(这意味着它与 Terminate 无关。)虽然重构没有帮助(或伤害)问题,但我喜欢它以这种方式更好地流动。

标签: ms-office lotusscript


【解决方案1】:

抱歉耽搁了。我开发了一个包装类,可以“透明地”处理 Word 和 OpenOffice 文件。您将在下面找到其中的一部分。我的客户从来没有抱怨过代码不再有效,但这也可能是因为他们使用库使用模板打开文档,然后用数据填充文档,然后让文档保持打开状态。

乍一看有一个区别:我在你有 Quit 的地方使用 Close。

-- 打开一个文档

Function CreateMSWordDocument As Variant
    Dim msWord As Variant

    On Error Goto CreateNewInstance
    Set msWord = GetObject("", "Word.Application")
Done:
    Set CreateMSWordDocument = msWord
    Exit Function
CreateNewInstance:
    Print "Loading Microsoft Word.... Please Wait...."
    Err = 0
    Set msWord = CreateObject("Word.Application")
    Print "Microsoft Word Loaded"
    Resume Done
End Function

Set wdDoc= CreateMSWordDocument

-- 再次关闭它:

Sub Close
    Call wdDoc.Close
End Sub

我没有比上面更多的信息给你...

【讨论】:

  • 我在文档对象上使用 .close,在应用程序对象上使用 .quit。
【解决方案2】:

我不确定这是否仍然与您相关。

我已经像你一样使用 Word 很长时间了(只是将它包装在一个类中)。但是,我遇到了完全相同的问题...

解决方案是在我关闭文档后NOTHING - 然后 WINWORD 任务会在后台静默退出!

HTH /约翰

【讨论】:

  • 感谢您的反馈。我也遇到的问题之一是 Word 不会总是启动。我放弃并最终采用核方法。我编写了一个由每 15 分钟运行一次的调度程序启动的 .NET C# 程序。如果找到所有正在运行的 WINWORD.EXE,并且如果它已经运行超过 15 分钟,则将其杀死。在我实施它的 5 天里,它杀死了 19 个实例。
  • 嗯...奇怪...我没有任何关于 Word 无法启动的问题。到目前为止,上述方法在再次停止 Word 方面也完美无缺:-)
【解决方案3】:

作为更新/回答这个问题的一种方式,我放弃了寻找真正的答案,而是编写了一个 C# 程序来查找运行超过 15 分钟的任何 WINWORD.EXE 实例并终止该进程。然后我使用任务计划程序每 15 分钟启动一次该程序。它既粗鲁又丑陋,但它扑灭了我之前的 4 级火警。

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多