Word.Application(Office 2016)对象.quit()方法挂在LS中

问题描述 投票:0回答:3

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

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窗口(当然没有文件),当我查看任务管理器时,我看到一个运行0%CPU和2或3秒CPU时间的WINWORD.EXE。当然,只是为了增加阴谋,每次都不会发生这种情况。由于代理永远不会结束,所有其他预定的代理都会被阻止,直到我杀死僵尸Word实例。我已经尝试了所有我能找到的建议(你会注意到我使Word可见并使用Variant作为退出的参数,我甚至在睡眠(3)中退出了解压),但没有一个有任何区别。我们从未在Office 2010中遇到此问题(即使代理程序代码更加笨拙。)此外,无论我是否实际打开Word文档,都会出现问题。有解决方案吗?或者回到O2010唯一的选择?

ms-office lotusscript
3个回答
0
投票

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

乍一看有一点不同:我在你退出的地方使用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

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


0
投票

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

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

解决方案是在关闭文档后不做任何事情 - 然后WINWORD任务只是在后台静默退出!

HTH /约翰


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.