2017-09-20 3 views
0

クライアント(9.0 Social Edition)上で実行されるスケジュールされたLotusScriptエージェントがあります。その目的の1つは、Word文書を開いてPDFが、それは本当に重要ではありません。ここでは、関連するコードスニペットはWord.Application(Office 2016)オブジェクトLS。

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 

だ私がいる問題は、私たちがオフィス2016にアップグレードするので、時にはエージェントが終了したことがないということです。ログには「待っている、wrdAppをNothingに設定する」が表示されますが、「終了エージェント」は表示されません。私はWordのウィンドウを開いたままにしていますが(もちろんドキュメントはありません)、タスクマネージャを見ると、CPUが0%、CPU時間が2〜3秒のWINWORD.EXEが表示されています。もちろん、陰謀に追加するだけでも、毎回このようなことは起こりません。そしてエージェントは決して終わらないので、私がゾンビのWordのインスタンスを殺すまで、他のすべてのスケジュールされたエージェントは止まってしまいます。私は私が見つけることができるすべての提案を試みました(あなたは、私がWordを見えるようにして、VariantをQuitのパラメータとして使うことに気がつくでしょう、そして、私もdesparationからsleep(3)を投げました) 。私たちはOffice 2010でこの問題を抱えていませんでした(エージェントコードがはるかに悲しい場合でも)。また、Word文書を実際に開くかどうかにかかわらず、問題が発生する可能性があります。解決策はありますか?またはO2010の唯一のオプションに戻っていますか?

+0

単なるテスト:すべてのコードをInitialize Subに入れることができますか?私はTerminate Subでいくつかの悪い経験をしていましたが、コード終了前に終了しました... –

+0

これは私が少しリファクタリングしたコードです。これは、Initializeから呼び出されたサブルーチンでWordのインスタンスを設定および解除するために使用されました。私は問題を抱え始めたとき、私は(終了に関連していないという意味。)このようにそれを書き直したリファクタリングが役立つ(または傷つける)なかったが、問題を、私はそれがこの方法をより良い流れ方が好き。 – Duston

答えて

0

申し訳ありません。私は、WordとOpenOfficeの両方のファイルを透過的に扱えるラッパークラスを開発しました。その一部を以下で見つけることができます。私のクライアントからはコードがもはや機能しないという苦情は一度もありませんでしたが、テンプレートを使用してドキュメントを開いた後、そのドキュメントにデータを入力してからドキュメントを開いたままにしてライブラリを使用していることも原因です。

一見したところで1つの違い:私はあなたが終了している場所で閉じるを使用します。

- 文書

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

私は、ドキュメントオブジェクトに対して.closeを、アプリケーションオブジェクトに対して.quitを使用します。 – Duston

0

これがまだあなたと関連しているかどうかはわかりません。

私はあなたのやり方(年齢に合わせて、クラスでラップする)のように、Wordを使いました。しかし、私はまったく同じ問題を経験しています...

解決策は、ドキュメントを閉じた後でNOTHINGとなった後、WINWORDタスクがただ静かにバックグラウンドで終了します。

HTH /ジョン・

+0

フィードバックいただきありがとうございます。私が持っている問題の一つは、Wordがいつも始まるとは限らないということです。私はあきらめて原子力アプローチを取った。私は、15分ごとに実行されるスケジューラによって開始された.NET C#プログラムを作成しました。 WINWORD.EXEがすべて実行されていることが検出され、15分以上実行されている場合は、それが強制終了されます。私がそれを実装してから5日間で、19のインスタンスが殺されました。 – Duston

+0

Hmmm ...奇妙な...私はWordが起動していない問題はありませんでした。上記のアプローチはこれまでWordをやり直すという点でも完璧に機能しています:-) –

0

更新の方法として/この質問に答える、私は本当の答えを探してあきらめ、代わりに実行されているWINWORD.EXEの任意のインスタンスを探しますC#のプログラムを書きました15分以上経過してプロセスを終了します。その後、タスクスケジューラを使用して15分ごとにそのプログラムを実行します。それは粗悪で醜いですが、私が以前持っていた4アラームの火を出しました。

関連する問題